From patchwork Thu Oct 5 15:05:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 821872 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=) 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 3y7GMT2CZ2z9sNw for ; Fri, 6 Oct 2017 02:07:01 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id CB44B99F; Thu, 5 Oct 2017 15:06:24 +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 2ACE2989 for ; Thu, 5 Oct 2017 15:06:23 +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 9B8643FA for ; Thu, 5 Oct 2017 15:06:21 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20171005150619euoutp01ececc9861ecc11a2040aae25c8b6e2c6~qtPKfjMxb1669816698euoutp01j; Thu, 5 Oct 2017 15:06:19 +0000 (GMT) Received: from eusmges4.samsung.com (unknown [203.254.199.244]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171005150618eucas1p2449b67754fa02faf7d9da87c4a607e49~qtPJwgCv92619726197eucas1p2Y; Thu, 5 Oct 2017 15:06:18 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges4.samsung.com (EUCPMTA) with SMTP id 00.6D.12944.A6A46D95; Thu, 5 Oct 2017 16:06:18 +0100 (BST) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20171005150618eucas1p13e171f7a9feb7cb7b7a4a8b6fd24b905~qtPJJdlhu1417814178eucas1p1r; Thu, 5 Oct 2017 15:06:18 +0000 (GMT) X-AuditID: cbfec7f4-f79ab6d000003290-29-59d64a6a8c37 Received: from eusync2.samsung.com ( [203.254.199.212]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 2E.64.20118.96A46D95; Thu, 5 Oct 2017 16:06:17 +0100 (BST) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OXC0096ZVA4TQ80@eusync2.samsung.com>; Thu, 05 Oct 2017 16:06:17 +0100 (BST) From: Ilya Maximets To: ovs-dev@openvswitch.org, Bhanuprakash Bodireddy Date: Thu, 05 Oct 2017 18:05:56 +0300 Message-id: <1507215962-17692-2-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1507215962-17692-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrPIsWRmVeSWpSXmKPExsWy7djP87pZXtciDebekbBY/YvTYuczZYuW /pnMFs9fLGS2uHPlJ5vFtM+32S2utP9ktzjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKkaPd/PfsgWwRXHZpKTmZJalFunbJXBlPLv6jq3g9kTGihs3elgbGH+k dTFycEgImEi07Q3qYuQEMsUkLtxbzwZiCwksZZR49VGxi5ELyP7MKHHzyGRmmPrZrxIg4ssY JT6+eMAO4TQzSaz/Np8dpJtNQEfi1OojjCC2iECExIPvs8DizAInmSSezQ0FsYUFAiReLdzI DGKzCKhKNM26AlbDK+AmMXvDJ3aIi+Qkbp7rBKvhFHCXuLDjMyNEfAubxKvlWhC2i8TcKW+h 6oUlXh3fAmXLSFye3M0CcpyEQDOjRMOqS4wQzgRGiS/Ny5kgquwlTt28ygRxHZ/EpG3Tod7k lehoE4Io8ZC4NnMbVLmjxOYdv6FBNItR4scbtQmM0gsYGVYxiqSWFuempxab6BUn5haX5qXr JefnbmIERvPpf8e/7GBcfMzqEKMAB6MSDy/DgyuRQqyJZcWVuYcYJTiYlUR4G12vRQrxpiRW VqUW5ccXleakFh9ilOZgURLntY1qixQSSE8sSc1OTS1ILYLJMnFwSjUwFs7jsPzlpuEbMM1y V//8s8kVVw+vfL3ce3/2tO9b2+7fy52dMidF9/m7M2p2tYLuc9bGRemnnH7rn/GHY57H0f3s hSr73oQ9imFmNDAQ3LDTkvnov+mz1s5cKfOVc6bXhS8X06VfTFxxIbzWySzqZygHy24r9pfe eWys0+7ME0wIMUxbcCIwU4mlOCPRUIu5qDgRAPkVPK/iAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrOLMWRmVeSWpSXmKPExsVy+t/xK7qZXtciDR4etLFY/YvTYuczZYuW /pnMFs9fLGS2uHPlJ5vFtM+32S2utP9ktzjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKkaPd/PfsgWwRXHZpKTmZJalFunbJXBlPLv6jq3g9kTGihs3elgbGH+k dTFycEgImEjMfpXQxcgJZIpJXLi3nq2LkYtDSGAJo8TdN/fYIZxWJomd39pYQKrYBHQkTq0+ wghiiwhESLTMWc8IUsQscJpJon/xeVaQhLCAn8T25ceYQGwWAVWJpllX2EFsXgE3idkbPrFD rJOTuHmukxnE5hRwl7iw4zPYUCGgmumL2pgmMPIuYGRYxSiSWlqcm55bbKRXnJhbXJqXrpec n7uJERh824793LKDsetd8CFGAQ5GJR5ehgdXIoVYE8uKK3MPMUpwMCuJ8Da6XosU4k1JrKxK LcqPLyrNSS0+xCjNwaIkztu7Z3WkkEB6YklqdmpqQWoRTJaJg1OqgTFzr8P7auWO+fz+VcIT /zQ5e2/brHvGYRqf3kHzs0JbJtg3up8S/F3vErSqJHbrrEUBYbF+u/n2OOtnXbviYN4stmbp k3fPlDX3vPC++KlGmcl6zvPEudxOB539Axet+hfMkheslfZyzZWLAZWfZ/xzX+CkvHbam17l og+N5/w/vVx6bLpU4n8lluKMREMt5qLiRADN0qSQOgIAAA== X-CMS-MailID: 20171005150618eucas1p13e171f7a9feb7cb7b7a4a8b6fd24b905 X-Msg-Generator: CA X-Sender-IP: 182.198.249.180 X-Local-Sender: =?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1B?= =?utf-8?b?7IK87ISx7KCE7J6QG0xlYWRpbmcgRW5naW5lZXI=?= X-Global-Sender: =?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1BSamsu?= =?utf-8?q?ng_Electronics=1BLeading_Engineer?= X-Sender-Code: =?utf-8?q?C10=1BCISHQ=1BC10GD01GD010154?= CMS-TYPE: 201P X-CMS-RootMailID: 20171005150618eucas1p13e171f7a9feb7cb7b7a4a8b6fd24b905 X-RootMTR: 20171005150618eucas1p13e171f7a9feb7cb7b7a4a8b6fd24b905 References: <1507215962-17692-1-git-send-email-i.maximets@samsung.com> X-Spam-Status: No, score=-5.0 required=5.0 tests=RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD autolearn=disabled 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 v4 1/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 | 129 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 73 insertions(+), 56 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index d5eb830..1a3d8b4 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -528,6 +528,19 @@ 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. */ + long long now; + /* Used to count cycles. See 'cycles_count_end()' */ + unsigned long long last_cycles; +}; + +static void pmd_thread_ctx_time_update(struct dp_netdev_pmd_thread *); + /* 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 @@ -583,8 +596,8 @@ struct dp_netdev_pmd_thread { /* Cycles counters */ struct dp_netdev_pmd_cycles cycles; - /* Used to count cicles. See 'cycles_counter_end()' */ - unsigned long long last_cycles; + /* Current context of the PMD thread. */ + struct dp_netdev_pmd_thread_ctx ctx; struct latch exit_latch; /* For terminating the pmd thread. */ struct seq *reload_seq; @@ -657,8 +670,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 *, @@ -718,9 +730,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); @@ -764,6 +776,12 @@ emc_cache_slow_sweep(struct emc_cache *flow_cache) flow_cache->sweep_idx = (flow_cache->sweep_idx + 1) & EM_FLOW_HASH_MASK; } +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) @@ -2912,6 +2930,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 @@ -2924,8 +2945,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); @@ -3146,7 +3166,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' */ @@ -3156,7 +3176,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); } @@ -3169,8 +3189,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)) { @@ -3871,7 +3891,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); @@ -3922,7 +3943,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); @@ -4515,8 +4536,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_interval = time_msec() + PMD_RXQ_INTERVAL_LEN; + pmd_thread_ctx_time_update(pmd); + pmd->next_optimization = pmd->ctx.now + DPCLS_OPTIMIZATION_INTERVAL; + pmd->rxq_interval = pmd->ctx.now + PMD_RXQ_INTERVAL_LEN; hmap_init(&pmd->poll_list); hmap_init(&pmd->tx_ports); hmap_init(&pmd->tnl_port_cache); @@ -4845,19 +4867,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 @@ -4965,7 +4986,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; @@ -5004,7 +5025,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)) { @@ -5032,9 +5053,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) @@ -5091,7 +5112,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); @@ -5144,18 +5165,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 @@ -5173,7 +5195,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); } } @@ -5194,7 +5216,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; }; @@ -5218,7 +5239,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; @@ -5228,7 +5249,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); @@ -5241,18 +5262,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; @@ -5280,7 +5297,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)); @@ -5331,7 +5348,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; @@ -5344,7 +5361,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); } @@ -5360,7 +5377,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) { @@ -5372,7 +5388,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; } @@ -5455,7 +5471,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) { @@ -5616,13 +5632,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: @@ -5651,10 +5667,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); @@ -5981,9 +5996,10 @@ 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_interval) { + pmd_thread_ctx_time_update(pmd); + + if (pmd->ctx.now > pmd->rxq_interval) { /* 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, @@ -5993,10 +6009,10 @@ dp_netdev_pmd_try_optimize(struct dp_netdev_pmd_thread *pmd, 0); } /* Start new measuring interval */ - pmd->rxq_interval = now + PMD_RXQ_INTERVAL_LEN; + pmd->rxq_interval = 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)) { @@ -6006,7 +6022,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 Thu Oct 5 15:05:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 821873 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=) 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 3y7GNg0G1Rz9sNw for ; Fri, 6 Oct 2017 02:08:03 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 2C5869BA; Thu, 5 Oct 2017 15:06:27 +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 EA80898A for ; Thu, 5 Oct 2017 15:06:24 +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 66AC31AE for ; Thu, 5 Oct 2017 15:06:24 +0000 (UTC) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20171005150622euoutp01e7b5362b09b38aaa53d545a6f931da06~qtPNCiXv91769417694euoutp01F; Thu, 5 Oct 2017 15:06:22 +0000 (GMT) Received: from eusmges4.samsung.com (unknown [203.254.199.244]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20171005150621eucas1p1485156cf081ae00be8eb5a182d03fbc3~qtPMbRfWu2252822528eucas1p1O; Thu, 5 Oct 2017 15:06:21 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges4.samsung.com (EUCPMTA) with SMTP id E0.6D.12944.D6A46D95; Thu, 5 Oct 2017 16:06:21 +0100 (BST) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171005150620eucas1p27139dc5c4a990c514afdf864366656f0~qtPLnh09w0040500405eucas1p2G; Thu, 5 Oct 2017 15:06:20 +0000 (GMT) X-AuditID: cbfec7f4-f79ab6d000003290-2d-59d64a6d7897 Received: from eusync2.samsung.com ( [203.254.199.212]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id AC.02.18832.C6A46D95; Thu, 5 Oct 2017 16:06:20 +0100 (BST) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OXC0096ZVA4TQ80@eusync2.samsung.com>; Thu, 05 Oct 2017 16:06:20 +0100 (BST) From: Ilya Maximets To: ovs-dev@openvswitch.org, Bhanuprakash Bodireddy Date: Thu, 05 Oct 2017 18:05:57 +0300 Message-id: <1507215962-17692-3-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1507215962-17692-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrEIsWRmVeSWpSXmKPExsWy7djP87q5XtciDZquCFis/sVpsfOZskVL /0xmi+cvFjJb3Lnyk81i2ufb7BZX2n+yWxz5fprRYu2hD+wWcz89Z3Tg8vj19Sqbx+I9L5k8 nt38z+jxfh+Q27dlFaPHu/lv2QLYorhsUlJzMstSi/TtErgy1jxLLlhvUvHl5Bn2BsZlal2M nBwSAiYSs2/eY4OwxSQu3FsPZHNxCAksZZT42b6cGcL5zChx6PJxVpiOSROPsUIkljFK/Dp1 hh3CaWaSON6yBKyKTUBH4tTqI4wgtohAhMSD77PYQWxmgZNMEs/mhoLYwgI2El8PHwKrZxFQ ldg4fTKYzSvgJrFuz0aom+Qkbp7rZAaxOQXcJS7s+MwIskxCYAWbxPt5fVAnuUjsWrCGBcIW lnh1fAs7hC0j0dlxkAmioZlRomHVJajuCYwSX5qXM0FU2UucunmVCeI8PolJ26YDreMAivNK dLQJQZR4SOx8uxlqmaPEzMWToP6fxSixaUE/+wRG6QWMDKsYRVJLi3PTU4tN9IoTc4tL89L1 kvNzNzECY/r0v+NfdjAuPmZ1iFGAg1GJh5fhwZVIIdbEsuLK3EOMEhzMSiK8ja7XIoV4UxIr q1KL8uOLSnNSiw8xSnOwKInz2ka1RQoJpCeWpGanphakFsFkmTg4pRoYiwqKP1wPXfPD2r3J XG1Z17EP3rJGfz1K895bB+ZwHSrgZRGMeMJcp6n1yjSOhXm596NLszJk1kcu1Jn8rMfs6/HA NMFHuzJ/My7rPuI7QWgxh85eu6K9qbIiabIlX/UvLhY/+OTlmlkFyw4FOE2YG8ie4rK4TjX9 CO/UhiPcYZMUZnZMmx+oxFKckWioxVxUnAgA9RmwEeUCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrKLMWRmVeSWpSXmKPExsVy+t/xK7o5XtciDVbMULdY/YvTYuczZYuW /pnMFs9fLGS2uHPlJ5vFtM+32S2utP9ktzjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKkaPd/PfsgWwRXHZpKTmZJalFunbJXBlrHmWXLDepOLLyTPsDYzL1LoY OTkkBEwkJk08xgphi0lcuLeerYuRi0NIYAmjxIanV5lBEkICrUwSv7tTQWw2AR2JU6uPMILY IgIREi1z1jOCNDALnGaS6F98HmySsICNxNfDh8BsFgFViY3TJ4PZvAJuEuv2bGSD2CYncfNc J9gCTgF3iQs7PjNCLHOTmL6ojWkCI+8CRoZVjCKppcW56bnFhnrFibnFpXnpesn5uZsYgYG3 7djPzTsYL20MPsQowMGoxMPrsfVqpBBrYllxZe4hRgkOZiUR3kbXa5FCvCmJlVWpRfnxRaU5 qcWHGKU5WJTEeXv3rI4UEkhPLEnNTk0tSC2CyTJxcEo1MOZzFb9n/lX5aMOeTavKqxmW31E3 1Xb7d2iX0ftDB0Tr8znMV2y09F/75bNRxR/nKwIHGf5OuOyS88X1BMe53X9z40WtDsx/Gdz/ SPNA605Ld0G5zNgCi97VF68Waf/z8briWPxWccZs7gdCnL73925cbx3wxiJHX46p6B3X4kem RcrMaufaVJVYijMSDbWYi4oTAaUFX1o4AgAA X-CMS-MailID: 20171005150620eucas1p27139dc5c4a990c514afdf864366656f0 X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1B?= =?utf-8?b?7IK87ISx7KCE7J6QG0xlYWRpbmcgRW5naW5lZXI=?= X-Global-Sender: =?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1BSamsu?= =?utf-8?q?ng_Electronics=1BLeading_Engineer?= X-Sender-Code: =?utf-8?q?C10=1BCISHQ=1BC10GD01GD010154?= CMS-TYPE: 201P X-CMS-RootMailID: 20171005150620eucas1p27139dc5c4a990c514afdf864366656f0 X-RootMTR: 20171005150620eucas1p27139dc5c4a990c514afdf864366656f0 References: <1507215962-17692-1-git-send-email-i.maximets@samsung.com> X-Spam-Status: No, score=-5.0 required=5.0 tests=RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD autolearn=disabled 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 v4 2/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 Acked-by: Eelco Chaudron --- lib/dpif-netdev.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 64 insertions(+), 11 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 1a3d8b4..c6f5c23 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 @@ -706,6 +707,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); @@ -2946,6 +2950,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); @@ -3232,6 +3237,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, @@ -3245,9 +3280,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); @@ -4711,6 +4748,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; @@ -5168,8 +5206,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); @@ -5383,18 +5419,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 Thu Oct 5 15:05:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 821874 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=) 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 3y7GPS2Z3Mz9t2V for ; Fri, 6 Oct 2017 02:08:44 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 34D32A73; Thu, 5 Oct 2017 15:06:31 +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 1B393A59 for ; Thu, 5 Oct 2017 15:06:29 +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 CA4B53F2 for ; Thu, 5 Oct 2017 15:06:27 +0000 (UTC) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20171005150625euoutp01c6698837f98815b047f2983423f69122~qtPQDG-un1770317703euoutp01B; Thu, 5 Oct 2017 15:06:25 +0000 (GMT) Received: from eusmges5.samsung.com (unknown [203.254.199.245]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20171005150624eucas1p10aa2be5ab18de7f9148908294fd9486f~qtPPE8Eet2252922529eucas1p1F; Thu, 5 Oct 2017 15:06:24 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges5.samsung.com (EUCPMTA) with SMTP id B7.27.12743.07A46D95; Thu, 5 Oct 2017 16:06:24 +0100 (BST) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171005150623eucas1p231b1ff9cd68ac1a59ae870c6bf7fcaf4~qtPOdzsBo0934209342eucas1p2Y; Thu, 5 Oct 2017 15:06:23 +0000 (GMT) X-AuditID: cbfec7f5-f79d06d0000031c7-32-59d64a704a8e Received: from eusync2.samsung.com ( [203.254.199.212]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 6E.02.18832.F6A46D95; Thu, 5 Oct 2017 16:06:23 +0100 (BST) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OXC0096ZVA4TQ80@eusync2.samsung.com>; Thu, 05 Oct 2017 16:06:23 +0100 (BST) From: Ilya Maximets To: ovs-dev@openvswitch.org, Bhanuprakash Bodireddy Date: Thu, 05 Oct 2017 18:05:58 +0300 Message-id: <1507215962-17692-4-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1507215962-17692-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrMIsWRmVeSWpSXmKPExsWy7djP87oFXtciDR73s1us/sVpsfOZskVL /0xmi+cvFjJb3Lnyk81i2ufb7BZX2n+yWxz5fprRYu2hD+wWcz89Z3Tg8vj19Sqbx+I9L5k8 nt38z+jxfh+Q27dlFaPHu/lv2QLYorhsUlJzMstSi/TtErgyJj/qYimYXV5xp2sucwPjxPAu Rk4OCQETiSOPulkgbDGJC/fWs3UxcnEICSxllFjde5YJwvnMKLGraTU7TMfq58ugEssYJd5u 3sUI4TQzSew608sIUsUmoCNxavURMFtEIELiwfdZYN3MAieZJJ7NDQWxhQUsJJp7VoLFWQRU Ja5OXgpWzyvgJrHn5lWobXISN891MoPYnALuEhd2fAZbJiGwhk3i/uWHzBBFLhLnV11jhbCF JV4d3wLVLCPR2XGQCaKhmVGiYdUlqO4JjBJfmpczQVTZS5y6eZUJ4jw+iUnbpgNN5QCK80p0 tAlBlHhItL6bxgZhO0rc3f8D6uVZjBKX7j1hnsAovYCRYRWjSGppcW56arGpXnFibnFpXrpe cn7uJkZgVJ/+d/zrDsalx6wOMQpwMCrx8DI8uBIpxJpYVlyZe4hRgoNZSYS30fVapBBvSmJl VWpRfnxRaU5q8SFGaQ4WJXFe26i2SCGB9MSS1OzU1ILUIpgsEwenVAOj1uwPU369Vzxkvt09 qftLVVBUyIIVkm4Ta5xS3s8VVzunknVW/WAkq6vgBBcRy4XRpb19jsfEGCuK7y4x2CmWdoF1 X+a2rwcTvpTvmcex7t/+cGajq5pnfs1YFjrV6P9pJb01IvO2F8Rdv5Pxgy9zG1vktTsZk2+v PP9i196eKyx65rOUmiYxKbEUZyQaajEXFScCAO/ELWTmAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGLMWRmVeSWpSXmKPExsVy+t/xK7r5XtciDea91rJY/YvTYuczZYuW /pnMFs9fLGS2uHPlJ5vFtM+32S2utP9ktzjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKkaPd/PfsgWwRXHZpKTmZJalFunbJXBlTH7UxVIwu7ziTtdc5gbGieFd jJwcEgImEqufL2OCsMUkLtxbzwZiCwksYZR4vUeoi5ELyG5lknjz9A0zSIJNQEfi1OojjCC2 iECERMuc9YwgRcwCp5kk+hefZwVJCAtYSDT3rGQHsVkEVCWuTl4K1sAr4Cax5+ZVdohtchI3 z3WCDeUUcJe4sOMzI8RmN4npi9qYJjDyLmBkWMUoklpanJueW2yoV5yYW1yal66XnJ+7iREY etuO/dy8g/HSxuBDjAIcjEo8vB5br0YKsSaWFVfmHmKU4GBWEuFtdL0WKcSbklhZlVqUH19U mpNafIhRmoNFSZy3d8/qSCGB9MSS1OzU1ILUIpgsEwenVAOjguiXjW0BSbHXYphcP35cZnhk eVeYl+IcUdMK668etVVnkrb/Xzvh7MO9mhXBcn2GCuvbk/9eZrK41n7t0KKH5w5vUJu99GrZ q8UHn+ok/ym+OkmoXGe+mYNcco39jMWzJbd8lVLaZdFlmWUcf/hezavAHR53NstJzL7nKDJd qMcp2uhhAqOgEktxRqKhFnNRcSIAg33rUzkCAAA= X-CMS-MailID: 20171005150623eucas1p231b1ff9cd68ac1a59ae870c6bf7fcaf4 X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1B?= =?utf-8?b?7IK87ISx7KCE7J6QG0xlYWRpbmcgRW5naW5lZXI=?= X-Global-Sender: =?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1BSamsu?= =?utf-8?q?ng_Electronics=1BLeading_Engineer?= X-Sender-Code: =?utf-8?q?C10=1BCISHQ=1BC10GD01GD010154?= CMS-TYPE: 201P X-CMS-RootMailID: 20171005150623eucas1p231b1ff9cd68ac1a59ae870c6bf7fcaf4 X-RootMTR: 20171005150623eucas1p231b1ff9cd68ac1a59ae870c6bf7fcaf4 References: <1507215962-17692-1-git-send-email-i.maximets@samsung.com> X-Spam-Status: No, score=-5.0 required=5.0 tests=RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD autolearn=disabled 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 v4 3/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 Acked-by: Eelco Chaudron --- lib/dpif-netdev.c | 2 +- lib/netdev-bsd.c | 4 ++-- lib/netdev-dpdk.c | 65 +++++++++++++++++++++------------------------------ 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, 42 insertions(+), 58 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index c6f5c23..166b73a 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -3251,7 +3251,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 8a4cdb3..4f243b5 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 c60f46f..011c6f7 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -279,7 +279,7 @@ struct dpdk_qos_ops { * For all QoS implementations it should always be non-null. */ int (*qos_run)(struct qos_conf *qos_conf, struct rte_mbuf **pkts, - int pkt_cnt, bool may_steal); + int pkt_cnt); }; /* dpdk_qos_ops for each type of user space QoS implementation */ @@ -1522,8 +1522,7 @@ netdev_dpdk_policer_pkt_handle(struct rte_meter_srtcm *meter, static int netdev_dpdk_policer_run(struct rte_meter_srtcm *meter, - struct rte_mbuf **pkts, int pkt_cnt, - bool may_steal) + struct rte_mbuf **pkts, int pkt_cnt) { int i = 0; int cnt = 0; @@ -1539,9 +1538,7 @@ netdev_dpdk_policer_run(struct rte_meter_srtcm *meter, } cnt++; } else { - if (may_steal) { - rte_pktmbuf_free(pkt); - } + rte_pktmbuf_free(pkt); } } @@ -1550,13 +1547,12 @@ netdev_dpdk_policer_run(struct rte_meter_srtcm *meter, static int ingress_policer_run(struct ingress_policer *policer, struct rte_mbuf **pkts, - int pkt_cnt, bool may_steal) + int pkt_cnt) { int cnt = 0; rte_spinlock_lock(&policer->policer_lock); - cnt = netdev_dpdk_policer_run(&policer->in_policer, pkts, - pkt_cnt, may_steal); + cnt = netdev_dpdk_policer_run(&policer->in_policer, pkts, pkt_cnt); rte_spinlock_unlock(&policer->policer_lock); return cnt; @@ -1660,7 +1656,7 @@ netdev_dpdk_vhost_rxq_recv(struct netdev_rxq *rxq, dropped = nb_rx; nb_rx = ingress_policer_run(policer, (struct rte_mbuf **) batch->packets, - nb_rx, true); + nb_rx); dropped -= nb_rx; } @@ -1699,7 +1695,7 @@ netdev_dpdk_rxq_recv(struct netdev_rxq *rxq, struct dp_packet_batch *batch) dropped = nb_rx; nb_rx = ingress_policer_run(policer, (struct rte_mbuf **) batch->packets, - nb_rx, true); + nb_rx); dropped -= nb_rx; } @@ -1717,14 +1713,13 @@ netdev_dpdk_rxq_recv(struct netdev_rxq *rxq, struct dp_packet_batch *batch) } static inline int -netdev_dpdk_qos_run(struct netdev_dpdk *dev, struct rte_mbuf **pkts, - int cnt, bool may_steal) +netdev_dpdk_qos_run(struct netdev_dpdk *dev, struct rte_mbuf **pkts, int cnt) { struct qos_conf *qos_conf = ovsrcu_get(struct qos_conf *, &dev->qos_conf); if (qos_conf) { rte_spinlock_lock(&qos_conf->lock); - cnt = qos_conf->ops->qos_run(qos_conf, pkts, cnt, may_steal); + cnt = qos_conf->ops->qos_run(qos_conf, pkts, cnt); rte_spinlock_unlock(&qos_conf->lock); } @@ -1797,8 +1792,8 @@ __netdev_dpdk_vhost_send(struct netdev *netdev, int qid, rte_spinlock_lock(&dev->tx_q[qid].tx_lock); cnt = netdev_dpdk_filter_packet_len(dev, cur_pkts, cnt); - /* Check has QoS has been configured for the netdev */ - cnt = netdev_dpdk_qos_run(dev, cur_pkts, cnt, true); + /* Check if QoS has been configured for the netdev. */ + cnt = netdev_dpdk_qos_run(dev, cur_pkts, cnt); dropped = total_pkts - cnt; do { @@ -1847,18 +1842,17 @@ dpdk_do_tx_copy(struct netdev *netdev, int qid, struct dp_packet_batch *batch) struct rte_mbuf *pkts[PKT_ARRAY_SIZE]; uint32_t cnt = batch_cnt; uint32_t dropped = 0; + uint32_t txcnt = 0; if (dev->type != DPDK_DEV_VHOST) { /* Check if QoS has been configured for this netdev. */ cnt = netdev_dpdk_qos_run(dev, (struct rte_mbuf **) batch->packets, - batch_cnt, false); + batch_cnt); dropped += batch_cnt - cnt; } dp_packet_batch_apply_cutlen(batch); - uint32_t txcnt = 0; - for (uint32_t i = 0; i < cnt; i++) { struct dp_packet *packet = batch->packets[i]; uint32_t size = dp_packet_size(packet); @@ -1904,12 +1898,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); @@ -1919,11 +1913,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; } @@ -1932,12 +1926,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); @@ -1946,7 +1939,7 @@ netdev_dpdk_send__(struct netdev_dpdk *dev, int qid, 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); + tx_cnt = netdev_dpdk_qos_run(dev, pkts, tx_cnt); dropped = batch_cnt - tx_cnt; dropped += netdev_dpdk_eth_tx_burst(dev, qid, pkts, tx_cnt); @@ -1965,12 +1958,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; } @@ -2937,8 +2929,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; @@ -2951,7 +2942,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; } @@ -3163,15 +3154,13 @@ egress_policer_qos_is_equal(const struct qos_conf *conf, } static int -egress_policer_run(struct qos_conf *conf, struct rte_mbuf **pkts, int pkt_cnt, - bool may_steal) +egress_policer_run(struct qos_conf *conf, struct rte_mbuf **pkts, int pkt_cnt) { int cnt = 0; struct egress_policer *policer = CONTAINER_OF(conf, struct egress_policer, qos_conf); - cnt = netdev_dpdk_policer_run(&policer->egress_meter, pkts, - pkt_cnt, may_steal); + cnt = netdev_dpdk_policer_run(&policer->egress_meter, pkts, pkt_cnt); return cnt; } diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index f731af1..57ef13f 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 2ff3e2b..aaf4899 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -1269,7 +1269,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; @@ -1305,7 +1305,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 b3c57d5..e6ec79a 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -347,9 +347,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 @@ -369,7 +368,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 b4e570b..fa0c9fc 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 @@ -790,15 +789,12 @@ netdev_get_pt_mode(const struct netdev *netdev) * cases this function will always return EOPNOTSUPP. */ 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 f8482f7..bdcacf5 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 Thu Oct 5 15:05:59 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 821875 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=) 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 3y7GQN1F1Gz9sNw for ; Fri, 6 Oct 2017 02:09:32 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 5B827A85; Thu, 5 Oct 2017 15:06:32 +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 D29E0A59 for ; Thu, 5 Oct 2017 15:06:30 +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 68838367 for ; Thu, 5 Oct 2017 15:06:30 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20171005150628euoutp0103343e60fefc2e32594a879a04d56864~qtPSrmh471770317703euoutp01D; Thu, 5 Oct 2017 15:06:28 +0000 (GMT) Received: from eusmges1.samsung.com (unknown [203.254.199.239]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171005150627eucas1p25c8afb9fdf873f1424f7cd2f7e7985d3~qtPSCE4Fm2619726197eucas1p2t; Thu, 5 Oct 2017 15:06:27 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges1.samsung.com (EUCPMTA) with SMTP id 8A.14.12576.37A46D95; Thu, 5 Oct 2017 16:06:27 +0100 (BST) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171005150626eucas1p232290df4b9d3129f3e304dedf877e54b~qtPRUeEt82867728677eucas1p2t; Thu, 5 Oct 2017 15:06:26 +0000 (GMT) X-AuditID: cbfec7ef-f79ee6d000003120-3a-59d64a73c03c Received: from eusync2.samsung.com ( [203.254.199.212]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 60.12.18832.27A46D95; Thu, 5 Oct 2017 16:06:26 +0100 (BST) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OXC0096ZVA4TQ80@eusync2.samsung.com>; Thu, 05 Oct 2017 16:06:26 +0100 (BST) From: Ilya Maximets To: ovs-dev@openvswitch.org, Bhanuprakash Bodireddy Date: Thu, 05 Oct 2017 18:05:59 +0300 Message-id: <1507215962-17692-5-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1507215962-17692-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrPIsWRmVeSWpSXmKPExsWy7djPc7rFXtciDQ68E7RY/YvTYuczZYuW /pnMFs9fLGS2uHPlJ5vFtM+32S2utP9ktzjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKkaPd/PfsgWwRXHZpKTmZJalFunbJXBlfD++nrngi0zFzLezGBsY34t2 MXJySAiYSPz+e58JwhaTuHBvPVsXIxeHkMAyRokTC3czgiSEBD4zSuz+HQ3T8OLoRVa4onnX 57BAOM1MErdeg7RzcrAJ6EicWn0ErFtEIELiwfdZ7CA2s8BJJolnc0NBbGEBM4mpu/6xgNgs AqoS/192AU3l4OAVcJN41ZkFsUxO4ua5TmYQm1PAXeLCjs+MEPE1bBJbblpA2C4SC77MZIWw hSVeHd/CDmHLSHR2HGQCuU1CoJlRomHVJUYIZwKjxJfm5VA/20ucunmVCeI4PolJ26Yzgxwh IcAr0dEmBFHiIXH0JkzYUeJYRynEv7MYJWYebmCawCi9gJFhFaNIamlxbnpqsaFecWJucWle ul5yfu4mRmA0n/53/P0OxqfNIYcYBTgYlXh4GR5ciRRiTSwrrsw9xCjBwawkwtvoei1SiDcl sbIqtSg/vqg0J7X4EKM0B4uSOK9tVFukkEB6YklqdmpqQWoRTJaJg1OqgbGe0ZifpcOxqWPv p7fmWoL2Hw1uHAjLMuMU+fSi9NDDPV/jWp/as1yfMFeg0JPlq5H5qp95r4QlLl1fLa6nv6Q3 /8gqy4uWLYLNL4WcM1+tMgsP+nF8cW7K+kvHbslcvXGfze/kGYmaae37vuRtuvRGLyogbPks cd+ZMWyLFW+q3hZS+tW+nlOJpTgj0VCLuag4EQCbwD4j4gIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGLMWRmVeSWpSXmKPExsVy+t/xK7pFXtciDTY1K1qs/sVpsfOZskVL /0xmi+cvFjJb3Lnyk81i2ufb7BZX2n+yWxz5fprRYu2hD+wWcz89Z3Tg8vj19Sqbx+I9L5k8 nt38z+jxfh+Q27dlFaPHu/lv2QLYorhsUlJzMstSi/TtErgyvh9fz1zwRaZi5ttZjA2M70W7 GDk5JARMJF4cvcgKYYtJXLi3nq2LkYtDSGAJo8SJhoesEE4rk8SSuedYQKrYBHQkTq0+wghi iwhESLTMWc8IUsQscJpJon/xebBRwgJmElN3/QNrYBFQlfj/sgsozsHBK+Am8aozC2KbnMTN c53MIDangLvEhR2fwWYKAZVMX9TGNIGRdwEjwypGkdTS4tz03GJDveLE3OLSvHS95PzcTYzA 0Nt27OfmHYyXNgYfYhTgYFTi4fXYejVSiDWxrLgy9xCjBAezkghvo+u1SCHelMTKqtSi/Pii 0pzU4kOM0hwsSuK8vXtWRwoJpCeWpGanphakFsFkmTg4pRoYF8S7/T6yyoyVyfu8L//R9Ljj bkxPbS6Fzjypy+1/90yqdlNob5nX2QfKAh1Tn/53uG6Q+b178bfZpi/mTPtgfbtZWVsvwUnT /ESKhHWw6dq8ifsmBB50LPm696nWK4FZRi6mytqN7QycDWs2OLQsexdzrSGz8avbknwR3U+m uyVb3FU2KtYqsRRnJBpqMRcVJwIAkUUsMjkCAAA= X-CMS-MailID: 20171005150626eucas1p232290df4b9d3129f3e304dedf877e54b X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1B?= =?utf-8?b?7IK87ISx7KCE7J6QG0xlYWRpbmcgRW5naW5lZXI=?= X-Global-Sender: =?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1BSamsu?= =?utf-8?q?ng_Electronics=1BLeading_Engineer?= X-Sender-Code: =?utf-8?q?C10=1BCISHQ=1BC10GD01GD010154?= CMS-TYPE: 201P X-CMS-RootMailID: 20171005150626eucas1p232290df4b9d3129f3e304dedf877e54b X-RootMTR: 20171005150626eucas1p232290df4b9d3129f3e304dedf877e54b References: <1507215962-17692-1-git-send-email-i.maximets@samsung.com> X-Spam-Status: No, score=-5.0 required=5.0 tests=RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD autolearn=disabled 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 v4 4/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. Signed-off-by: Ilya Maximets Acked-by: Eelco Chaudron --- 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 4f243b5..7454d03 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 011c6f7..300a0ae 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -1851,8 +1851,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); - for (uint32_t i = 0; i < cnt; i++) { struct dp_packet *packet = batch->packets[i]; uint32_t size = dp_packet_size(packet); @@ -1905,7 +1903,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; @@ -1936,8 +1933,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); dropped = batch_cnt - tx_cnt; diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index 57ef13f..1f846b5 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 aaf4899..e70cef3 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -1197,7 +1197,7 @@ netdev_linux_sock_batch_send(int sock, int ifindex, for (int i = 0; i < batch->count; i++) { struct dp_packet *packet = batch->packets[i]; 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], @@ -1234,7 +1234,7 @@ netdev_linux_tap_batch_send(struct netdev *netdev_, struct netdev_linux *netdev = netdev_linux_cast(netdev_); for (int i = 0; i < batch->count; i++) { struct dp_packet *packet = batch->packets[i]; - size_t size = dp_packet_get_send_len(packet); + size_t size = dp_packet_size(packet); ssize_t retval; int error; From patchwork Thu Oct 5 15:06:00 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 821876 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=) 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 3y7GR60J9vz9t2l for ; Fri, 6 Oct 2017 02:10:10 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 3D114A7C; Thu, 5 Oct 2017 15:06:35 +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 D28E5A7C for ; Thu, 5 Oct 2017 15:06:33 +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 65A573F2 for ; Thu, 5 Oct 2017 15:06:33 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20171005150631euoutp012fe786bec6dc679e3b2fcccbb954331c~qtPVed-Ll1770317703euoutp01F; Thu, 5 Oct 2017 15:06:31 +0000 (GMT) Received: from eusmges5.samsung.com (unknown [203.254.199.245]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171005150630eucas1p2ece4cf6606b418c396b6b31fe86abe5d~qtPUpSbPY2867728677eucas1p2z; Thu, 5 Oct 2017 15:06:30 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges5.samsung.com (EUCPMTA) with SMTP id 79.27.12743.67A46D95; Thu, 5 Oct 2017 16:06:30 +0100 (BST) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171005150629eucas1p2380e076371e841d55d6cc6828c3ed96e~qtPT7cFx92201222012eucas1p2C; Thu, 5 Oct 2017 15:06:29 +0000 (GMT) X-AuditID: cbfec7f5-f79d06d0000031c7-41-59d64a76196e Received: from eusync2.samsung.com ( [203.254.199.212]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 62.12.18832.57A46D95; Thu, 5 Oct 2017 16:06:29 +0100 (BST) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OXC0096ZVA4TQ80@eusync2.samsung.com>; Thu, 05 Oct 2017 16:06:29 +0100 (BST) From: Ilya Maximets To: ovs-dev@openvswitch.org, Bhanuprakash Bodireddy Date: Thu, 05 Oct 2017 18:06:00 +0300 Message-id: <1507215962-17692-6-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1507215962-17692-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrIIsWRmVeSWpSXmKPExsWy7djP87plXtciDX7OYLNY/YvTYuczZYuW /pnMFs9fLGS2uHPlJ5vFtM+32S2utP9ktzjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKkaPd/PfsgWwRXHZpKTmZJalFunbJXBlXFwwgbHgpkDF0nsTWRoYj/N2 MXJySAiYSPzfuZcFwhaTuHBvPVsXIxeHkMBSRomGrxMZIZzPjBKdX14xw3RcPtUHVbWMUWLK yvdg7UICzUwSM75Zg9hsAjoSp1YfYQSxRQQiJB58n8UOYjMLnGSSeDY3FMQWFjCXuLLmCVic RUBVovHIAlYQm1fATeLLjk1QJ8lJ3DzXCbaYU8Bd4sKOz2AXSQisYZM4+nIjkMMB5LhINDw3 gKgXlnh1fAs7hC0j0dlxkAmivhnonVWXoJonMEp8aV7OBFFlL3Hq5lUmiOv4JCZtm84MMZRX oqNNCKLEQ2Lv0qeMELajxLX+U9BgmcUo0dW2mn0Co/QCRoZVjCKppcW56anFpnrFibnFpXnp esn5uZsYgRF9+t/xrzsYlx6zOsQowMGoxMPL8OBKpBBrYllxZe4hRgkOZiUR3kbXa5FCvCmJ lVWpRfnxRaU5qcWHGKU5WJTEeW2j2iKFBNITS1KzU1MLUotgskwcnFINjEI6+yY2Sf/JLEwq +Ghe+DmqZnJ4+RG9Vvn9u5iP5Mr+exVwets0Jh0Z43t7XjZcCxKff8Eywfvq1NQEif6dD9TW zk+8rTVh5f1mtVdn/UzrZ4dMOXd3xaLQPb/WssnMOSg20WpDlxSLfejE/J/V0Wrzb9i/PWqf +H85/3rV20dezIq+1p4QFK3EUpyRaKjFXFScCACxLdne5AIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrOLMWRmVeSWpSXmKPExsVy+t/xK7qlXtciDea+U7JY/YvTYuczZYuW /pnMFs9fLGS2uHPlJ5vFtM+32S2utP9ktzjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKkaPd/PfsgWwRXHZpKTmZJalFunbJXBlXFwwgbHgpkDF0nsTWRoYj/N2 MXJySAiYSFw+1ccGYYtJXLi3Hsjm4hASWMIo0bL7JyOE08okseP6bSaQKjYBHYlTq48wgtgi AhESLXPWgxUxC5xmkuhffJ4VJCEsYC5xZc0TdhCbRUBVovHIArA4r4CbxJcdm1gg1slJ3DzX yQxicwq4S1zY8RlsqBBQzfRFbUwTGHkXMDKsYhRJLS3OTc8tNtQrTswtLs1L10vOz93ECAy+ bcd+bt7BeGlj8CFGAQ5GJR5ej61XI4VYE8uKK3MPMUpwMCuJ8Da6XosU4k1JrKxKLcqPLyrN SS0+xCjNwaIkztu7Z3WkkEB6YklqdmpqQWoRTJaJg1OqgVHN68qdw1sXmkqVJbyayuLMdclm kf2pS50xEfEM1/q/PtVLNtmY86z+7rPJe3d1rQs7uO/EUu9D3y70fX+0f9oMFT3fxneq3Yqb XnYYn3zwbjPrMa7DrQ9e86uVNzxlWq2Q5/L4zbUuR3smuxWWN79FPD6bzKq9NN/3zsoQ75WJ X1lSlC8+C2RUYinOSDTUYi4qTgQAgVtSSjoCAAA= X-CMS-MailID: 20171005150629eucas1p2380e076371e841d55d6cc6828c3ed96e X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1B?= =?utf-8?b?7IK87ISx7KCE7J6QG0xlYWRpbmcgRW5naW5lZXI=?= X-Global-Sender: =?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1BSamsu?= =?utf-8?q?ng_Electronics=1BLeading_Engineer?= X-Sender-Code: =?utf-8?q?C10=1BCISHQ=1BC10GD01GD010154?= CMS-TYPE: 201P X-CMS-RootMailID: 20171005150629eucas1p2380e076371e841d55d6cc6828c3ed96e X-RootMTR: 20171005150629eucas1p2380e076371e841d55d6cc6828c3ed96e References: <1507215962-17692-1-git-send-email-i.maximets@samsung.com> X-Spam-Status: No, score=-5.0 required=5.0 tests=RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD autolearn=disabled 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 v4 5/7] timeval: Introduce time_usec(). 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 fanction will provide monotonic time in microseconds. Signed-off-by: Ilya Maximets Acked-by: Eelco Chaudron --- lib/timeval.c | 22 ++++++++++++++++++++++ lib/timeval.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/lib/timeval.c b/lib/timeval.c index dd63f03..be2eddc 100644 --- a/lib/timeval.c +++ b/lib/timeval.c @@ -233,6 +233,22 @@ time_wall_msec(void) return time_msec__(&wall_clock); } +static long long int +time_usec__(struct clock *c) +{ + struct timespec ts; + + time_timespec__(c, &ts); + return timespec_to_usec(&ts); +} + +/* Returns a monotonic timer, in microseconds. */ +long long int +time_usec(void) +{ + return time_usec__(&monotonic_clock); +} + /* Configures the program to die with SIGALRM 'secs' seconds from now, if * 'secs' is nonzero, or disables the feature if 'secs' is zero. */ void @@ -360,6 +376,12 @@ timeval_to_msec(const struct timeval *tv) return (long long int) tv->tv_sec * 1000 + tv->tv_usec / 1000; } +long long int +timespec_to_usec(const struct timespec *ts) +{ + return (long long int) ts->tv_sec * 1000 * 1000 + ts->tv_nsec / 1000; +} + /* Returns the monotonic time at which the "time" module was initialized, in * milliseconds. */ long long int diff --git a/lib/timeval.h b/lib/timeval.h index 7957dad..8e74551 100644 --- a/lib/timeval.h +++ b/lib/timeval.h @@ -54,6 +54,7 @@ time_t time_now(void); time_t time_wall(void); long long int time_msec(void); long long int time_wall_msec(void); +long long int time_usec(void); void time_timespec(struct timespec *); void time_wall_timespec(struct timespec *); void time_alarm(unsigned int secs); @@ -62,6 +63,7 @@ int time_poll(struct pollfd *, int n_pollfds, HANDLE *handles, long long int timespec_to_msec(const struct timespec *); long long int timeval_to_msec(const struct timeval *); +long long int timespec_to_usec(const struct timespec *); struct tm_msec *localtime_msec(long long int now, struct tm_msec *result); struct tm_msec *gmtime_msec(long long int now, struct tm_msec *result); From patchwork Thu Oct 5 15:06:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 821877 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=) 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 3y7GS05cmYz9sNw for ; Fri, 6 Oct 2017 02:10:56 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 2AEBE9F0; Thu, 5 Oct 2017 15:06:39 +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 E7D4E941 for ; Thu, 5 Oct 2017 15:06:37 +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 CF5A11AE for ; Thu, 5 Oct 2017 15:06:36 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20171005150634euoutp02c40457f0648f7acb4f9e2acac6df33b9~qtPYLYeqR2974729747euoutp02A; Thu, 5 Oct 2017 15:06:34 +0000 (GMT) Received: from eusmges1.samsung.com (unknown [203.254.199.239]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20171005150633eucas1p1fdf4b731bb3025d988b18c0a8643f11a~qtPXd_UIg1017110171eucas1p1T; Thu, 5 Oct 2017 15:06:33 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges1.samsung.com (EUCPMTA) with SMTP id FC.14.12576.97A46D95; Thu, 5 Oct 2017 16:06:33 +0100 (BST) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20171005150632eucas1p1f1576deb6f2e7903eb66bc1ffd2c24f6~qtPWrdY712078020780eucas1p1U; Thu, 5 Oct 2017 15:06:32 +0000 (GMT) X-AuditID: cbfec7ef-f79ee6d000003120-47-59d64a7947a4 Received: from eusync2.samsung.com ( [203.254.199.212]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id F5.74.20118.87A46D95; Thu, 5 Oct 2017 16:06:32 +0100 (BST) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OXC0096ZVA4TQ80@eusync2.samsung.com>; Thu, 05 Oct 2017 16:06:32 +0100 (BST) From: Ilya Maximets To: ovs-dev@openvswitch.org, Bhanuprakash Bodireddy Date: Thu, 05 Oct 2017 18:06:01 +0300 Message-id: <1507215962-17692-7-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1507215962-17692-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrHIsWRmVeSWpSXmKPExsWy7djP87qVXtciDSZ+YbdY/YvTYuczZYuW /pnMFs9fLGS2uHPlJ5vFtM+32S2utP9ktzjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKkaPd/PfsgWwRXHZpKTmZJalFunbJXBlHHpygrFgYjNjxfRfLWwNjNPj uhg5OSQETCS23lnIDmGLSVy4t56ti5GLQ0hgGaPE1LZLzBDOZ0aJg9/nssN0ND3ezwJig1Wt +sAJYTczSZztCAex2QR0JE6tPsIIYosIREg8+D4LrJdZ4CSTxLO5oSC2sICDxOWd7UDbODhY BFQl5h+UAQnzCrhJHH+2jwVilZzEzXOdzCA2p4C7xIUdnxkh4mvYJOZPDAdplRBwkWi7wQMR FpZ4dXwL1JUyEpcnd7OAnC8h0Mwo0bDqEiOEM4FR4kvzciaIKnuJUzevMkHcxicxadt0Zoih vBIdbUIQpofE4QOJENWOEq/ffoWGzyxGiY+b7jJOYJRewMiwilEktbQ4Nz212FCvODG3uDQv XS85P3cTIzCWT/87/n4H49PmkEOMAhyMSjy8DA+uRAqxJpYVV+YeYpTgYFYS4W10vRYpxJuS WFmVWpQfX1Sak1p8iFGag0VJnNc2qi1SSCA9sSQ1OzW1ILUIJsvEwSnVwKhieKwmYWv6pmlv xVbYyul2bH/lvfpkbNYUxb0vzdMmdzvr237Zs1SeN3x9cdG+5e+bP8xgaJ7+8fbGX7skhAME X9/y5KrJr9Msk5O/v0lBXqSQS9XuuNiJvhWSz1bt67EN2rys6FjVIxv1wrqODS97HP6GeQqV qprVP60S7Qr8+mpewRaxA0osxRmJhlrMRcWJAKHC99ThAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrOLMWRmVeSWpSXmKPExsVy+t/xK7oVXtciDTY8l7dY/YvTYuczZYuW /pnMFs9fLGS2uHPlJ5vFtM+32S2utP9ktzjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKkaPd/PfsgWwRXHZpKTmZJalFunbJXBlHHpygrFgYjNjxfRfLWwNjNPj uhg5OSQETCSaHu9ngbDFJC7cW8/WxcjFISSwhFFiedsDFginlUni39tvjCBVbAI6EqdWHwGz RQQiJFrmrGcEKWIWOM0k0b/4PCtIQljAQeLyznagURwcLAKqEvMPyoCEeQXcJI4/2we1TU7i 5rlOZhCbU8Bd4sKOz2AzhYBqpi9qY5rAyLuAkWEVo0hqaXFuem6xkV5xYm5xaV66XnJ+7iZG YPBtO/Zzyw7GrnfBhxgFOBiVeHgZHlyJFGJNLCuuzD3EKMHBrCTC2+h6LVKINyWxsiq1KD++ qDQntfgQozQHi5I4b++e1ZFCAumJJanZqakFqUUwWSYOTqkGxqYgkZO90QWBJxesmKpW86ne 1rbB3HnKtuvXvEqXPGpSmCRpOivLnFOtx+2DW2Oy7Kw5Pjpc6zkf9sR7LCwwKH0aF6kSVnxI 0fXh9kgbx2kcTa7dD9J8nKLcG5PVN93tfiP2/erML98cWvZo5N3cyLxsd4Ndt3Z/76ZNB1rm HjP9z3TZ/YOsEktxRqKhFnNRcSIA1wqu/zoCAAA= X-CMS-MailID: 20171005150632eucas1p1f1576deb6f2e7903eb66bc1ffd2c24f6 X-Msg-Generator: CA X-Sender-IP: 182.198.249.180 X-Local-Sender: =?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1B?= =?utf-8?b?7IK87ISx7KCE7J6QG0xlYWRpbmcgRW5naW5lZXI=?= X-Global-Sender: =?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1BSamsu?= =?utf-8?q?ng_Electronics=1BLeading_Engineer?= X-Sender-Code: =?utf-8?q?C10=1BCISHQ=1BC10GD01GD010154?= CMS-TYPE: 201P X-CMS-RootMailID: 20171005150632eucas1p1f1576deb6f2e7903eb66bc1ffd2c24f6 X-RootMTR: 20171005150632eucas1p1f1576deb6f2e7903eb66bc1ffd2c24f6 References: <1507215962-17692-1-git-send-email-i.maximets@samsung.com> X-Spam-Status: No, score=-5.0 required=5.0 tests=RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD autolearn=disabled 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 v4 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 Acked-by: Eelco Chaudron --- lib/dpif-netdev.c | 141 ++++++++++++++++++++++++++++++++++++++++----------- vswitchd/vswitch.xml | 16 ++++++ 2 files changed, 127 insertions(+), 30 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 166b73a..3ddb711 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 5 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; }; @@ -614,6 +622,9 @@ struct dp_netdev_pmd_thread { * than 'cmap_count(dp->poll_threads)'. */ uint32_t static_tx_qid; + /* Number of filled output batches. */ + int n_output_batches; + struct ovs_mutex port_mutex; /* Mutex for 'poll_list' and 'tx_ports'. */ /* List of rx queues to poll. */ struct hmap poll_list OVS_GUARDED; @@ -707,8 +718,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); @@ -783,7 +795,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. */ @@ -1283,6 +1295,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); @@ -2950,7 +2963,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); @@ -2999,6 +3012,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); @@ -3237,11 +3260,12 @@ 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; dynamic_txqs = p->port->dynamic_txqs; @@ -3251,20 +3275,41 @@ 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); netdev_send(p->port->netdev, tx_qid, &p->output_pkts, dynamic_txqs); dp_packet_batch_init(&p->output_pkts); + + if (output_cnt) { + uint32_t tx_flush_interval; + + /* 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 @@ -3274,7 +3319,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); @@ -3284,7 +3329,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); @@ -3292,7 +3337,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 * @@ -3904,7 +3949,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); @@ -3924,9 +3970,22 @@ 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. */ + 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); @@ -3979,6 +4038,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); @@ -4077,7 +4138,6 @@ pmd_thread_main(void *f_) bool exiting; int poll_cnt; int i; - int process_packets = 0; poll_list = NULL; @@ -4107,6 +4167,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, @@ -4114,6 +4177,18 @@ 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. */ + 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) { @@ -4207,7 +4282,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. */ @@ -4363,7 +4438,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) { @@ -4561,6 +4636,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); @@ -4748,6 +4824,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)); @@ -4911,7 +4988,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); @@ -5286,7 +5363,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]--; @@ -5307,7 +5384,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; } @@ -5439,12 +5516,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); } @@ -5685,7 +5766,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 074535b..b13b0fa 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 Thu Oct 5 15:06:02 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 821880 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=) 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 3y7GT62V0fz9sNw for ; Fri, 6 Oct 2017 02:11:54 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 55C7BA92; Thu, 5 Oct 2017 15:06:44 +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 6A3FAA92 for ; Thu, 5 Oct 2017 15:06:43 +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 C68E81AE for ; Thu, 5 Oct 2017 15:06:42 +0000 (UTC) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20171005150640euoutp0210fde656e510493d4bf711e096719c21~qtPeLRAAM3023430234euoutp02N; Thu, 5 Oct 2017 15:06:40 +0000 (GMT) Received: from eusmges4.samsung.com (unknown [203.254.199.244]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20171005150639eucas1p12f167cf71e673eaa1e4e5b2171131176~qtPdHbcnR2252922529eucas1p1d; Thu, 5 Oct 2017 15:06:39 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges4.samsung.com (EUCPMTA) with SMTP id 45.6D.12944.F7A46D95; Thu, 5 Oct 2017 16:06:39 +0100 (BST) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171005150638eucas1p2601c5e2a6ca6602c78bf3951d446f65b~qtPcbHYZW2867728677eucas1p2-; Thu, 5 Oct 2017 15:06:38 +0000 (GMT) X-AuditID: cbfec7f4-f79ab6d000003290-51-59d64a7f475f Received: from eusync2.samsung.com ( [203.254.199.212]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id D6.12.18832.E7A46D95; Thu, 5 Oct 2017 16:06:38 +0100 (BST) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OXC0096ZVA4TQ80@eusync2.samsung.com>; Thu, 05 Oct 2017 16:06:38 +0100 (BST) From: Ilya Maximets To: ovs-dev@openvswitch.org, Bhanuprakash Bodireddy Date: Thu, 05 Oct 2017 18:06:02 +0300 Message-id: <1507215962-17692-8-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1507215962-17692-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrIIsWRmVeSWpSXmKPExsWy7djP87r1XtciDSadZrdY/YvTYuczZYuW /pnMFs9fLGS2uHPlJ5vFtM+32S2utP9ktzjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKkaPd/PfsgWwRXHZpKTmZJalFunbJXBlvF1+hKXghljFope7mRoYn/N3 MXJwSAiYSKzcUtrFyAlkiklcuLeerYuRi0NIYCmjRMv0g1DOZ0aJHc07mCCqTCSedi5lB7GF BJYxSjzcLQFR1Mwk8fzLKUaQBJuAjsSp1UfAbBGBCIkH32eBNTALnGSSeDY3FMQWFnCReHTo IDOIzSKgKrHz9R0WEJtXwE3iQmc/K8QyOYmb5zrBajgF3CUu7PjMCLJMQmANm0Tn6XtQRS4S c78eY4SwhSVeHd/CDmHLSHR2HGSCaGhmlGhYdQmqewKjxJfm5VD/2EucunmVCeI8PolJ26Yz QwKGV6KjTQiixENi+7/NUAscJTYfmsEK8fIsRolnH9YzTWCUXsDIsIpRJLW0ODc9tdhErzgx t7g0L10vOT93EyMwok//O/5lB+PiY1aHGAU4GJV4eBkeXIkUYk0sK67MPcQowcGsJMLb6Hot Uog3JbGyKrUoP76oNCe1+BCjNAeLkjivbVRbpJBAemJJanZqakFqEUyWiYNTqoHRI/RCLLP2 3StvGydNOP/+ZJWND9+xQh6n91sSVVeeFFyb0/Fv774LiyXmHDVVtGVgYngVEcG2KK105bEz NitNZXeY2iXcfFeVsi5NMSX+58uZZ+UOGJ56dWir7vGUzxPrFu5XePZEo8Do+YKitSaRLB1h UzcfLvnGMd34YqGWm0dYuvsi+WIWJZbijERDLeai4kQArScLueQCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGLMWRmVeSWpSXmKPExsVy+t/xK7p1XtciDX5O17JY/YvTYuczZYuW /pnMFs9fLGS2uHPlJ5vFtM+32S2utP9ktzjy/TSjxdpDH9gt5n56zujA5fHr61U2j8V7XjJ5 PLv5n9Hj/T4gt2/LKkaPd/PfsgWwRXHZpKTmZJalFunbJXBlvF1+hKXghljFope7mRoYn/N3 MXJySAiYSDztXMoOYYtJXLi3ng3EFhJYwijROSemi5ELyG5lkljd9ocFJMEmoCNxavURRhBb RCBComXOekaQImaB00wS/YvPs4IkhAVcJB4dOsgMYrMIqErsfH0HrJlXwE3iQmc/K8Q2OYmb 5zrBajgF3CUu7PjMCLHZTWL6ojamCYy8CxgZVjGKpJYW56bnFhvqFSfmFpfmpesl5+duYgSG 3rZjPzfvYLy0MfgQowAHoxIPr8fWq5FCrIllxZW5hxglOJiVRHgbXa9FCvGmJFZWpRblxxeV 5qQWH2KU5mBREuft3bM6UkggPbEkNTs1tSC1CCbLxMEp1cDIcGTxiiqhmZe/bH9ruMfwR8eR 3zfXGmZ/3H1wWvVfc64nuqoPLB43GZk8WSxaXXzwy8lLIT75++puTjr3je2m7OlpKiuOJS33 65m/LHHfnS1mPjdXBZWmeKxUjPX6ulDwUEnx/N2T7+YmXe0tcTiiGLn8YN8hvywJF+7P9jxJ wpM7dr31vVl1SYmlOCPRUIu5qDgRAGd2x5w5AgAA X-CMS-MailID: 20171005150638eucas1p2601c5e2a6ca6602c78bf3951d446f65b X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1B?= =?utf-8?b?7IK87ISx7KCE7J6QG0xlYWRpbmcgRW5naW5lZXI=?= X-Global-Sender: =?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1BSamsu?= =?utf-8?q?ng_Electronics=1BLeading_Engineer?= X-Sender-Code: =?utf-8?q?C10=1BCISHQ=1BC10GD01GD010154?= CMS-TYPE: 201P X-CMS-RootMailID: 20171005150638eucas1p2601c5e2a6ca6602c78bf3951d446f65b X-RootMTR: 20171005150638eucas1p2601c5e2a6ca6602c78bf3951d446f65b References: <1507215962-17692-1-git-send-email-i.maximets@samsung.com> X-Spam-Status: No, score=-5.0 required=5.0 tests=RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD autolearn=disabled 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 v4 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 Signed-off-by: Ilya Maximets Acked-by: Eelco Chaudron --- 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 3ddb711..1d5321a 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; @@ -832,6 +837,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. @@ -873,15 +879,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; @@ -3288,6 +3302,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; }