From patchwork Fri Dec 1 15:44:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 843552 X-Patchwork-Delegate: ian.stokes@intel.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.b="OeDH4JLb"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ypJWs5B5gz9ryk for ; Sat, 2 Dec 2017 02:45:45 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 09333C14; Fri, 1 Dec 2017 15:44:52 +0000 (UTC) X-Original-To: ovs-dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id F0B9ABF2 for ; Fri, 1 Dec 2017 15:44:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 140A74C5 for ; Fri, 1 Dec 2017 15:44:48 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20171201154445euoutp02273f7f4c756e0c116140d6575cb0c14a~8Nh-k8awg3158431584euoutp02k; Fri, 1 Dec 2017 15:44:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20171201154445euoutp02273f7f4c756e0c116140d6575cb0c14a~8Nh-k8awg3158431584euoutp02k DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1512143085; bh=090YdnurHgCx7WWVWnPzKOAUXDQGEx8fXhgLrv1ve0w=; h=From:To:Cc:Subject:Date:In-reply-to:References:From; b=OeDH4JLboTaMGuK4fMSBRsuVuygVSWgUGP2eMduRBJx6Mcn4Bw5BXuQ5jYwgOdjYx htMEsQZt/i2xIDKV3/TD15A1bULj3W4NvTq+wvo1/xk5YY9qwMhTn037HhgoYYdkWA uy90qbmk4xgCvGGQBcDuwsIEZrGyB3B/hOgpryrw= Received: from eusmges5.samsung.com (unknown [203.254.199.245]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171201154443eucas1p278c09dc1dbe2cf10dbb873214d464fd9~8Nh_IPJQb1819718197eucas1p28; Fri, 1 Dec 2017 15:44:43 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges5.samsung.com (EUCPMTA) with SMTP id 48.FD.12743.BE8712A5; Fri, 1 Dec 2017 15:44:43 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171201154443eucas1p2d360bc11b0554074efe3c0dd0e0dd771~8Nh9YAmQ21816418164eucas1p23; Fri, 1 Dec 2017 15:44:43 +0000 (GMT) X-AuditID: cbfec7f5-f79d06d0000031c7-47-5a2178eb54c3 Received: from eusync3.samsung.com ( [203.254.199.213]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 1C.72.18832.BE8712A5; Fri, 1 Dec 2017 15:44:43 +0000 (GMT) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0P0A00BWSH2B5A50@eusync3.samsung.com>; Fri, 01 Dec 2017 15:44:43 +0000 (GMT) From: Ilya Maximets To: ovs-dev@openvswitch.org, Bhanuprakash Bodireddy Date: Fri, 01 Dec 2017 18:44:27 +0300 Message-id: <1512143073-22347-2-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1512143073-22347-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrFIsWRmVeSWpSXmKPExsWy7djPc7qvKxSjDGY0aVms/sVpsfOZskVL /0xmiztXfrJZTPt8m93iSvtPdouND8+yWhz5fprRYu2hD+wWcz89Z3Tg8vj19Sqbx+I9L5k8 nt38z+jxfh+Q27dlFWMAaxSXTUpqTmZZapG+XQJXxrV/m9kKNuhUdH6xaGDsk+9i5OSQEDCR OLHmOiOELSZx4d56ti5GLg4hgaWMEu/vbmEHSQgJfGaUWHzTFqbhVtsUJoiiZYwSJ39uZoQo amaS2P1UD8RmE9CROLX6CFhcRCBC4sH3WewgDcwCp5kk3mxaxNzFyMEhLBAtsemeNkgNi4Cq xIvpD8DqeQXcJPqfPWCDWCYncfNcJ1g5p4C7xJHf4iBjJAQWsEmsP/GbCaLGRWLusb0sELaw xKvjEEdLCMhIdHYcZIJoaGaUaFh1iRHCmcAo8aV5OVS3vcSpm1fBbGYBPolJ26aDbZMQ4JXo aBOCKPGQ6Hk5gxXCdpToaoeYIyQwi1Hi9MWpbBMYpRcwMqxiFEktLc5NTy021StOzC0uzUvX S87P3cQIjOHT/45/3cG49JjVIUYBDkYlHl6GcMUoIdbEsuLK3EOMEhzMSiK8WSVAId6UxMqq 1KL8+KLSnNTiQ4zSHCxK4ry2UW2RQgLpiSWp2ampBalFMFkmDk6pBsbm96lsM2MnfViya15K t9ejp6nnYgWNDRTqVoleFNrOb3jfc0moidaZA7suP9AXubl0wt8FBrY6jHy32HltBeuZCi46 b4l1jo++/t9T4p3ZsZ37Vy7b3LPA56XV5xl3JQ4J3dqrwPg/5p9/TPOfOYG98ovWBFYl7X3P fGV1gMglhjRl7nPT0wOUWIozEg21mIuKEwGe9bPV3QIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrALMWRmVeSWpSXmKPExsVy+t/xq7qvKxSjDE6+Z7NY/YvTYuczZYuW /pnMFneu/GSzmPb5NrvFlfaf7BYbH55ltTjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKsYA1igum5TUnMyy1CJ9uwSujGv/NrMVbNCp6Pxi0cDYJ9/FyMkhIWAi cattChOELSZx4d56ti5GLg4hgSWMEg9Xt7JAOK1MEhOb/rKBVLEJ6EicWn2EEcQWEYiQaJmz nhGkiFngLJNE6+njYEXCAtES9988ZQexWQRUJV5MfwDWwCvgJtH/7AEbxDo5iZvnOpm7GDk4 OAXcJY78FgcJCwGV7N+9g3ECI+8CRoZVjCKppcW56bnFhnrFibnFpXnpesn5uZsYgeG27djP zTsYL20MPsQowMGoxMO7IkQxSog1say4MvcQowQHs5IIb1YJUIg3JbGyKrUoP76oNCe1+BCj NAeLkjhv757VkUIC6YklqdmpqQWpRTBZJg5OqQbG/iY1eR8dzwKxwpepUYlH5vzmLYg7GC1V fzFH74XPYgnBmPtpv2LiPs/J+tTm8IS50MEnXeyaarVXQs7hyP4vHPemqqi/a9ik9ii18lyf Vncwz5RtMy0zmkr1TzzSPWxYLzD9Ae/24/l57RpqlzKK18gbl73vZvzG8zL0SbyzGbfH4mmx TUosxRmJhlrMRcWJAKZDr48zAgAA X-CMS-MailID: 20171201154443eucas1p2d360bc11b0554074efe3c0dd0e0dd771 X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20171201154443eucas1p2d360bc11b0554074efe3c0dd0e0dd771 X-RootMTR: 20171201154443eucas1p2d360bc11b0554074efe3c0dd0e0dd771 References: <1512143073-22347-1-git-send-email-i.maximets@samsung.com> X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Heetae Ahn , Ilya Maximets Subject: [ovs-dev] [PATCH v6 1/7] dpif-netdev: Refactor PMD thread structure for further extension. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org This is preparation for 'struct dp_netdev_pmd_thread' modification in upcoming commits. Needed to avoid reordering and regrouping while replacing old and adding new members. Signed-off-by: Bhanuprakash Bodireddy Co-authored-by: Bhanuprakash Bodireddy Signed-off-by: Ilya Maximets --- lib/dpif-netdev.c | 65 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 0a62630..7a7c6ce 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -549,29 +549,22 @@ struct tx_port { struct dp_netdev_pmd_thread { PADDED_MEMBERS_CACHELINE_MARKER(CACHE_LINE_SIZE, cacheline0, struct dp_netdev *dp; - struct cmap_node node; /* In 'dp->poll_threads'. */ - pthread_cond_t cond; /* For synchronizing pmd thread - reload. */ + struct cmap_node node; /* In 'dp->poll_threads'. */ + pthread_cond_t cond; /* For synchronizing pmd thread reload. */ ); PADDED_MEMBERS_CACHELINE_MARKER(CACHE_LINE_SIZE, cacheline1, struct ovs_mutex cond_mutex; /* Mutex for condition variable. */ pthread_t thread; - unsigned core_id; /* CPU core id of this pmd thread. */ - int numa_id; /* numa node id of this pmd thread. */ ); /* Per thread exact-match cache. Note, the instance for cpu core * NON_PMD_CORE_ID can be accessed by multiple threads, and thusly * need to be protected by 'non_pmd_mutex'. Every other instance * will only be accessed by its own pmd thread. */ - OVS_ALIGNED_VAR(CACHE_LINE_SIZE) struct emc_cache flow_cache; - struct ovs_refcount ref_cnt; /* Every reference must be refcount'ed. */ - - /* Queue id used by this pmd thread to send packets on all netdevs if - * XPS disabled for this netdev. All static_tx_qid's are unique and less - * than 'cmap_count(dp->poll_threads)'. */ - uint32_t static_tx_qid; + PADDED_MEMBERS(CACHE_LINE_SIZE, + OVS_ALIGNED_VAR(CACHE_LINE_SIZE) struct emc_cache flow_cache; + ); /* Flow-Table and classifiers * @@ -579,7 +572,10 @@ struct dp_netdev_pmd_thread { * changes to 'classifiers' must be made while still holding the * 'flow_mutex'. */ - struct ovs_mutex flow_mutex; + PADDED_MEMBERS(CACHE_LINE_SIZE, + struct ovs_mutex flow_mutex; + /* 8 pad bytes. */ + ); PADDED_MEMBERS(CACHE_LINE_SIZE, struct cmap flow_table OVS_GUARDED; /* Flow table. */ @@ -596,35 +592,50 @@ struct dp_netdev_pmd_thread { /* Used to count cycles. See 'cycles_counter_end()'. */ unsigned long long last_cycles; - struct latch exit_latch; /* For terminating the pmd thread. */ - ); + /* 8 pad bytes. */ + ); PADDED_MEMBERS(CACHE_LINE_SIZE, /* Statistics. */ struct dp_netdev_pmd_stats stats; + /* 8 pad bytes. */ + ); + PADDED_MEMBERS(CACHE_LINE_SIZE, + struct latch exit_latch; /* For terminating the pmd thread. */ struct seq *reload_seq; uint64_t last_reload_seq; - atomic_bool reload; /* Do we need to reload ports? */ - bool isolated; - + atomic_bool reload; /* Do we need to reload ports? */ /* Set to true if the pmd thread needs to be reloaded. */ bool need_reload; - /* 5 pad bytes. */ + bool isolated; + + struct ovs_refcount ref_cnt; /* Every reference must be refcount'ed. */ + + /* Queue id used by this pmd thread to send packets on all netdevs if + * XPS disabled for this netdev. All static_tx_qid's are unique and + * less than 'cmap_count(dp->poll_threads)'. */ + uint32_t static_tx_qid; + + unsigned core_id; /* CPU core id of this pmd thread. */ + int numa_id; /* numa node id of this pmd thread. */ + + /* 20 pad bytes. */ ); PADDED_MEMBERS(CACHE_LINE_SIZE, - struct ovs_mutex port_mutex; /* Mutex for 'poll_list' - and 'tx_ports'. */ - /* 16 pad bytes. */ + /* Mutex for 'poll_list' and 'tx_ports'. */ + struct ovs_mutex port_mutex; ); + PADDED_MEMBERS(CACHE_LINE_SIZE, /* List of rx queues to poll. */ struct hmap poll_list OVS_GUARDED; - /* Map of 'tx_port's used for transmission. Written by the main - * thread, read by the pmd thread. */ + /* Map of 'tx_port's used for transmission. + * Written by the main thread, read by the pmd thread. */ struct hmap tx_ports OVS_GUARDED; ); + PADDED_MEMBERS(CACHE_LINE_SIZE, /* These are thread-local copies of 'tx_ports'. One contains only * tunnel ports (that support push_tunnel/pop_tunnel), the other @@ -648,9 +659,13 @@ struct dp_netdev_pmd_thread { * values and subtracts them from 'stats' and 'cycles' before * reporting to the user */ unsigned long long stats_zero[DP_N_STATS]; - uint64_t cycles_zero[PMD_N_CYCLES]; /* 8 pad bytes. */ ); + + PADDED_MEMBERS(CACHE_LINE_SIZE, + uint64_t cycles_zero[PMD_N_CYCLES]; + /* 48 pad bytes. */ + ); }; /* Interface to netdev-based datapath. */ From patchwork Fri Dec 1 15:44:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 843553 X-Patchwork-Delegate: ian.stokes@intel.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.b="o9RbaOMg"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ypJXq267yz9rvt for ; Sat, 2 Dec 2017 02:46:35 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id E3C2AC48; Fri, 1 Dec 2017 15:44:52 +0000 (UTC) X-Original-To: ovs-dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id D67EB727 for ; Fri, 1 Dec 2017 15:44:51 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 66E8347E for ; Fri, 1 Dec 2017 15:44:50 +0000 (UTC) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20171201154448euoutp014b10fcdb440529e80dd9ab236b5bf854~8NiCLjiij1298612986euoutp01e; Fri, 1 Dec 2017 15:44:48 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20171201154448euoutp014b10fcdb440529e80dd9ab236b5bf854~8NiCLjiij1298612986euoutp01e DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1512143088; bh=hQ/tVAFA9xw2A2fTJ6qq7Pv5crFDewh0fB5zITlEp2k=; h=From:To:Cc:Subject:Date:In-reply-to:References:From; b=o9RbaOMgVu2IpTF7lV2yWO1Zg7XpF/5kITa8pANHkkoOEOqprcxoX3bj6VmKOKXXz WV5tBqrmreFTLbfHgbuILIkUN21PQbj2FERk6dSGyk8rX5C9dKtB70SYzyxn97qlAC wZd83dvQCcDoPnsh4sLmgkKYBpD3+lXk/lvSJBUE= Received: from eusmges4.samsung.com (unknown [203.254.199.244]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171201154447eucas1p27358d0d6d7c2d9a50626fce0affb40fc~8NiBExU-X1816518165eucas1p2C; Fri, 1 Dec 2017 15:44:47 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges4.samsung.com (EUCPMTA) with SMTP id 99.30.30163.EE8712A5; Fri, 1 Dec 2017 15:44:46 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171201154446eucas1p2625b54269242f8e4f11a96cda7a1838c~8NiAZn5Nv1820118201eucas1p28; Fri, 1 Dec 2017 15:44:46 +0000 (GMT) X-AuditID: cbfec7f4-f790c6d0000075d3-c8-5a2178ee2f3d Received: from eusync3.samsung.com ( [203.254.199.213]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id AD.72.18832.EE8712A5; Fri, 1 Dec 2017 15:44:46 +0000 (GMT) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0P0A00BWSH2B5A50@eusync3.samsung.com>; Fri, 01 Dec 2017 15:44:46 +0000 (GMT) From: Ilya Maximets To: ovs-dev@openvswitch.org, Bhanuprakash Bodireddy Date: Fri, 01 Dec 2017 18:44:28 +0300 Message-id: <1512143073-22347-3-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1512143073-22347-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrHIsWRmVeSWpSXmKPExsWy7djPc7rvKhSjDE4vN7ZY/YvTYuczZYuW /pnMFneu/GSzmPb5NrvFlfaf7BYbH55ltTjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKsYA1igum5TUnMyy1CJ9uwSujIUzFzIWPJzJWDFnagN7A+PSnC5GTg4J AROJmW0dzBC2mMSFe+vZuhi5OIQEljJK/D3zignC+cwo8fvxNDaYjr+PLrJDJJYxSvxrO8YM 4TQzSWy6NIkRpIpNQEfi1OojYLaIQITEg++zwDqYBU4zSbzZtAhsobBAgMTiJR0sIDaLgKrE 1YtbwOK8Am4St9Y+YYJYJydx81wnUJyDg1PAXeLIb3GQORICK9gk3jYuhzrJReLFqZvsELaw xKvjW6BsGYnOjoNMEA3NjBINqy4xQjgTGCW+NC+H2mAvcermVTCbWYBPYtK26WDbJAR4JTra hCBKPCRmfl3OAhF2lDjQIQLx8SxGiTl/vrFNYJRewMiwilEktbQ4Nz212ESvODG3uDQvXS85 P3cTIzCWT/87/mUH4+JjVocYBTgYlXh4GcIVo4RYE8uKK3MPMUpwMCuJ8GaVAIV4UxIrq1KL 8uOLSnNSiw8xSnOwKInz2ka1RQoJpCeWpGanphakFsFkmTg4pRoYfT3nqartfXNQ/ufJ/8Hf 6zf6ix3asPzeiQnlVo1/Hj67ES/XnJyuENjDZ7fsrK99sduaYMvfvyct4Ki5bSF/YPEOoR2i dmttOzbG5k6e03OBi3PzBD6xxuuPP65Tutq6QvVJVU97vBZXbfW8PRf5dspFNb3+cT9DuKkt Yr9KxOzEs/OYDQROKbEUZyQaajEXFScCAPKSDF3hAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrELMWRmVeSWpSXmKPExsVy+t/xq7rvKhSjDOb1iFms/sVpsfOZskVL /0xmiztXfrJZTPt8m93iSvtPdouND8+yWhz5fprRYu2hD+wWcz89Z3Tg8vj19Sqbx+I9L5k8 nt38z+jxfh+Q27dlFWMAaxSXTUpqTmZZapG+XQJXxsKZCxkLHs5krJgztYG9gXFpThcjJ4eE gInE30cX2SFsMYkL99azdTFycQgJLGGUuDpvNiOE08okMat1JiNIFZuAjsSp1UfAbBGBCImW OevBipgFzjJJtJ4+zgaSEBbwk7h79jpYEYuAqsTVi1uYQWxeATeJW2ufMEGsk5O4ea4TKM7B wSngLnHktzhIWAioZP/uHYwTGHkXMDKsYhRJLS3OTc8tNtQrTswtLs1L10vOz93ECAy5bcd+ bt7BeGlj8CFGAQ5GJR7eFSGKUUKsiWXFlbmHGCU4mJVEeLNKgEK8KYmVValF+fFFpTmpxYcY pTlYlMR5e/esjhQSSE8sSc1OTS1ILYLJMnFwSjUwGv3K+JcdnusR/tctZZPm1y1vdIrL3Oy2 38vn3rr2j+/5PfcvPvXdUcKWztbwZOZ886NvlFSPXfix7PjaSJ6XN7bcnTT//pT9/ct1/s3Y tHSGmYG2VwRXAlPy48+bVbwUDs9d8OTxvuil3GHLc464eaq+tErLvb6bQ+2vcQ/PwSX2O/86 aD383qLEUpyRaKjFXFScCABEVHE5NQIAAA== X-CMS-MailID: 20171201154446eucas1p2625b54269242f8e4f11a96cda7a1838c X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20171201154446eucas1p2625b54269242f8e4f11a96cda7a1838c X-RootMTR: 20171201154446eucas1p2625b54269242f8e4f11a96cda7a1838c References: <1512143073-22347-1-git-send-email-i.maximets@samsung.com> X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Heetae Ahn , Ilya Maximets Subject: [ovs-dev] [PATCH v6 2/7] dpif-netdev: Keep latest measured time for PMD thread. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org In current implementation 'now' variable updated once on each receive cycle and passed through the whole datapath via function arguments. It'll be better to keep this variable inside PMD thread structure to be able to get it at any time. Such solution will save the stack memory and simplify possible modifications in current logic. This patch introduces new structure 'dp_netdev_pmd_thread_ctx' contained by 'struct dp_netdev_pmd_thread' to store any processing context of this PMD thread. For now, only time and cycles moved to that structure. Can be extended in the future. Signed-off-by: Ilya Maximets --- lib/dpif-netdev.c | 146 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 88 insertions(+), 58 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 7a7c6ce..90beea4 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -528,6 +528,17 @@ struct tx_port { struct hmap_node node; }; +/* A set of properties for the current processing loop that is not directly + * associated with the pmd thread itself, but with the packets being + * processed or the short-term system configuration (for example, time). + * Contained by struct dp_netdev_pmd_thread's 'ctx' member. */ +struct dp_netdev_pmd_thread_ctx { + /* Latest measured time. See 'pmd_thread_ctx_time_update()'. */ + long long now; + /* Used to count cycles. See 'cycles_count_end()' */ + unsigned long long last_cycles; +}; + /* PMD: Poll modes drivers. PMD accesses devices via polling to eliminate * the performance overhead of interrupt processing. Therefore netdev can * not implement rx-wait for these devices. dpif-netdev needs to poll @@ -590,10 +601,8 @@ struct dp_netdev_pmd_thread { /* Cycles counters */ struct dp_netdev_pmd_cycles cycles; - /* Used to count cycles. See 'cycles_counter_end()'. */ - unsigned long long last_cycles; - - /* 8 pad bytes. */ + /* Current context of the PMD thread. */ + struct dp_netdev_pmd_thread_ctx ctx; ); PADDED_MEMBERS(CACHE_LINE_SIZE, /* Statistics. */ @@ -694,8 +703,7 @@ static void dp_netdev_execute_actions(struct dp_netdev_pmd_thread *pmd, struct dp_packet_batch *, bool may_steal, const struct flow *flow, const struct nlattr *actions, - size_t actions_len, - long long now); + size_t actions_len); static void dp_netdev_input(struct dp_netdev_pmd_thread *, struct dp_packet_batch *, odp_port_t port_no); static void dp_netdev_recirculate(struct dp_netdev_pmd_thread *, @@ -755,9 +763,9 @@ static uint64_t dp_netdev_rxq_get_intrvl_cycles(struct dp_netdev_rxq *rx, unsigned idx); static void dpif_netdev_xps_revalidate_pmd(const struct dp_netdev_pmd_thread *pmd, - long long now, bool purge); + bool purge); static int dpif_netdev_xps_get_tx_qid(const struct dp_netdev_pmd_thread *pmd, - struct tx_port *tx, long long now); + struct tx_port *tx); static inline bool emc_entry_alive(struct emc_entry *ce); static void emc_clear_entry(struct emc_entry *ce); @@ -801,6 +809,28 @@ emc_cache_slow_sweep(struct emc_cache *flow_cache) flow_cache->sweep_idx = (flow_cache->sweep_idx + 1) & EM_FLOW_HASH_MASK; } +/* Updates the time in PMD threads context and should be called in three cases: + * + * 1. PMD structure initialization: + * - dp_netdev_configure_pmd() + * + * 2. Before processing of the new packet batch: + * - dpif_netdev_execute() + * - dp_netdev_input__() + * + * 3. At least once per polling iteration in main polling threads if no + * packets received on current iteration: + * - dpif_netdev_run() + * - pmd_thread_main() + * + * 'pmd->ctx.now' should be used without update in all other cases if possible. + */ +static inline void +pmd_thread_ctx_time_update(struct dp_netdev_pmd_thread *pmd) +{ + pmd->ctx.now = time_msec(); +} + /* Returns true if 'dpif' is a netdev or dummy dpif, false otherwise. */ bool dpif_is_netdev(const struct dpif *dpif) @@ -2949,6 +2979,9 @@ dpif_netdev_execute(struct dpif *dpif, struct dpif_execute *execute) ovs_mutex_lock(&dp->non_pmd_mutex); } + /* Update current time in PMD context. */ + pmd_thread_ctx_time_update(pmd); + /* The action processing expects the RSS hash to be valid, because * it's always initialized at the beginning of datapath processing. * In this case, though, 'execute->packet' may not have gone through @@ -2961,8 +2994,7 @@ dpif_netdev_execute(struct dpif *dpif, struct dpif_execute *execute) dp_packet_batch_init_packet(&pp, execute->packet); dp_netdev_execute_actions(pmd, &pp, false, execute->flow, - execute->actions, execute->actions_len, - time_msec()); + execute->actions, execute->actions_len); if (pmd->core_id == NON_PMD_CORE_ID) { ovs_mutex_unlock(&dp->non_pmd_mutex); @@ -3183,7 +3215,7 @@ cycles_count_start(struct dp_netdev_pmd_thread *pmd) OVS_ACQUIRES(&cycles_counter_fake_mutex) OVS_NO_THREAD_SAFETY_ANALYSIS { - pmd->last_cycles = cycles_counter(); + pmd->ctx.last_cycles = cycles_counter(); } /* Stop counting cycles and add them to the counter 'type' */ @@ -3193,7 +3225,7 @@ cycles_count_end(struct dp_netdev_pmd_thread *pmd, OVS_RELEASES(&cycles_counter_fake_mutex) OVS_NO_THREAD_SAFETY_ANALYSIS { - unsigned long long interval = cycles_counter() - pmd->last_cycles; + unsigned long long interval = cycles_counter() - pmd->ctx.last_cycles; non_atomic_ullong_add(&pmd->cycles.n[type], interval); } @@ -3206,8 +3238,8 @@ cycles_count_intermediate(struct dp_netdev_pmd_thread *pmd, OVS_NO_THREAD_SAFETY_ANALYSIS { unsigned long long new_cycles = cycles_counter(); - unsigned long long interval = new_cycles - pmd->last_cycles; - pmd->last_cycles = new_cycles; + unsigned long long interval = new_cycles - pmd->ctx.last_cycles; + pmd->ctx.last_cycles = new_cycles; non_atomic_ullong_add(&pmd->cycles.n[type], interval); if (rxq && (type == PMD_CYCLES_PROCESSING)) { @@ -3906,7 +3938,8 @@ dpif_netdev_run(struct dpif *dpif) } } cycles_count_end(non_pmd, PMD_CYCLES_IDLE); - dpif_netdev_xps_revalidate_pmd(non_pmd, time_msec(), false); + pmd_thread_ctx_time_update(non_pmd); + dpif_netdev_xps_revalidate_pmd(non_pmd, false); ovs_mutex_unlock(&dp->non_pmd_mutex); dp_netdev_pmd_unref(non_pmd); @@ -3957,7 +3990,7 @@ pmd_free_cached_ports(struct dp_netdev_pmd_thread *pmd) struct tx_port *tx_port_cached; /* Free all used tx queue ids. */ - dpif_netdev_xps_revalidate_pmd(pmd, 0, true); + dpif_netdev_xps_revalidate_pmd(pmd, true); HMAP_FOR_EACH_POP (tx_port_cached, node, &pmd->tnl_port_cache) { free(tx_port_cached); @@ -4099,6 +4132,9 @@ reload: lc = 0; coverage_try_clear(); + /* It's possible that the time was not updated on current + * iteration, if there were no received packets. */ + pmd_thread_ctx_time_update(pmd); dp_netdev_pmd_try_optimize(pmd, poll_list, poll_cnt); if (!ovsrcu_try_quiesce()) { emc_cache_slow_sweep(&pmd->flow_cache); @@ -4550,8 +4586,9 @@ dp_netdev_configure_pmd(struct dp_netdev_pmd_thread *pmd, struct dp_netdev *dp, ovs_mutex_init(&pmd->port_mutex); cmap_init(&pmd->flow_table); cmap_init(&pmd->classifiers); - pmd->next_optimization = time_msec() + DPCLS_OPTIMIZATION_INTERVAL; - pmd->rxq_next_cycle_store = time_msec() + PMD_RXQ_INTERVAL_LEN; + pmd_thread_ctx_time_update(pmd); + pmd->next_optimization = pmd->ctx.now + DPCLS_OPTIMIZATION_INTERVAL; + pmd->rxq_next_cycle_store = pmd->ctx.now + PMD_RXQ_INTERVAL_LEN; hmap_init(&pmd->poll_list); hmap_init(&pmd->tx_ports); hmap_init(&pmd->tnl_port_cache); @@ -4880,19 +4917,18 @@ packet_batch_per_flow_init(struct packet_batch_per_flow *batch, static inline void packet_batch_per_flow_execute(struct packet_batch_per_flow *batch, - struct dp_netdev_pmd_thread *pmd, - long long now) + struct dp_netdev_pmd_thread *pmd) { struct dp_netdev_actions *actions; struct dp_netdev_flow *flow = batch->flow; dp_netdev_flow_used(flow, batch->array.count, batch->byte_count, - batch->tcp_flags, now); + batch->tcp_flags, pmd->ctx.now); actions = dp_netdev_flow_get_actions(flow); dp_netdev_execute_actions(pmd, &batch->array, true, &flow->flow, - actions->actions, actions->size, now); + actions->actions, actions->size); } static inline void @@ -5000,7 +5036,7 @@ handle_packet_upcall(struct dp_netdev_pmd_thread *pmd, struct dp_packet *packet, const struct netdev_flow_key *key, struct ofpbuf *actions, struct ofpbuf *put_actions, - int *lost_cnt, long long now) + int *lost_cnt) { struct ofpbuf *add_actions; struct dp_packet_batch b; @@ -5039,7 +5075,7 @@ handle_packet_upcall(struct dp_netdev_pmd_thread *pmd, * we'll send the packet up twice. */ dp_packet_batch_init_packet(&b, packet); dp_netdev_execute_actions(pmd, &b, true, &match.flow, - actions->data, actions->size, now); + actions->data, actions->size); add_actions = put_actions->size ? put_actions : actions; if (OVS_LIKELY(error != ENOSPC)) { @@ -5067,9 +5103,9 @@ static inline void fast_path_processing(struct dp_netdev_pmd_thread *pmd, struct dp_packet_batch *packets_, struct netdev_flow_key *keys, - struct packet_batch_per_flow batches[], size_t *n_batches, - odp_port_t in_port, - long long now) + struct packet_batch_per_flow batches[], + size_t *n_batches, + odp_port_t in_port) { const size_t cnt = dp_packet_batch_size(packets_); #if !defined(__CHECKER__) && !defined(_WIN32) @@ -5126,7 +5162,7 @@ fast_path_processing(struct dp_netdev_pmd_thread *pmd, miss_cnt++; handle_packet_upcall(pmd, packet, &keys[i], &actions, - &put_actions, &lost_cnt, now); + &put_actions, &lost_cnt); } ofpbuf_uninit(&actions); @@ -5179,18 +5215,19 @@ dp_netdev_input__(struct dp_netdev_pmd_thread *pmd, OVS_ALIGNED_VAR(CACHE_LINE_SIZE) struct netdev_flow_key keys[PKT_ARRAY_SIZE]; struct packet_batch_per_flow batches[PKT_ARRAY_SIZE]; - long long now = time_msec(); size_t n_batches; odp_port_t in_port; + pmd_thread_ctx_time_update(pmd); + n_batches = 0; emc_processing(pmd, packets, keys, batches, &n_batches, md_is_valid, port_no); if (!dp_packet_batch_is_empty(packets)) { /* Get ingress port from first packet's metadata. */ in_port = packets->packets[0]->md.in_port.odp_port; - fast_path_processing(pmd, packets, keys, batches, &n_batches, - in_port, now); + fast_path_processing(pmd, packets, keys, + batches, &n_batches, in_port); } /* All the flow batches need to be reset before any call to @@ -5208,7 +5245,7 @@ dp_netdev_input__(struct dp_netdev_pmd_thread *pmd, } for (i = 0; i < n_batches; i++) { - packet_batch_per_flow_execute(&batches[i], pmd, now); + packet_batch_per_flow_execute(&batches[i], pmd); } } @@ -5229,7 +5266,6 @@ dp_netdev_recirculate(struct dp_netdev_pmd_thread *pmd, struct dp_netdev_execute_aux { struct dp_netdev_pmd_thread *pmd; - long long now; const struct flow *flow; }; @@ -5253,7 +5289,7 @@ dpif_netdev_register_upcall_cb(struct dpif *dpif, upcall_callback *cb, static void dpif_netdev_xps_revalidate_pmd(const struct dp_netdev_pmd_thread *pmd, - long long now, bool purge) + bool purge) { struct tx_port *tx; struct dp_netdev_port *port; @@ -5263,7 +5299,7 @@ dpif_netdev_xps_revalidate_pmd(const struct dp_netdev_pmd_thread *pmd, if (!tx->port->dynamic_txqs) { continue; } - interval = now - tx->last_used; + interval = pmd->ctx.now - tx->last_used; if (tx->qid >= 0 && (purge || interval >= XPS_TIMEOUT_MS)) { port = tx->port; ovs_mutex_lock(&port->txq_used_mutex); @@ -5276,18 +5312,14 @@ dpif_netdev_xps_revalidate_pmd(const struct dp_netdev_pmd_thread *pmd, static int dpif_netdev_xps_get_tx_qid(const struct dp_netdev_pmd_thread *pmd, - struct tx_port *tx, long long now) + struct tx_port *tx) { struct dp_netdev_port *port; long long interval; int i, min_cnt, min_qid; - if (OVS_UNLIKELY(!now)) { - now = time_msec(); - } - - interval = now - tx->last_used; - tx->last_used = now; + interval = pmd->ctx.now - tx->last_used; + tx->last_used = pmd->ctx.now; if (OVS_LIKELY(tx->qid >= 0 && interval < XPS_TIMEOUT_MS)) { return tx->qid; @@ -5315,7 +5347,7 @@ dpif_netdev_xps_get_tx_qid(const struct dp_netdev_pmd_thread *pmd, ovs_mutex_unlock(&port->txq_used_mutex); - dpif_netdev_xps_revalidate_pmd(pmd, now, false); + dpif_netdev_xps_revalidate_pmd(pmd, false); VLOG_DBG("Core %d: New TX queue ID %d for port \'%s\'.", pmd->core_id, tx->qid, netdev_get_name(tx->port->netdev)); @@ -5366,7 +5398,7 @@ dp_execute_userspace_action(struct dp_netdev_pmd_thread *pmd, struct dp_packet *packet, bool may_steal, struct flow *flow, ovs_u128 *ufid, struct ofpbuf *actions, - const struct nlattr *userdata, long long now) + const struct nlattr *userdata) { struct dp_packet_batch b; int error; @@ -5379,7 +5411,7 @@ dp_execute_userspace_action(struct dp_netdev_pmd_thread *pmd, if (!error || error == ENOSPC) { dp_packet_batch_init_packet(&b, packet); dp_netdev_execute_actions(pmd, &b, may_steal, flow, - actions->data, actions->size, now); + actions->data, actions->size); } else if (may_steal) { dp_packet_delete(packet); } @@ -5395,7 +5427,6 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_, struct dp_netdev_pmd_thread *pmd = aux->pmd; struct dp_netdev *dp = pmd->dp; int type = nl_attr_type(a); - long long now = aux->now; struct tx_port *p; switch ((enum ovs_action_attr)type) { @@ -5407,7 +5438,7 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_, dynamic_txqs = p->port->dynamic_txqs; if (dynamic_txqs) { - tx_qid = dpif_netdev_xps_get_tx_qid(pmd, p, now); + tx_qid = dpif_netdev_xps_get_tx_qid(pmd, p); } else { tx_qid = pmd->static_tx_qid; } @@ -5490,7 +5521,7 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_, flow_extract(packet, &flow); dpif_flow_hash(dp->dpif, &flow, sizeof flow, &ufid); dp_execute_userspace_action(pmd, packet, may_steal, &flow, - &ufid, &actions, userdata, now); + &ufid, &actions, userdata); } if (clone) { @@ -5651,13 +5682,13 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_, conntrack_execute(&dp->conntrack, packets_, aux->flow->dl_type, force, commit, zone, setmark, setlabel, helper, - nat_action_info_ref, now); + nat_action_info_ref, pmd->ctx.now); break; } case OVS_ACTION_ATTR_METER: dp_netdev_run_meter(pmd->dp, packets_, nl_attr_get_u32(a), - time_msec()); + pmd->ctx.now); break; case OVS_ACTION_ATTR_PUSH_VLAN: @@ -5686,10 +5717,9 @@ static void dp_netdev_execute_actions(struct dp_netdev_pmd_thread *pmd, struct dp_packet_batch *packets, bool may_steal, const struct flow *flow, - const struct nlattr *actions, size_t actions_len, - long long now) + const struct nlattr *actions, size_t actions_len) { - struct dp_netdev_execute_aux aux = { pmd, now, flow }; + struct dp_netdev_execute_aux aux = { pmd, flow }; odp_execute_actions(&aux, packets, may_steal, actions, actions_len, dp_execute_cb); @@ -6016,9 +6046,8 @@ dp_netdev_pmd_try_optimize(struct dp_netdev_pmd_thread *pmd, struct polled_queue *poll_list, int poll_cnt) { struct dpcls *cls; - long long int now = time_msec(); - if (now > pmd->rxq_next_cycle_store) { + if (pmd->ctx.now > pmd->rxq_next_cycle_store) { /* Get the cycles that were used to process each queue and store. */ for (unsigned i = 0; i < poll_cnt; i++) { uint64_t rxq_cyc_curr = dp_netdev_rxq_get_cycles(poll_list[i].rxq, @@ -6028,10 +6057,10 @@ dp_netdev_pmd_try_optimize(struct dp_netdev_pmd_thread *pmd, 0); } /* Start new measuring interval */ - pmd->rxq_next_cycle_store = now + PMD_RXQ_INTERVAL_LEN; + pmd->rxq_next_cycle_store = pmd->ctx.now + PMD_RXQ_INTERVAL_LEN; } - if (now > pmd->next_optimization) { + if (pmd->ctx.now > pmd->next_optimization) { /* Try to obtain the flow lock to block out revalidator threads. * If not possible, just try next time. */ if (!ovs_mutex_trylock(&pmd->flow_mutex)) { @@ -6041,7 +6070,8 @@ dp_netdev_pmd_try_optimize(struct dp_netdev_pmd_thread *pmd, } ovs_mutex_unlock(&pmd->flow_mutex); /* Start new measuring interval */ - pmd->next_optimization = now + DPCLS_OPTIMIZATION_INTERVAL; + pmd->next_optimization = pmd->ctx.now + + DPCLS_OPTIMIZATION_INTERVAL; } } } From patchwork Fri Dec 1 15:44:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 843554 X-Patchwork-Delegate: ian.stokes@intel.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.b="YcDF/J6i"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ypJYy1HKXz9s03 for ; Sat, 2 Dec 2017 02:47:34 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 2CA63C7C; Fri, 1 Dec 2017 15:44:55 +0000 (UTC) X-Original-To: ovs-dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id C7685C77 for ; Fri, 1 Dec 2017 15:44:53 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 28DFC496 for ; Fri, 1 Dec 2017 15:44:53 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20171201154450euoutp023c885e5c4a25b5eee4cf96d62c9ee743~8NiEqQKGF3160831608euoutp02k; Fri, 1 Dec 2017 15:44:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20171201154450euoutp023c885e5c4a25b5eee4cf96d62c9ee743~8NiEqQKGF3160831608euoutp02k DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1512143091; bh=rnw7yQo8WUth8cRzRw4N0B6CyDJBWErwy7OSn6wmGOs=; h=From:To:Cc:Subject:Date:In-reply-to:References:From; b=YcDF/J6i1baE1jy+403mwSZqJWyGaiiYc0x782vtIoo2URFOJwbZdzThmzX+Ho37M GSlSKaDWYF5V9dNr8i6mS+O2loOdN6w7O7g5bllR8BGnPit8pIVzFOM8yLbHSekLGk 3ue2osZmYt2dLGQIWVOIfqtinjfnuuIwDfqgRM1g= Received: from eusmges5.samsung.com (unknown [203.254.199.245]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171201154449eucas1p27aedb2e15de7d5a6bd5c3732b6efb806~8NiDpObHv1816418164eucas1p24; Fri, 1 Dec 2017 15:44:49 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges5.samsung.com (EUCPMTA) with SMTP id 79.FD.12743.1F8712A5; Fri, 1 Dec 2017 15:44:49 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20171201154449eucas1p162106056d97e8ed1d7dc0eeb859024d2~8NiC-nrr21690516905eucas1p1A; Fri, 1 Dec 2017 15:44:49 +0000 (GMT) X-AuditID: cbfec7f5-f79d06d0000031c7-50-5a2178f1e573 Received: from eusync3.samsung.com ( [203.254.199.213]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id CC.B0.20118.1F8712A5; Fri, 1 Dec 2017 15:44:49 +0000 (GMT) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0P0A00BWSH2B5A50@eusync3.samsung.com>; Fri, 01 Dec 2017 15:44:49 +0000 (GMT) From: Ilya Maximets To: ovs-dev@openvswitch.org, Bhanuprakash Bodireddy Date: Fri, 01 Dec 2017 18:44:29 +0300 Message-id: <1512143073-22347-4-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1512143073-22347-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrDIsWRmVeSWpSXmKPExsWy7djP87ofKxSjDHZNV7VY/YvTYuczZYuW /pnMFneu/GSzmPb5NrvFlfaf7BYbH55ltTjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKsYA1igum5TUnMyy1CJ9uwSujP/vXrMXrDWvODrvLmsD43aNLkZODgkB E4kJv1vZIGwxiQv31gPZXBxCAksZJV403GeEcD4zSpze94ANpmPnpQWsEIlljBJ3n8xnh3Ca mST27vvABFLFJqAjcWr1EUYQW0QgQuLB91lgRcwCp5kk3mxaxAySEBawkbi/5BuQzcHBIqAq seNyDUiYV8BN4sGTI6wQ2+Qkbp7rBCvhFHCXOPJbHGSMhMASNom9R++AxSUEXCSenOODKBeW eHV8CzuELSNxeXI3C0R9M6NEw6pLjBDOBEaJL83LmSCq7CVO3bwKZjML8ElM2jYdaiivREeb EESJh8TLpd9ZIGxHicvz10HDaBajxMwXj1knMEovYGRYxSiSWlqcm55abKpXnJhbXJqXrpec n7uJERjHp/8d/7qDcekxq0OMAhyMSjy8DOGKUUKsiWXFlbmHGCU4mJVEeLNKgEK8KYmVValF +fFFpTmpxYcYpTlYlMR5baPaIoUE0hNLUrNTUwtSi2CyTBycUg2MR7rdXz9aZmu07vncTZc5 Q+9d3Px1EudaDq0za9sWvrhuNysgR//YE+mu7GjZdRVfe2dZlWxT/NjDy/rrkKaG2p0Z3B3R y5wMjKYasi6Qjk7MNhL45WfnLOJ+rqPk45K7pyYdeCLgzsW1uShc8vaKlkNRYWwXPQ4nX1is KC/99VSUwRcDzRUsSizFGYmGWsxFxYkAwK4AaN8CAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprPLMWRmVeSWpSXmKPExsVy+t/xq7ofKxSjDJ7M5rRY/YvTYuczZYuW /pnMFneu/GSzmPb5NrvFlfaf7BYbH55ltTjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKsYA1igum5TUnMyy1CJ9uwSujP/vXrMXrDWvODrvLmsD43aNLkZODgkB E4mdlxawQthiEhfurWfrYuTiEBJYwijx/tlUZpCEkEArk8Tv/fkgNpuAjsSp1UcYQWwRgQiJ ljnrGUEamAXOMkm0nj7OBpIQFrCRuL/kG1AzBweLgKrEjss1IGFeATeJB0+OQC2Tk7h5rhOs hFPAXeLIb3GIVW4S+3fvYJzAyLuAkWEVo0hqaXFuem6xkV5xYm5xaV66XnJ+7iZGYLBtO/Zz yw7GrnfBhxgFOBiVeHgZwhWjhFgTy4orcw8xSnAwK4nwZpUAhXhTEiurUovy44tKc1KLDzFK c7AoifP27lkdKSSQnliSmp2aWpBaBJNl4uCUamDUqY19xBt7M+RtT44Zr7x612lZX+u1/vvm bfPgKE65JaopyX/cvUjqj5287bnlQa/achd7JnI43GeSjX4oxJa/t3l/yLdZkp9MSmzWLdHm v244y7eDb7PiFY51tfzdl8JeFQdvKn1/W77rLfOLzyc0GSaGSx54fI9pR97lU+c2zluvp8C5 rEOJpTgj0VCLuag4EQCaZElZMgIAAA== X-CMS-MailID: 20171201154449eucas1p162106056d97e8ed1d7dc0eeb859024d2 X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20171201154449eucas1p162106056d97e8ed1d7dc0eeb859024d2 X-RootMTR: 20171201154449eucas1p162106056d97e8ed1d7dc0eeb859024d2 References: <1512143073-22347-1-git-send-email-i.maximets@samsung.com> X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Heetae Ahn , Ilya Maximets Subject: [ovs-dev] [PATCH v6 3/7] dpif-netdev: Output packet batching. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org While processing incoming batch of packets they are scattered across many per-flow batches and sent separately. This becomes an issue while using more than a few flows. For example if we have balanced-tcp OvS bonding with 2 ports there will be 256 datapath internal flows for each dp_hash pattern. This will lead to scattering of a single recieved batch across all of that 256 per-flow batches and invoking send for each packet separately. This behaviour greatly degrades overall performance of netdev_send because of inability to use advantages of vectorized transmit functions. But the half (if 2 ports in bonding) of datapath flows will have the same output actions. This means that we can collect them in a single place back and send at once using single call to netdev_send. This patch introduces per-port packet batch for output packets for that purpose. 'output_pkts' batch is thread local and located in send port cache. Signed-off-by: Ilya Maximets --- lib/dpif-netdev.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 12 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 90beea4..f124bf8 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -526,6 +526,7 @@ struct tx_port { int qid; long long last_used; struct hmap_node node; + struct dp_packet_batch output_pkts; }; /* A set of properties for the current processing loop that is not directly @@ -739,6 +740,9 @@ static void dp_netdev_add_rxq_to_pmd(struct dp_netdev_pmd_thread *pmd, static void dp_netdev_del_rxq_from_pmd(struct dp_netdev_pmd_thread *pmd, struct rxq_poll *poll) OVS_REQUIRES(pmd->port_mutex); +static void +dp_netdev_pmd_flush_output_packets(struct dp_netdev_pmd_thread *pmd); + static void reconfigure_datapath(struct dp_netdev *dp) OVS_REQUIRES(dp->port_mutex); static bool dp_netdev_pmd_try_ref(struct dp_netdev_pmd_thread *pmd); @@ -816,7 +820,7 @@ emc_cache_slow_sweep(struct emc_cache *flow_cache) * * 2. Before processing of the new packet batch: * - dpif_netdev_execute() - * - dp_netdev_input__() + * - dp_netdev_process_rxq_port() * * 3. At least once per polling iteration in main polling threads if no * packets received on current iteration: @@ -2995,6 +2999,7 @@ dpif_netdev_execute(struct dpif *dpif, struct dpif_execute *execute) dp_packet_batch_init_packet(&pp, execute->packet); dp_netdev_execute_actions(pmd, &pp, false, execute->flow, execute->actions, execute->actions_len); + dp_netdev_pmd_flush_output_packets(pmd); if (pmd->core_id == NON_PMD_CORE_ID) { ovs_mutex_unlock(&dp->non_pmd_mutex); @@ -3281,6 +3286,36 @@ dp_netdev_rxq_get_intrvl_cycles(struct dp_netdev_rxq *rx, unsigned idx) return processing_cycles; } +static void +dp_netdev_pmd_flush_output_on_port(struct dp_netdev_pmd_thread *pmd, + struct tx_port *p) +{ + int tx_qid; + bool dynamic_txqs; + + dynamic_txqs = p->port->dynamic_txqs; + if (dynamic_txqs) { + tx_qid = dpif_netdev_xps_get_tx_qid(pmd, p); + } else { + tx_qid = pmd->static_tx_qid; + } + + netdev_send(p->port->netdev, tx_qid, &p->output_pkts, true, dynamic_txqs); + dp_packet_batch_init(&p->output_pkts); +} + +static void +dp_netdev_pmd_flush_output_packets(struct dp_netdev_pmd_thread *pmd) +{ + struct tx_port *p; + + HMAP_FOR_EACH (p, node, &pmd->send_port_cache) { + if (!dp_packet_batch_is_empty(&p->output_pkts)) { + dp_netdev_pmd_flush_output_on_port(pmd, p); + } + } +} + static int dp_netdev_process_rxq_port(struct dp_netdev_pmd_thread *pmd, struct netdev_rxq *rx, @@ -3294,9 +3329,11 @@ dp_netdev_process_rxq_port(struct dp_netdev_pmd_thread *pmd, error = netdev_rxq_recv(rx, &batch); if (!error) { *recirc_depth_get() = 0; + pmd_thread_ctx_time_update(pmd); batch_cnt = batch.count; dp_netdev_input(pmd, &batch, port_no); + dp_netdev_pmd_flush_output_packets(pmd); } else if (error != EAGAIN && error != EOPNOTSUPP) { static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); @@ -4761,6 +4798,7 @@ dp_netdev_add_port_tx_to_pmd(struct dp_netdev_pmd_thread *pmd, tx->port = port; tx->qid = -1; + dp_packet_batch_init(&tx->output_pkts); hmap_insert(&pmd->tx_ports, &tx->node, hash_port_no(tx->port->port_no)); pmd->need_reload = true; @@ -5218,8 +5256,6 @@ dp_netdev_input__(struct dp_netdev_pmd_thread *pmd, size_t n_batches; odp_port_t in_port; - pmd_thread_ctx_time_update(pmd); - n_batches = 0; emc_processing(pmd, packets, keys, batches, &n_batches, md_is_valid, port_no); @@ -5433,18 +5469,35 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_, case OVS_ACTION_ATTR_OUTPUT: p = pmd_send_port_cache_lookup(pmd, nl_attr_get_odp_port(a)); if (OVS_LIKELY(p)) { - int tx_qid; - bool dynamic_txqs; + struct dp_packet *packet; + struct dp_packet_batch out; - dynamic_txqs = p->port->dynamic_txqs; - if (dynamic_txqs) { - tx_qid = dpif_netdev_xps_get_tx_qid(pmd, p); - } else { - tx_qid = pmd->static_tx_qid; + if (!may_steal) { + dp_packet_batch_clone(&out, packets_); + dp_packet_batch_reset_cutlen(packets_); + packets_ = &out; } + dp_packet_batch_apply_cutlen(packets_); - netdev_send(p->port->netdev, tx_qid, packets_, may_steal, - dynamic_txqs); +#ifdef DPDK_NETDEV + if (OVS_UNLIKELY(!dp_packet_batch_is_empty(&p->output_pkts) + && packets_->packets[0]->source + != p->output_pkts.packets[0]->source)) { + /* XXX: netdev-dpdk assumes that all packets in a single + * output batch has the same source. Flush here to + * avoid memory access issues. */ + dp_netdev_pmd_flush_output_on_port(pmd, p); + } +#endif + if (OVS_UNLIKELY(dp_packet_batch_size(&p->output_pkts) + + dp_packet_batch_size(packets_) > NETDEV_MAX_BURST)) { + /* Some packets was generated while input batch processing. + * Flush here to avoid overflow. */ + dp_netdev_pmd_flush_output_on_port(pmd, p); + } + DP_PACKET_BATCH_FOR_EACH (packet, packets_) { + dp_packet_batch_add(&p->output_pkts, packet); + } return; } break; From patchwork Fri Dec 1 15:44:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 843555 X-Patchwork-Delegate: ian.stokes@intel.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.b="Jmp34l+h"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ypJZm34nDz9s03 for ; Sat, 2 Dec 2017 02:48:16 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 0CA47C87; Fri, 1 Dec 2017 15:44:58 +0000 (UTC) X-Original-To: ovs-dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id CC233C49 for ; Fri, 1 Dec 2017 15:44:56 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 9AB6F496 for ; Fri, 1 Dec 2017 15:44:55 +0000 (UTC) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20171201154453euoutp013faef9dd5a6e78781d7cded849a5fe35~8NiG782vj1298612986euoutp01f; Fri, 1 Dec 2017 15:44:53 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20171201154453euoutp013faef9dd5a6e78781d7cded849a5fe35~8NiG782vj1298612986euoutp01f DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1512143093; bh=gdhd1o375BtB3WW1udQk1VNM5h4wdvC3Im8iEn/r1Sk=; h=From:To:Cc:Subject:Date:In-reply-to:References:From; b=Jmp34l+hZmdeQw+/31PFzgfP2eymQgaiVCDXrmgiRnb/NXc848o/+g2suKuaXorQd 524f3jIPXqrU+l8P1O9qNSgraf/TU0ZK6uO2LikVBzGOoshCfTByi5eXO5eC4C/xxy lNfbdE0JNJBRsqWpn59BzqzWX0YrGbhYt9LZUDxo= Received: from eusmges2.samsung.com (unknown [203.254.199.241]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20171201154452eucas1p12330e29ac74ab67fc74f185a6007cbb7~8NiGK6IUg2810828108eucas1p1Y; Fri, 1 Dec 2017 15:44:52 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges2.samsung.com (EUCPMTA) with SMTP id 5D.77.12907.4F8712A5; Fri, 1 Dec 2017 15:44:52 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171201154451eucas1p2f67eece27a2051eac127cb836e22c9ab~8NiFgLP-T1819018190eucas1p2T; Fri, 1 Dec 2017 15:44:51 +0000 (GMT) X-AuditID: cbfec7f1-f793a6d00000326b-31-5a2178f42674 Received: from eusync3.samsung.com ( [203.254.199.213]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id EF.72.18832.3F8712A5; Fri, 1 Dec 2017 15:44:51 +0000 (GMT) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0P0A00BWSH2B5A50@eusync3.samsung.com>; Fri, 01 Dec 2017 15:44:51 +0000 (GMT) From: Ilya Maximets To: ovs-dev@openvswitch.org, Bhanuprakash Bodireddy Date: Fri, 01 Dec 2017 18:44:30 +0300 Message-id: <1512143073-22347-5-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1512143073-22347-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrDIsWRmVeSWpSXmKPExsWy7djP87pfKhSjDDauEbZY/YvTYuczZYuW /pnMFneu/GSzmPb5NrvFlfaf7BYbH55ltTjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKsYA1igum5TUnMyy1CJ9uwSujMvN89kKzvhU9P8/z97A+Nyyi5GTQ0LA ROLJ6iVMELaYxIV769m6GLk4hASWMkrs/toF5XxmlGjafJWxi5EDrKPxWAhEfBmjxLTXv1kg nGYmia8/vzGCjGIT0JE4tfoImC0iECHx4PssdpAiZoHTTBJvNi1iBkkIC1hITJzzmhlkKouA qkTzVbB6XgE3iVsfnrFAnCQncfNcJ1gJp4C7xJHf4iBjJASWsElMnXicHaLGRWLF+zNQLwhL vDq+BSouI9HZcZAJoqGZUaJh1SVGCGcCo8SX5uVQHfYSp25eBbOZBfgkJm2bzgzxJq9ER5sQ RImHxKy2BcwQtqPE43tzoMEyi1Hi68FNjBMYpRcwMqxiFEktLc5NTy020itOzC0uzUvXS87P 3cQIjOPT/45/3MH4/oTVIUYBDkYlHl6GcMUoIdbEsuLK3EOMEhzMSiK8WSVAId6UxMqq1KL8 +KLSnNTiQ4zSHCxK4ry2UW2RQgLpiSWp2ampBalFMFkmDk6pBsaLH1as1dqzoGTe73jpeQZT mIzXx4lm9l7Rai+/+i84XzV60nXfJivjWu07+fvWTgk0ccgpPu+gMKFolfLZXT/c7eqtPE+4 7Nh88bbOwSZPh98hD0RDsxqZvb8elglRO33lZcGcm8es2YNkVf3Udh32XvnvrabUstSUHPPi XaKLnwjYOiasuKnEUpyRaKjFXFScCAAd7gH43wIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprPLMWRmVeSWpSXmKPExsVy+t/xq7qfKxSjDLrWG1us/sVpsfOZskVL /0xmiztXfrJZTPt8m93iSvtPdouND8+yWhz5fprRYu2hD+wWcz89Z3Tg8vj19Sqbx+I9L5k8 nt38z+jxfh+Q27dlFWMAaxSXTUpqTmZZapG+XQJXxuXm+WwFZ3wq+v+fZ29gfG7ZxcjBISFg ItF4LKSLkRPIFJO4cG89WxcjF4eQwBJGiYYvX9khnFYmib5jR9hBqtgEdCROrT7CCGKLCERI tMxZzwhSxCxwlkmi9fRxNpCEsICFxMQ5r5lBNrAIqEo0XwWr5xVwk7j14RkLxDY5iZvnOsFK OAXcJY78FgcJCwGV7N+9g3ECI+8CRoZVjCKppcW56bnFhnrFibnFpXnpesn5uZsYgcG27djP zTsYL20MPsQowMGoxMO7IkQxSog1say4MvcQowQHs5IIb1YJUIg3JbGyKrUoP76oNCe1+BCj NAeLkjhv757VkUIC6YklqdmpqQWpRTBZJg5OqQbGuLS6xdsimb6d3T3PbO/GDd1nRKpW/J50 8c+HU1t458wufTUzd6f88uLiFxN5ebpE11w71bIit9wsUN7EjDFLbn64dHnL+9/BW/yK9V9I ux97F35WYW/d4fkyk8yPLei33cqr+NEsT9Hn3Cv5lX8K3NnnTEiMurlmocSx4s/TVf+s257y lncFsxJLcUaioRZzUXEiAGelK+8yAgAA X-CMS-MailID: 20171201154451eucas1p2f67eece27a2051eac127cb836e22c9ab X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20171201154451eucas1p2f67eece27a2051eac127cb836e22c9ab X-RootMTR: 20171201154451eucas1p2f67eece27a2051eac127cb836e22c9ab References: <1512143073-22347-1-git-send-email-i.maximets@samsung.com> X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Heetae Ahn , Ilya Maximets Subject: [ovs-dev] [PATCH v6 4/7] netdev: Remove unused may_steal. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org Not needed anymore because 'may_steal' already handled on dpif-netdev layer and always true. Signed-off-by: Ilya Maximets --- lib/dpif-netdev.c | 2 +- lib/netdev-bsd.c | 4 ++-- lib/netdev-dpdk.c | 25 +++++++++++-------------- lib/netdev-dummy.c | 4 ++-- lib/netdev-linux.c | 4 ++-- lib/netdev-provider.h | 7 +++---- lib/netdev.c | 12 ++++-------- lib/netdev.h | 2 +- 8 files changed, 26 insertions(+), 34 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index f124bf8..68c35fa 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -3300,7 +3300,7 @@ dp_netdev_pmd_flush_output_on_port(struct dp_netdev_pmd_thread *pmd, tx_qid = pmd->static_tx_qid; } - netdev_send(p->port->netdev, tx_qid, &p->output_pkts, true, dynamic_txqs); + netdev_send(p->port->netdev, tx_qid, &p->output_pkts, dynamic_txqs); dp_packet_batch_init(&p->output_pkts); } diff --git a/lib/netdev-bsd.c b/lib/netdev-bsd.c index 65c5674..658a5bc 100644 --- a/lib/netdev-bsd.c +++ b/lib/netdev-bsd.c @@ -680,7 +680,7 @@ netdev_bsd_rxq_drain(struct netdev_rxq *rxq_) */ static int netdev_bsd_send(struct netdev *netdev_, int qid OVS_UNUSED, - struct dp_packet_batch *batch, bool may_steal, + struct dp_packet_batch *batch, bool concurrent_txq OVS_UNUSED) { struct netdev_bsd *dev = netdev_bsd_cast(netdev_); @@ -728,7 +728,7 @@ netdev_bsd_send(struct netdev *netdev_, int qid OVS_UNUSED, } ovs_mutex_unlock(&dev->mutex); - dp_packet_delete_batch(batch, may_steal); + dp_packet_delete_batch(batch, true); return error; } diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index faff842..47cf2dd 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -1874,12 +1874,12 @@ dpdk_do_tx_copy(struct netdev *netdev, int qid, struct dp_packet_batch *batch) static int netdev_dpdk_vhost_send(struct netdev *netdev, int qid, struct dp_packet_batch *batch, - bool may_steal, bool concurrent_txq OVS_UNUSED) + bool concurrent_txq OVS_UNUSED) { - if (OVS_UNLIKELY(!may_steal || batch->packets[0]->source != DPBUF_DPDK)) { + if (OVS_UNLIKELY(batch->packets[0]->source != DPBUF_DPDK)) { dpdk_do_tx_copy(netdev, qid, batch); - dp_packet_delete_batch(batch, may_steal); + dp_packet_delete_batch(batch, true); } else { dp_packet_batch_apply_cutlen(batch); __netdev_dpdk_vhost_send(netdev, qid, batch->packets, batch->count); @@ -1889,11 +1889,11 @@ netdev_dpdk_vhost_send(struct netdev *netdev, int qid, static inline void netdev_dpdk_send__(struct netdev_dpdk *dev, int qid, - struct dp_packet_batch *batch, bool may_steal, + struct dp_packet_batch *batch, bool concurrent_txq) { if (OVS_UNLIKELY(!(dev->flags & NETDEV_UP))) { - dp_packet_delete_batch(batch, may_steal); + dp_packet_delete_batch(batch, true); return; } @@ -1902,12 +1902,11 @@ netdev_dpdk_send__(struct netdev_dpdk *dev, int qid, rte_spinlock_lock(&dev->tx_q[qid].tx_lock); } - if (OVS_UNLIKELY(!may_steal || - batch->packets[0]->source != DPBUF_DPDK)) { + if (OVS_UNLIKELY(batch->packets[0]->source != DPBUF_DPDK)) { struct netdev *netdev = &dev->up; dpdk_do_tx_copy(netdev, qid, batch); - dp_packet_delete_batch(batch, may_steal); + dp_packet_delete_batch(batch, true); } else { int tx_cnt, dropped; int batch_cnt = dp_packet_batch_size(batch); @@ -1935,12 +1934,11 @@ netdev_dpdk_send__(struct netdev_dpdk *dev, int qid, static int netdev_dpdk_eth_send(struct netdev *netdev, int qid, - struct dp_packet_batch *batch, bool may_steal, - bool concurrent_txq) + struct dp_packet_batch *batch, bool concurrent_txq) { struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); - netdev_dpdk_send__(dev, qid, batch, may_steal, concurrent_txq); + netdev_dpdk_send__(dev, qid, batch, concurrent_txq); return 0; } @@ -2907,8 +2905,7 @@ dpdk_ring_open(const char dev_name[], dpdk_port_t *eth_port_id) static int netdev_dpdk_ring_send(struct netdev *netdev, int qid, - struct dp_packet_batch *batch, bool may_steal, - bool concurrent_txq) + struct dp_packet_batch *batch, bool concurrent_txq) { struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); struct dp_packet *packet; @@ -2921,7 +2918,7 @@ netdev_dpdk_ring_send(struct netdev *netdev, int qid, dp_packet_mbuf_rss_flag_reset(packet); } - netdev_dpdk_send__(dev, qid, batch, may_steal, concurrent_txq); + netdev_dpdk_send__(dev, qid, batch, concurrent_txq); return 0; } diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index 246cdf1..140e08d 100644 --- a/lib/netdev-dummy.c +++ b/lib/netdev-dummy.c @@ -1062,7 +1062,7 @@ netdev_dummy_rxq_drain(struct netdev_rxq *rxq_) static int netdev_dummy_send(struct netdev *netdev, int qid OVS_UNUSED, - struct dp_packet_batch *batch, bool may_steal, + struct dp_packet_batch *batch, bool concurrent_txq OVS_UNUSED) { struct netdev_dummy *dev = netdev_dummy_cast(netdev); @@ -1132,7 +1132,7 @@ netdev_dummy_send(struct netdev *netdev, int qid OVS_UNUSED, ovs_mutex_unlock(&dev->mutex); } - dp_packet_delete_batch(batch, may_steal); + dp_packet_delete_batch(batch, true); return error; } diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index e809b88..634ff6f 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -1270,7 +1270,7 @@ netdev_linux_tap_batch_send(struct netdev *netdev_, * expected to do additional queuing of packets. */ static int netdev_linux_send(struct netdev *netdev_, int qid OVS_UNUSED, - struct dp_packet_batch *batch, bool may_steal, + struct dp_packet_batch *batch, bool concurrent_txq OVS_UNUSED) { int error = 0; @@ -1306,7 +1306,7 @@ netdev_linux_send(struct netdev *netdev_, int qid OVS_UNUSED, } free_batch: - dp_packet_delete_batch(batch, may_steal); + dp_packet_delete_batch(batch, true); return error; } diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h index 1720deb..3d9f336 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -348,9 +348,8 @@ struct netdev_class { * If the function returns a non-zero value, some of the packets might have * been sent anyway. * - * If 'may_steal' is false, the caller retains ownership of all the - * packets. If 'may_steal' is true, the caller transfers ownership of all - * the packets to the network device, regardless of success. + * The caller transfers ownership of all the packets to the network + * device, regardless of success. * * If 'concurrent_txq' is true, the caller may perform concurrent calls * to netdev_send() with the same 'qid'. The netdev provider is responsible @@ -370,7 +369,7 @@ struct netdev_class { * datapath". It will also prevent the OVS implementation of bonding from * working properly over 'netdev'.) */ int (*send)(struct netdev *netdev, int qid, struct dp_packet_batch *batch, - bool may_steal, bool concurrent_txq); + bool concurrent_txq); /* Registers with the poll loop to wake up from the next call to * poll_block() when the packet transmission queue for 'netdev' has diff --git a/lib/netdev.c b/lib/netdev.c index 2d69fe5..e6f7c95 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -771,9 +771,8 @@ netdev_get_pt_mode(const struct netdev *netdev) * If the function returns a non-zero value, some of the packets might have * been sent anyway. * - * If 'may_steal' is false, the caller retains ownership of all the packets. - * If 'may_steal' is true, the caller transfers ownership of all the packets - * to the network device, regardless of success. + * The caller transfers ownership of all the packets to the network device, + * regardless of success. * * If 'concurrent_txq' is true, the caller may perform concurrent calls * to netdev_send() with the same 'qid'. The netdev provider is responsible @@ -787,15 +786,12 @@ netdev_get_pt_mode(const struct netdev *netdev) * queues. */ int netdev_send(struct netdev *netdev, int qid, struct dp_packet_batch *batch, - bool may_steal, bool concurrent_txq) + bool concurrent_txq) { - int error = netdev->netdev_class->send(netdev, qid, batch, may_steal, + int error = netdev->netdev_class->send(netdev, qid, batch, concurrent_txq); if (!error) { COVERAGE_INC(netdev_sent); - if (!may_steal) { - dp_packet_batch_reset_cutlen(batch); - } } return error; } diff --git a/lib/netdev.h b/lib/netdev.h index 3a545fe..dc9d9a0f 100644 --- a/lib/netdev.h +++ b/lib/netdev.h @@ -181,7 +181,7 @@ int netdev_rxq_drain(struct netdev_rxq *); /* Packet transmission. */ int netdev_send(struct netdev *, int qid, struct dp_packet_batch *, - bool may_steal, bool concurrent_txq); + bool concurrent_txq); void netdev_send_wait(struct netdev *, int qid); /* Flow offloading. */ From patchwork Fri Dec 1 15:44:31 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 843556 X-Patchwork-Delegate: ian.stokes@intel.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.b="vbjo+7FJ"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ypJbX20vrz9s9Y for ; Sat, 2 Dec 2017 02:48:56 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 06736C88; Fri, 1 Dec 2017 15:44:59 +0000 (UTC) X-Original-To: ovs-dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 4F2D9C8D for ; Fri, 1 Dec 2017 15:44:58 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id C951E47E for ; Fri, 1 Dec 2017 15:44:57 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20171201154455euoutp01104862e1e1b8d40366ea237c43762b96~8NiI-L2s91301513015euoutp01b; Fri, 1 Dec 2017 15:44:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20171201154455euoutp01104862e1e1b8d40366ea237c43762b96~8NiI-L2s91301513015euoutp01b DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1512143095; bh=aOL/BrIjYkEjUbqF3c9F/yRPzA2F4ZxKHlBnxhk/vkM=; h=From:To:Cc:Subject:Date:In-reply-to:References:From; b=vbjo+7FJKqrRQ/OhHK/8iA6dOT+9DaObpmqI4rSD1h+40DGTAWSTALHIvyuSixIHj LFz6ntG/qIaLPQ4gr+b/d2rGlWUDpKrElZkxal6AHpZoR4x5kg4rekdDCpEUgQllfc nDJsLxXsh7W3vbrm8T+wv7MAd3+cbWB5VhQVeTcc= Received: from eusmges3.samsung.com (unknown [203.254.199.242]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171201154454eucas1p22dc34ecbaf64ff287abacf24f4fa568d~8NiIWxxVf1818618186eucas1p2S; Fri, 1 Dec 2017 15:44:54 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges3.samsung.com (EUCPMTA) with SMTP id 03.58.12867.6F8712A5; Fri, 1 Dec 2017 15:44:54 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171201154454eucas1p221e2df9d695cc98ec267b262743c932d~8NiHu-x5Q1773517735eucas1p22; Fri, 1 Dec 2017 15:44:54 +0000 (GMT) X-AuditID: cbfec7f2-f793b6d000003243-c0-5a2178f60a69 Received: from eusync3.samsung.com ( [203.254.199.213]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 71.82.18832.6F8712A5; Fri, 1 Dec 2017 15:44:54 +0000 (GMT) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0P0A00BWSH2B5A50@eusync3.samsung.com>; Fri, 01 Dec 2017 15:44:54 +0000 (GMT) From: Ilya Maximets To: ovs-dev@openvswitch.org, Bhanuprakash Bodireddy Date: Fri, 01 Dec 2017 18:44:31 +0300 Message-id: <1512143073-22347-6-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1512143073-22347-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrNIsWRmVeSWpSXmKPExsWy7djP87rfKhSjDFbd0bBY/YvTYuczZYuW /pnMFneu/GSzmPb5NrvFlfaf7BYbH55ltTjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKsYA1igum5TUnMyy1CJ9uwSujJ5u2YKNMhUzvp5ib2A8J9rFyMkhIWAi sabzMxOELSZx4d56ti5GLg4hgaWMEvu+XWGHcD4zSrTcO8IG0/Hh3WNGiMQyRomOibegnGYm iYMrD7CAVLEJ6EicWn2EEcQWEYiQePB9FtgoZoHTTBJvNi1iBkkIC5hJ7F3/DWwsi4CqxNJZ f8BsXgE3iZn9S6GOkpO4ea4TqJ6Dg1PAXeLIb3GQORICS9gkrs88zgISlxBwkbj7wwqiXFji 1fEt7BC2jERnx0EmiPpmRomGVZcYIZwJjBJfmpdDLbCXOHXzKpjNLMAnMWnbdGaIobwSHW1C ECUeErM334B631Hix/UZYLaQwCxGiRMrtCcwSi9gZFjFKJJaWpybnlpsrFecmFtcmpeul5yf u4kRGMWn/x3/tIPx6wmrQ4wCHIxKPLwM4YpRQqyJZcWVuYcYJTiYlUR4s0qAQrwpiZVVqUX5 8UWlOanFhxilOViUxHlto9oihQTSE0tSs1NTC1KLYLJMHJxSDYxK1jHFD5yNQ2dYHta+JnEm N+HYk/d1SzffS5t0wM5O7rXU4rrGBSqf8+ovbn3yKa3kF3e3udPmFy7qm4z4ucW13+fvWW56 PMz+wRSLGaVWkUw/Er0kQ1UXfAt+8sfktlnPK+Xvrq5TCv1ivW1nrnh6rkxys9V57V0J/leO 3P6mpvaK5WpdWrESS3FGoqEWc1FxIgA/P5i+3gIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrALMWRmVeSWpSXmKPExsVy+t/xq7rfKhSjDBpv8lms/sVpsfOZskVL /0xmiztXfrJZTPt8m93iSvtPdouND8+yWhz5fprRYu2hD+wWcz89Z3Tg8vj19Sqbx+I9L5k8 nt38z+jxfh+Q27dlFWMAaxSXTUpqTmZZapG+XQJXRk+3bMFGmYoZX0+xNzCeE+1i5OSQEDCR +PDuMSOELSZx4d56ti5GLg4hgSWMEhNXXmWBcFqZJH69ecQOUsUmoCNxavURsA4RgQiJljnr GUGKmAXOMkm0nj7OBpIQFjCT2Lv+G5jNIqAqsXTWHzCbV8BNYmb/UiaIdXISN891MncxcnBw CrhLHPktDhIWAirZv3sH4wRG3gWMDKsYRVJLi3PTc4sN9YoTc4tL89L1kvNzNzECw23bsZ+b dzBe2hh8iFGAg1GJh3dFiGKUEGtiWXFl7iFGCQ5mJRHerBKgEG9KYmVValF+fFFpTmrxIUZp DhYlcd7ePasjhQTSE0tSs1NTC1KLYLJMHJxSDYz9b99+uXrF9VPebKE7UwsV5xmmPlLgOZp2 cmaogqO51f+vImsOZG60s2u7p+LA7eF+M8jf4+GKmY/S1ix+5jo1MSP3+eu6ReU/tj2tqDre sb+mq37u4b2FlbGtpmzH+liKDToTl3asyF5aZRSWNk3faMf3CsO0CXtXhS6ZNCfgyhWJgLhr mv+VWIozEg21mIuKEwGEfk3dMwIAAA== X-CMS-MailID: 20171201154454eucas1p221e2df9d695cc98ec267b262743c932d X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20171201154454eucas1p221e2df9d695cc98ec267b262743c932d X-RootMTR: 20171201154454eucas1p221e2df9d695cc98ec267b262743c932d References: <1512143073-22347-1-git-send-email-i.maximets@samsung.com> X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Heetae Ahn , Ilya Maximets Subject: [ovs-dev] [PATCH v6 5/7] netdev: Remove useless cutlen. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org Cutlen already applied while processing OVS_ACTION_ATTR_OUTPUT. Acked-by: Eelco Chaudron Signed-off-by: Ilya Maximets --- lib/netdev-bsd.c | 2 +- lib/netdev-dpdk.c | 5 ----- lib/netdev-dummy.c | 2 +- lib/netdev-linux.c | 4 ++-- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/lib/netdev-bsd.c b/lib/netdev-bsd.c index 658a5bc..05974c1 100644 --- a/lib/netdev-bsd.c +++ b/lib/netdev-bsd.c @@ -697,7 +697,7 @@ netdev_bsd_send(struct netdev *netdev_, int qid OVS_UNUSED, for (i = 0; i < batch->count; i++) { const void *data = dp_packet_data(batch->packets[i]); - size_t size = dp_packet_get_send_len(batch->packets[i]); + size_t size = dp_packet_size(batch->packets[i]); while (!error) { ssize_t retval; diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 47cf2dd..7454451 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -1825,8 +1825,6 @@ dpdk_do_tx_copy(struct netdev *netdev, int qid, struct dp_packet_batch *batch) dropped += batch_cnt - cnt; } - dp_packet_batch_apply_cutlen(batch); - uint32_t txcnt = 0; for (uint32_t i = 0; i < cnt; i++) { @@ -1881,7 +1879,6 @@ netdev_dpdk_vhost_send(struct netdev *netdev, int qid, dpdk_do_tx_copy(netdev, qid, batch); dp_packet_delete_batch(batch, true); } else { - dp_packet_batch_apply_cutlen(batch); __netdev_dpdk_vhost_send(netdev, qid, batch->packets, batch->count); } return 0; @@ -1912,8 +1909,6 @@ netdev_dpdk_send__(struct netdev_dpdk *dev, int qid, int batch_cnt = dp_packet_batch_size(batch); struct rte_mbuf **pkts = (struct rte_mbuf **) batch->packets; - dp_packet_batch_apply_cutlen(batch); - tx_cnt = netdev_dpdk_filter_packet_len(dev, pkts, batch_cnt); tx_cnt = netdev_dpdk_qos_run(dev, pkts, tx_cnt, true); dropped = batch_cnt - tx_cnt; diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index 140e08d..40086a3 100644 --- a/lib/netdev-dummy.c +++ b/lib/netdev-dummy.c @@ -1071,7 +1071,7 @@ netdev_dummy_send(struct netdev *netdev, int qid OVS_UNUSED, struct dp_packet *packet; DP_PACKET_BATCH_FOR_EACH(packet, batch) { const void *buffer = dp_packet_data(packet); - size_t size = dp_packet_get_send_len(packet); + size_t size = dp_packet_size(packet); if (batch->packets[i]->packet_type != htonl(PT_ETH)) { error = EPFNOSUPPORT; diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 634ff6f..e767567 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -1198,7 +1198,7 @@ netdev_linux_sock_batch_send(int sock, int ifindex, struct dp_packet *packet; DP_PACKET_BATCH_FOR_EACH (packet, batch) { iov[i].iov_base = dp_packet_data(packet); - iov[i].iov_len = dp_packet_get_send_len(packet); + iov[i].iov_len = dp_packet_size(packet); mmsg[i].msg_hdr = (struct msghdr) { .msg_name = &sll, .msg_namelen = sizeof sll, .msg_iov = &iov[i], @@ -1235,7 +1235,7 @@ netdev_linux_tap_batch_send(struct netdev *netdev_, struct netdev_linux *netdev = netdev_linux_cast(netdev_); struct dp_packet *packet; DP_PACKET_BATCH_FOR_EACH (packet, batch) { - size_t size = dp_packet_get_send_len(packet); + size_t size = dp_packet_size(packet); ssize_t retval; int error; From patchwork Fri Dec 1 15:44:32 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 843557 X-Patchwork-Delegate: ian.stokes@intel.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.b="WYMaTEvd"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ypJcb0ZNCz9s9Y for ; Sat, 2 Dec 2017 02:49:51 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 47ECAC9B; Fri, 1 Dec 2017 15:45:03 +0000 (UTC) X-Original-To: ovs-dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 09489C96 for ; Fri, 1 Dec 2017 15:45:02 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id C0B2447E for ; Fri, 1 Dec 2017 15:45:00 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20171201154458euoutp0284d6f7e5e906cc0a5ad7a78f357b95aa~8NiLxlujt3158431584euoutp02q; Fri, 1 Dec 2017 15:44:58 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20171201154458euoutp0284d6f7e5e906cc0a5ad7a78f357b95aa~8NiLxlujt3158431584euoutp02q DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1512143098; bh=FLSiE9ilikcjX1Z71ad2eC4vCxh+5NRJjx/VvWtaTkM=; h=From:To:Cc:Subject:Date:In-reply-to:References:From; b=WYMaTEvd1fsxzv0uAXY+F92Qd30h223aojONy2l8Yybrd0cBzBAf1q5iphD0KLu6D R+pXGqRgRAXnHsiVDF1esAcoaSjnj44+4MUttrVTHCDk9FniIFENh975BSv3ne/u+F VWOG9Nv9kVe2I7zBM+qw/A/G648gUZpzwoc/ywD4= Received: from eusmges2.samsung.com (unknown [203.254.199.241]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20171201154457eucas1p1d03544de24d70ace5087145a1996e545~8NiK4b2RP0124001240eucas1p1n; Fri, 1 Dec 2017 15:44:57 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges2.samsung.com (EUCPMTA) with SMTP id 5E.77.12907.9F8712A5; Fri, 1 Dec 2017 15:44:57 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171201154456eucas1p2826604deb3abcce765fba5e74656d630~8NiKF_w8e0895008950eucas1p27; Fri, 1 Dec 2017 15:44:56 +0000 (GMT) X-AuditID: cbfec7f1-f793a6d00000326b-39-5a2178f9ac54 Received: from eusync3.samsung.com ( [203.254.199.213]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id A2.82.18832.8F8712A5; Fri, 1 Dec 2017 15:44:56 +0000 (GMT) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0P0A00BWSH2B5A50@eusync3.samsung.com>; Fri, 01 Dec 2017 15:44:56 +0000 (GMT) From: Ilya Maximets To: ovs-dev@openvswitch.org, Bhanuprakash Bodireddy Date: Fri, 01 Dec 2017 18:44:32 +0300 Message-id: <1512143073-22347-7-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1512143073-22347-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrHIsWRmVeSWpSXmKPExsWy7djPc7o/KxSjDOa2iVus/sVpsfOZskVL /0xmiztXfrJZTPt8m93iSvtPdouND8+yWhz5fprRYu2hD+wWcz89Z3Tg8vj19Sqbx+I9L5k8 nt38z+jxfh+Q27dlFWMAaxSXTUpqTmZZapG+XQJXxu7L85kK3ncyVhzY0MDewLg7qYuRk0NC wERi25tVzBC2mMSFe+vZuhi5OIQEljJKTL95lAnC+cwoMbdhCwtMR9uB84wQiWWMEr/6f0A5 zUwS887tBqtiE9CROLX6CCOILSIQIfHg+yx2kCJmgdNMEm82LQJbKCzgIHHn7RnWLkYODhYB VYl72wVBwrwCbhK7ttyAuklO4ua5TmaQEk4Bd4kjv8VBxkgILGGTmPXlOBNEjYvEpBk3WCFs YYlXx7ewQ9gyEp0dB5kgGpoZJRpWXWKEcCYwSnxpXg7VbS9x6uZVMJtZgE9i0rbpYNskBHgl OtqEIEo8JDqPL4d631Hi+Z7/rBAfz2KUeL50LuMERukFjAyrGEVSS4tz01OLjfSKE3OLS/PS 9ZLzczcxAmP59L/jH3cwvj9hdYhRgINRiYeXIVwxSog1say4MvcQowQHs5IIb1YJUIg3JbGy KrUoP76oNCe1+BCjNAeLkjivbVRbpJBAemJJanZqakFqEUyWiYNTqoFxRo83t8uTvrg9TzY/ /LmygOH23cn5cVrLNAJPSDbG+GsWzd2lZdngrXI6UafQZNZbk8tKDN0/r6kWuWpv9pjyWP5p V4XG9hVTjppfCQiMP/Z6q8bVxisSq1iqb4jePPGpulf/d5r7xObdca3BK24LFk/+5fL7a5/m zDmnUnfNTRSx3t61Y0aCEktxRqKhFnNRcSIA63rTN+ECAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrILMWRmVeSWpSXmKPExsVy+t/xq7o/KhSjDDZ361us/sVpsfOZskVL /0xmiztXfrJZTPt8m93iSvtPdouND8+yWhz5fprRYu2hD+wWcz89Z3Tg8vj19Sqbx+I9L5k8 nt38z+jxfh+Q27dlFWMAaxSXTUpqTmZZapG+XQJXxu7L85kK3ncyVhzY0MDewLg7qYuRk0NC wESi7cB5RghbTOLCvfVsXYxcHEICSxglliw5zwThtDJJrDp2kQ2kik1AR+LU6iNgHSICERIt c9YzghQxC5xlkmg9fRysSFjAQeLO2zOsXYwcHCwCqhL3tguChHkF3CR2bbnBDLFNTuLmuU5m kBJOAXeJI7/FQcJCQCX7d+9gnMDIu4CRYRWjSGppcW56brGhXnFibnFpXrpecn7uJkZgwG07 9nPzDsZLG4MPMQpwMCrx8K4IUYwSYk0sK67MPcQowcGsJMKbVQIU4k1JrKxKLcqPLyrNSS0+ xCjNwaIkztu7Z3WkkEB6YklqdmpqQWoRTJaJg1OqgdFv1To/HcEvKctj+viXvjwi0Coov7zW Jmuh1tPj+uu87H8KNK8q8uTLYO2fKaNgo39GIY5da+G1KO66Cd/ehW8X9jZSkI3LzTnvvmXx tPR3zBGL95fM2jmXs8dzfbKwbWFKWpztBe1jZbcaA3R+8pq9+szSPP+m5YFfLG9jv39x6v26 S3/nMiWW4oxEQy3mouJEAEboUSs0AgAA X-CMS-MailID: 20171201154456eucas1p2826604deb3abcce765fba5e74656d630 X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20171201154456eucas1p2826604deb3abcce765fba5e74656d630 X-RootMTR: 20171201154456eucas1p2826604deb3abcce765fba5e74656d630 References: <1512143073-22347-1-git-send-email-i.maximets@samsung.com> X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Heetae Ahn , Ilya Maximets Subject: [ovs-dev] [PATCH v6 6/7] dpif-netdev: Time based output batching. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org This allows to collect packets from more than one RX burst and send them together with a configurable intervals. 'other_config:tx-flush-interval' can be used to configure time that a packet can wait in output batch for sending. dpif-netdev turned to microsecond resolution for time measuring to ensure desired resolution of 'tx-flush-interval'. Signed-off-by: Ilya Maximets --- lib/dpif-netdev.c | 151 +++++++++++++++++++++++++++++++++++++++------------ vswitchd/vswitch.xml | 16 ++++++ 2 files changed, 132 insertions(+), 35 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 68c35fa..da6b7b8 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -85,6 +85,9 @@ VLOG_DEFINE_THIS_MODULE(dpif_netdev); #define MAX_RECIRC_DEPTH 6 DEFINE_STATIC_PER_THREAD_DATA(uint32_t, recirc_depth, 0) +/* Use instant packet send by default. */ +#define DEFAULT_TX_FLUSH_INTERVAL 0 + /* Configuration parameters. */ enum { MAX_FLOWS = 65536 }; /* Maximum number of flows in flow table. */ enum { MAX_METERS = 65536 }; /* Maximum number of meters. */ @@ -178,12 +181,13 @@ struct emc_cache { /* Simple non-wildcarding single-priority classifier. */ -/* Time in ms between successive optimizations of the dpcls subtable vector */ -#define DPCLS_OPTIMIZATION_INTERVAL 1000 +/* Time in microseconds between successive optimizations of the dpcls + * subtable vector */ +#define DPCLS_OPTIMIZATION_INTERVAL 1000000LL -/* Time in ms of the interval in which rxq processing cycles used in - * rxq to pmd assignments is measured and stored. */ -#define PMD_RXQ_INTERVAL_LEN 10000 +/* Time in microseconds of the interval in which rxq processing cycles used + * in rxq to pmd assignments is measured and stored. */ +#define PMD_RXQ_INTERVAL_LEN 10000000LL /* Number of intervals for which cycles are stored * and used during rxq to pmd assignment. */ @@ -270,6 +274,9 @@ struct dp_netdev { struct hmap ports; struct seq *port_seq; /* Incremented whenever a port changes. */ + /* The time that a packet can wait in output batch for sending. */ + atomic_uint32_t tx_flush_interval; + /* Meters. */ struct ovs_mutex meter_locks[N_METER_LOCKS]; struct dp_meter *meters[MAX_METERS]; /* Meter bands. */ @@ -356,7 +363,7 @@ enum rxq_cycles_counter_type { RXQ_N_CYCLES }; -#define XPS_TIMEOUT_MS 500LL +#define XPS_TIMEOUT 500000LL /* In microseconds. */ /* Contained by struct dp_netdev_port's 'rxqs' member. */ struct dp_netdev_rxq { @@ -526,6 +533,7 @@ struct tx_port { int qid; long long last_used; struct hmap_node node; + long long flush_time; struct dp_packet_batch output_pkts; }; @@ -627,10 +635,13 @@ struct dp_netdev_pmd_thread { * less than 'cmap_count(dp->poll_threads)'. */ uint32_t static_tx_qid; + /* Number of filled output batches. */ + int n_output_batches; + unsigned core_id; /* CPU core id of this pmd thread. */ int numa_id; /* numa node id of this pmd thread. */ - /* 20 pad bytes. */ + /* 16 pad bytes. */ ); PADDED_MEMBERS(CACHE_LINE_SIZE, @@ -740,8 +751,9 @@ static void dp_netdev_add_rxq_to_pmd(struct dp_netdev_pmd_thread *pmd, static void dp_netdev_del_rxq_from_pmd(struct dp_netdev_pmd_thread *pmd, struct rxq_poll *poll) OVS_REQUIRES(pmd->port_mutex); -static void -dp_netdev_pmd_flush_output_packets(struct dp_netdev_pmd_thread *pmd); +static int +dp_netdev_pmd_flush_output_packets(struct dp_netdev_pmd_thread *pmd, + bool force); static void reconfigure_datapath(struct dp_netdev *dp) OVS_REQUIRES(dp->port_mutex); @@ -832,7 +844,7 @@ emc_cache_slow_sweep(struct emc_cache *flow_cache) static inline void pmd_thread_ctx_time_update(struct dp_netdev_pmd_thread *pmd) { - pmd->ctx.now = time_msec(); + pmd->ctx.now = time_usec(); } /* Returns true if 'dpif' is a netdev or dummy dpif, false otherwise. */ @@ -1332,6 +1344,7 @@ create_dp_netdev(const char *name, const struct dpif_class *class, conntrack_init(&dp->conntrack); atomic_init(&dp->emc_insert_min, DEFAULT_EM_FLOW_INSERT_MIN); + atomic_init(&dp->tx_flush_interval, DEFAULT_TX_FLUSH_INTERVAL); cmap_init(&dp->poll_threads); @@ -2999,7 +3012,7 @@ dpif_netdev_execute(struct dpif *dpif, struct dpif_execute *execute) dp_packet_batch_init_packet(&pp, execute->packet); dp_netdev_execute_actions(pmd, &pp, false, execute->flow, execute->actions, execute->actions_len); - dp_netdev_pmd_flush_output_packets(pmd); + dp_netdev_pmd_flush_output_packets(pmd, true); if (pmd->core_id == NON_PMD_CORE_ID) { ovs_mutex_unlock(&dp->non_pmd_mutex); @@ -3048,6 +3061,16 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config) smap_get_ullong(other_config, "emc-insert-inv-prob", DEFAULT_EM_FLOW_INSERT_INV_PROB); uint32_t insert_min, cur_min; + uint32_t tx_flush_interval, cur_tx_flush_interval; + + tx_flush_interval = smap_get_int(other_config, "tx-flush-interval", + DEFAULT_TX_FLUSH_INTERVAL); + atomic_read_relaxed(&dp->tx_flush_interval, &cur_tx_flush_interval); + if (tx_flush_interval != cur_tx_flush_interval) { + atomic_store_relaxed(&dp->tx_flush_interval, tx_flush_interval); + VLOG_INFO("Flushing interval for tx queues set to %"PRIu32" us", + tx_flush_interval); + } if (!nullable_string_is_equal(dp->pmd_cmask, cmask)) { free(dp->pmd_cmask); @@ -3286,12 +3309,14 @@ dp_netdev_rxq_get_intrvl_cycles(struct dp_netdev_rxq *rx, unsigned idx) return processing_cycles; } -static void +static int dp_netdev_pmd_flush_output_on_port(struct dp_netdev_pmd_thread *pmd, struct tx_port *p) { int tx_qid; + int output_cnt; bool dynamic_txqs; + uint32_t tx_flush_interval; dynamic_txqs = p->port->dynamic_txqs; if (dynamic_txqs) { @@ -3300,20 +3325,40 @@ dp_netdev_pmd_flush_output_on_port(struct dp_netdev_pmd_thread *pmd, tx_qid = pmd->static_tx_qid; } + output_cnt = dp_packet_batch_size(&p->output_pkts); + ovs_assert(output_cnt > 0); + netdev_send(p->port->netdev, tx_qid, &p->output_pkts, dynamic_txqs); dp_packet_batch_init(&p->output_pkts); + + /* Update time of the next flush. */ + atomic_read_relaxed(&pmd->dp->tx_flush_interval, &tx_flush_interval); + p->flush_time = pmd->ctx.now + tx_flush_interval; + + ovs_assert(pmd->n_output_batches > 0); + pmd->n_output_batches--; + + return output_cnt; } -static void -dp_netdev_pmd_flush_output_packets(struct dp_netdev_pmd_thread *pmd) +static int +dp_netdev_pmd_flush_output_packets(struct dp_netdev_pmd_thread *pmd, + bool force) { struct tx_port *p; + int output_cnt = 0; + + if (!pmd->n_output_batches) { + return 0; + } HMAP_FOR_EACH (p, node, &pmd->send_port_cache) { - if (!dp_packet_batch_is_empty(&p->output_pkts)) { - dp_netdev_pmd_flush_output_on_port(pmd, p); + if (!dp_packet_batch_is_empty(&p->output_pkts) + && (force || pmd->ctx.now >= p->flush_time)) { + output_cnt += dp_netdev_pmd_flush_output_on_port(pmd, p); } } + return output_cnt; } static int @@ -3323,7 +3368,7 @@ dp_netdev_process_rxq_port(struct dp_netdev_pmd_thread *pmd, { struct dp_packet_batch batch; int error; - int batch_cnt = 0; + int batch_cnt = 0, output_cnt = 0; dp_packet_batch_init(&batch); error = netdev_rxq_recv(rx, &batch); @@ -3333,7 +3378,7 @@ dp_netdev_process_rxq_port(struct dp_netdev_pmd_thread *pmd, batch_cnt = batch.count; dp_netdev_input(pmd, &batch, port_no); - dp_netdev_pmd_flush_output_packets(pmd); + output_cnt = dp_netdev_pmd_flush_output_packets(pmd, false); } else if (error != EAGAIN && error != EOPNOTSUPP) { static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); @@ -3341,7 +3386,7 @@ dp_netdev_process_rxq_port(struct dp_netdev_pmd_thread *pmd, netdev_rxq_get_name(rx), ovs_strerror(error)); } - return batch_cnt; + return batch_cnt + output_cnt; } static struct tx_port * @@ -3951,7 +3996,8 @@ dpif_netdev_run(struct dpif *dpif) struct dp_netdev *dp = get_dp_netdev(dpif); struct dp_netdev_pmd_thread *non_pmd; uint64_t new_tnl_seq; - int process_packets = 0; + int process_packets; + bool need_to_flush = true; ovs_mutex_lock(&dp->port_mutex); non_pmd = dp_netdev_get_pmd(dp, NON_PMD_CORE_ID); @@ -3971,11 +4017,25 @@ dpif_netdev_run(struct dpif *dpif) process_packets ? PMD_CYCLES_PROCESSING : PMD_CYCLES_IDLE); + if (process_packets) { + need_to_flush = false; + } } } } + if (need_to_flush) { + /* We didn't receive anything in the process loop. + * Check if we need to send something. + * There was no time updates on current iteration. */ + pmd_thread_ctx_time_update(non_pmd); + process_packets = dp_netdev_pmd_flush_output_packets(non_pmd, + false); + cycles_count_intermediate(non_pmd, NULL, process_packets + ? PMD_CYCLES_PROCESSING + : PMD_CYCLES_IDLE); + } + cycles_count_end(non_pmd, PMD_CYCLES_IDLE); - pmd_thread_ctx_time_update(non_pmd); dpif_netdev_xps_revalidate_pmd(non_pmd, false); ovs_mutex_unlock(&dp->non_pmd_mutex); @@ -4026,6 +4086,8 @@ pmd_free_cached_ports(struct dp_netdev_pmd_thread *pmd) { struct tx_port *tx_port_cached; + /* Flush all the queued packets. */ + dp_netdev_pmd_flush_output_packets(pmd, true); /* Free all used tx queue ids. */ dpif_netdev_xps_revalidate_pmd(pmd, true); @@ -4124,7 +4186,6 @@ pmd_thread_main(void *f_) bool exiting; int poll_cnt; int i; - int process_packets = 0; poll_list = NULL; @@ -4154,6 +4215,9 @@ reload: cycles_count_start(pmd); for (;;) { + int process_packets; + bool need_to_flush = true; + for (i = 0; i < poll_cnt; i++) { process_packets = dp_netdev_process_rxq_port(pmd, poll_list[i].rxq->rx, @@ -4161,6 +4225,20 @@ reload: cycles_count_intermediate(pmd, poll_list[i].rxq, process_packets ? PMD_CYCLES_PROCESSING : PMD_CYCLES_IDLE); + if (process_packets) { + need_to_flush = false; + } + } + + if (need_to_flush) { + /* We didn't receive anything in the process loop. + * Check if we need to send something. + * There was no time updates on current iteration. */ + pmd_thread_ctx_time_update(pmd); + process_packets = dp_netdev_pmd_flush_output_packets(pmd, false); + cycles_count_intermediate(pmd, NULL, + process_packets ? PMD_CYCLES_PROCESSING + : PMD_CYCLES_IDLE); } if (lc++ > 1024) { @@ -4169,9 +4247,6 @@ reload: lc = 0; coverage_try_clear(); - /* It's possible that the time was not updated on current - * iteration, if there were no received packets. */ - pmd_thread_ctx_time_update(pmd); dp_netdev_pmd_try_optimize(pmd, poll_list, poll_cnt); if (!ovsrcu_try_quiesce()) { emc_cache_slow_sweep(&pmd->flow_cache); @@ -4257,7 +4332,7 @@ dp_netdev_run_meter(struct dp_netdev *dp, struct dp_packet_batch *packets_, memset(exceeded_rate, 0, cnt * sizeof *exceeded_rate); /* All packets will hit the meter at the same time. */ - long_delta_t = (now - meter->used); /* msec */ + long_delta_t = (now - meter->used) / 1000; /* msec */ /* Make sure delta_t will not be too large, so that bucket will not * wrap around below. */ @@ -4413,7 +4488,7 @@ dpif_netdev_meter_set(struct dpif *dpif, ofproto_meter_id *meter_id, meter->flags = config->flags; meter->n_bands = config->n_bands; meter->max_delta_t = 0; - meter->used = time_msec(); + meter->used = time_usec(); /* set up bands */ for (i = 0; i < config->n_bands; ++i) { @@ -4611,6 +4686,7 @@ dp_netdev_configure_pmd(struct dp_netdev_pmd_thread *pmd, struct dp_netdev *dp, pmd->core_id = core_id; pmd->numa_id = numa_id; pmd->need_reload = false; + pmd->n_output_batches = 0; ovs_refcount_init(&pmd->ref_cnt); latch_init(&pmd->exit_latch); @@ -4798,6 +4874,7 @@ dp_netdev_add_port_tx_to_pmd(struct dp_netdev_pmd_thread *pmd, tx->port = port; tx->qid = -1; + tx->flush_time = 0LL; dp_packet_batch_init(&tx->output_pkts); hmap_insert(&pmd->tx_ports, &tx->node, hash_port_no(tx->port->port_no)); @@ -4961,7 +5038,7 @@ packet_batch_per_flow_execute(struct packet_batch_per_flow *batch, struct dp_netdev_flow *flow = batch->flow; dp_netdev_flow_used(flow, batch->array.count, batch->byte_count, - batch->tcp_flags, pmd->ctx.now); + batch->tcp_flags, pmd->ctx.now / 1000); actions = dp_netdev_flow_get_actions(flow); @@ -5336,7 +5413,7 @@ dpif_netdev_xps_revalidate_pmd(const struct dp_netdev_pmd_thread *pmd, continue; } interval = pmd->ctx.now - tx->last_used; - if (tx->qid >= 0 && (purge || interval >= XPS_TIMEOUT_MS)) { + if (tx->qid >= 0 && (purge || interval >= XPS_TIMEOUT)) { port = tx->port; ovs_mutex_lock(&port->txq_used_mutex); port->txq_used[tx->qid]--; @@ -5357,7 +5434,7 @@ dpif_netdev_xps_get_tx_qid(const struct dp_netdev_pmd_thread *pmd, interval = pmd->ctx.now - tx->last_used; tx->last_used = pmd->ctx.now; - if (OVS_LIKELY(tx->qid >= 0 && interval < XPS_TIMEOUT_MS)) { + if (OVS_LIKELY(tx->qid >= 0 && interval < XPS_TIMEOUT)) { return tx->qid; } @@ -5489,12 +5566,16 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_, dp_netdev_pmd_flush_output_on_port(pmd, p); } #endif - if (OVS_UNLIKELY(dp_packet_batch_size(&p->output_pkts) - + dp_packet_batch_size(packets_) > NETDEV_MAX_BURST)) { - /* Some packets was generated while input batch processing. - * Flush here to avoid overflow. */ + if (dp_packet_batch_size(&p->output_pkts) + + dp_packet_batch_size(packets_) > NETDEV_MAX_BURST) { + /* Flush here to avoid overflow. */ dp_netdev_pmd_flush_output_on_port(pmd, p); } + + if (dp_packet_batch_is_empty(&p->output_pkts)) { + pmd->n_output_batches++; + } + DP_PACKET_BATCH_FOR_EACH (packet, packets_) { dp_packet_batch_add(&p->output_pkts, packet); } @@ -5735,7 +5816,7 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_, conntrack_execute(&dp->conntrack, packets_, aux->flow->dl_type, force, commit, zone, setmark, setlabel, helper, - nat_action_info_ref, pmd->ctx.now); + nat_action_info_ref, pmd->ctx.now / 1000); break; } diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml index c145e1a..ef34fe6 100644 --- a/vswitchd/vswitch.xml +++ b/vswitchd/vswitch.xml @@ -344,6 +344,22 @@

+ +

+ Specifies the time in microseconds that a packet can wait in output + batch for sending i.e. amount of time that packet can spend in an + intermediate output queue before sending to netdev. + This option can be used to configure balance between throughput + and latency. Lower values decreases latency while higher values + may be useful to achieve higher performance. +

+

+ Defaults to 0 i.e. instant packet sending (latency optimized). +

+
+

From patchwork Fri Dec 1 15:44:33 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 843558 X-Patchwork-Delegate: ian.stokes@intel.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.b="rf/sXbEC"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ypJdN2WNFz9s9Y for ; Sat, 2 Dec 2017 02:50:32 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 27D1FCA6; Fri, 1 Dec 2017 15:45:05 +0000 (UTC) X-Original-To: ovs-dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id AF8FECA4 for ; Fri, 1 Dec 2017 15:45:03 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 412E547E for ; Fri, 1 Dec 2017 15:45:03 +0000 (UTC) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20171201154501euoutp027caf46f1e744050e3d9d68c9ef60ed92~8NiOJaA--3160831608euoutp02p; Fri, 1 Dec 2017 15:45:01 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20171201154501euoutp027caf46f1e744050e3d9d68c9ef60ed92~8NiOJaA--3160831608euoutp02p DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1512143101; bh=HGu3gADjHT24MRaGblJDX9Q818hdpNEVioV3sgIV23o=; h=From:To:Cc:Subject:Date:In-reply-to:References:From; b=rf/sXbECYlo62d+JWHdEUqJzWV7/qFm32jUpsH9zQhQvsSjskaYzAGCqMstfiDfHd T/9I+nL7TyN/SV5cZUq5fRunhtPdZB5ScnHLZz90qXyWXEQUgmQOKIi399pciXBM1k 3RprHUU1844hPN5aV+53xzM0GNhcSZq0ufdAsYtU= Received: from eusmges2.samsung.com (unknown [203.254.199.241]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20171201154500eucas1p18a07320b1a5e98393621267e112ec74a~8NiNa4uBn2809828098eucas1p1j; Fri, 1 Dec 2017 15:45:00 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges2.samsung.com (EUCPMTA) with SMTP id 2F.77.12907.CF8712A5; Fri, 1 Dec 2017 15:45:00 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171201154459eucas1p25ea8dba3d672c6c93e971a3accfe1240~8NiMrpblf1819018190eucas1p2Y; Fri, 1 Dec 2017 15:44:59 +0000 (GMT) X-AuditID: cbfec7f1-f793a6d00000326b-3e-5a2178fc501a Received: from eusync3.samsung.com ( [203.254.199.213]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 64.82.18832.BF8712A5; Fri, 1 Dec 2017 15:44:59 +0000 (GMT) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0P0A00BWSH2B5A50@eusync3.samsung.com>; Fri, 01 Dec 2017 15:44:59 +0000 (GMT) From: Ilya Maximets To: ovs-dev@openvswitch.org, Bhanuprakash Bodireddy Date: Fri, 01 Dec 2017 18:44:33 +0300 Message-id: <1512143073-22347-8-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1512143073-22347-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrDIsWRmVeSWpSXmKPExsWy7djPc7p/KhSjDG7fZLNY/YvTYuczZYuW /pnMFneu/GSzmPb5NrvFlfaf7BYbH55ltTjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKsYA1igum5TUnMyy1CJ9uwSujINHXzIVfBar2P/1HUsD40SBLkYODgkB E4kPt+u6GDmBTDGJC/fWs4HYQgJLGSUOzsvrYuQCsj8zSuzb+JENoshE4sCPjUwQiWWMEj8m XIRympkk5ryfyQ5SxSagI3Fq9RFGEFtEIELiwfdZ7CBFzAKnmSTebFrEDJIQFnCRmHHoJBOI zSKgKvFyxU8wm1fATeLvwY3sEOvkJG6e62QGOZVTwF3iyG9xkDkSAkvYJK6dPMEIUeMi0Xl4 M5QtLPHq+BaoXhmJzo6DTBANzYwSDasuMUI4ExglvjQvZ4Kospc4dfMqmM0swCcxadt0ZkjA 8Ep0tAlBlHhIXDw6A+p/R4mJs88yQ7w8i1HixZezrBMYpRcwMqxiFEktLc5NTy020itOzC0u zUvXS87P3cQIjOPT/45/3MH4/oTVIUYBDkYlHl6GcMUoIdbEsuLK3EOMEhzMSiK8WSVAId6U xMqq1KL8+KLSnNTiQ4zSHCxK4ry2UW2RQgLpiSWp2ampBalFMFkmDk6pBkavaXZnmHbWCUTx xbAvsrIOXMZ0JzKjcMPsXUy934VqLH64SuY5Oq9/pHSn+lPI0u1/I2pzagsCs747iwrunmRy 1O3jtOUZOhnfO/Z/10nX+3I+XtZt0sPUiY1zb/722jEhRaxTYuOVrhvLa5nWmno+CtDx2OLl VCq6NoHtgMOteTVGF48W5CixFGckGmoxFxUnAgA4cVQL3wIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrILMWRmVeSWpSXmKPExsVy+t/xq7q/KxSjDE6dV7RY/YvTYuczZYuW /pnMFneu/GSzmPb5NrvFlfaf7BYbH55ltTjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKsYA1igum5TUnMyy1CJ9uwSujINHXzIVfBar2P/1HUsD40SBLkZODgkB E4kDPzYyQdhiEhfurWfrYuTiEBJYwihxqX0eK4TTyiRxqXcqWBWbgI7EqdVHGEFsEYEIiZY5 6xlBipgFzjJJtJ4+zgaSEBZwkZhx6CRYA4uAqsTLFT/BbF4BN4m/BzeyQ6yTk7h5rpO5i5GD g1PAXeLIb3GQsBBQyf7dOxgnMPIuYGRYxSiSWlqcm55bbKhXnJhbXJqXrpecn7uJERhw2479 3LyD8dLG4EOMAhyMSjy8K0IUo4RYE8uKK3MPMUpwMCuJ8GaVAIV4UxIrq1KL8uOLSnNSiw8x SnOwKInz9u5ZHSkkkJ5YkpqdmlqQWgSTZeLglGpgXLjiffqlvHTGb6WPZ99c8TFK/eb7Ss26 Q1qxd9axcPYc3jp33USWh36tZsX2e3w3yNjFpJfMW3rX7+OKNQcUrX1smF3L1NYLF/EaNSQz u++7teF4y9qsqtYJWYKKOtekE7aY/71v+35q/HdN2dCZARLXa4t2skne7T72J8t4YcY9w5Zl vdbVSizFGYmGWsxFxYkAoLgaJDQCAAA= X-CMS-MailID: 20171201154459eucas1p25ea8dba3d672c6c93e971a3accfe1240 X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20171201154459eucas1p25ea8dba3d672c6c93e971a3accfe1240 X-RootMTR: 20171201154459eucas1p25ea8dba3d672c6c93e971a3accfe1240 References: <1512143073-22347-1-git-send-email-i.maximets@samsung.com> X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Heetae Ahn , Ilya Maximets Subject: [ovs-dev] [PATCH v6 7/7] dpif-netdev: Count sent packets and batches. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org Acked-by: Eelco Chaudron Signed-off-by: Ilya Maximets --- lib/dpif-netdev.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index da6b7b8..b2b651b 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -344,6 +344,8 @@ enum dp_stat_type { DP_STAT_LOST, /* Packets not passed up to the client. */ DP_STAT_LOOKUP_HIT, /* Number of subtable lookups for flow table hits */ + DP_STAT_SENT_PKTS, /* Packets that has been sent. */ + DP_STAT_SENT_BATCHES, /* Number of batches sent. */ DP_N_STATS }; @@ -515,6 +517,9 @@ struct dp_netdev_pmd_cycles { atomic_ullong n[PMD_N_CYCLES]; }; +static void dp_netdev_count_packet(struct dp_netdev_pmd_thread *, + enum dp_stat_type type, int cnt); + struct polled_queue { struct dp_netdev_rxq *rxq; odp_port_t port_no; @@ -881,6 +886,7 @@ pmd_info_show_stats(struct ds *reply, { unsigned long long total_packets; uint64_t total_cycles = 0; + double lookups_per_hit = 0, packets_per_batch = 0; int i; /* These loops subtracts reference values ('*_zero') from the counters. @@ -922,15 +928,23 @@ pmd_info_show_stats(struct ds *reply, } ds_put_cstr(reply, ":\n"); + if (stats[DP_STAT_MASKED_HIT] > 0) { + lookups_per_hit = stats[DP_STAT_LOOKUP_HIT] + / (double) stats[DP_STAT_MASKED_HIT]; + } + if (stats[DP_STAT_SENT_BATCHES] > 0) { + packets_per_batch = stats[DP_STAT_SENT_PKTS] + / (double) stats[DP_STAT_SENT_BATCHES]; + } + ds_put_format(reply, "\temc hits:%llu\n\tmegaflow hits:%llu\n" "\tavg. subtable lookups per hit:%.2f\n" - "\tmiss:%llu\n\tlost:%llu\n", + "\tmiss:%llu\n\tlost:%llu\n" + "\tavg. packets per output batch: %.2f\n", stats[DP_STAT_EXACT_HIT], stats[DP_STAT_MASKED_HIT], - stats[DP_STAT_MASKED_HIT] > 0 - ? (1.0*stats[DP_STAT_LOOKUP_HIT])/stats[DP_STAT_MASKED_HIT] - : 0, - stats[DP_STAT_MISS], stats[DP_STAT_LOST]); + lookups_per_hit, stats[DP_STAT_MISS], stats[DP_STAT_LOST], + packets_per_batch); if (total_cycles == 0) { return; @@ -3338,6 +3352,9 @@ dp_netdev_pmd_flush_output_on_port(struct dp_netdev_pmd_thread *pmd, ovs_assert(pmd->n_output_batches > 0); pmd->n_output_batches--; + dp_netdev_count_packet(pmd, DP_STAT_SENT_PKTS, output_cnt); + dp_netdev_count_packet(pmd, DP_STAT_SENT_BATCHES, 1); + return output_cnt; }