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;
}