[ovs-dev] [PATCH v2] dpif-netdev: Fix non-pmd thread queue id.
Mark D. Gray
mark.d.gray at intel.com
Fri May 29 11:42:00 UTC 2015
From: Daniele Di Proietto <diproiettod at vmware.com>
Non pmd threads have a core_id == UINT32_MAX, while queue ids used by
netdevs range from 0 to the number of CPUs. Therefore core ids cannot
be used directly to select a queue.
This commit introduces a simple mapping to fix the problem: non pmd
threads use queue 0, pmd threads on core 0 to N use queues 1 to N+1
Fixes: d5c199ea7ff7 ("netdev-dpdk: Properly support non pmd threads.")
Reported-by: 차은호 <eunho.cha at atto-research.com
Signed-off-by: Daniele Di Proietto <diproiettod at vmware.com>
Signed-off-by: Mark D. Gray <mark.d.gray at intel.com>
---
lib/dpif-netdev.c | 20 ++++++++++++++++----
lib/netdev-dpdk.c | 10 ++++++----
2 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 76d1003..de700f7 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -1068,7 +1068,7 @@ do_add_port(struct dp_netdev *dp, const char *devname, const char *type,
}
/* There can only be ovs_numa_get_n_cores() pmd threads,
* so creates a txq for each. */
- error = netdev_set_multiq(netdev, n_cores, dp->n_dpdk_rxqs);
+ error = netdev_set_multiq(netdev, n_cores + 1, dp->n_dpdk_rxqs);
if (error && (error != EOPNOTSUPP)) {
VLOG_ERR("%s, cannot set multiq", devname);
return errno;
@@ -2402,7 +2402,8 @@ dpif_netdev_pmd_set(struct dpif *dpif, unsigned int n_rxqs, const char *cmask)
}
/* Sets the new rx queue config. */
- err = netdev_set_multiq(port->netdev, ovs_numa_get_n_cores(),
+ err = netdev_set_multiq(port->netdev,
+ ovs_numa_get_n_cores() + 1,
n_rxqs);
if (err && (err != EOPNOTSUPP)) {
VLOG_ERR("Failed to set dpdk interface %s rx_queue to:"
@@ -3328,8 +3329,18 @@ dpif_netdev_register_upcall_cb(struct dpif *dpif, upcall_callback *cb,
dp->upcall_cb = cb;
}
+static int
+core_id_to_qid(unsigned core_id)
+{
+ if (core_id != NON_PMD_CORE_ID) {
+ return core_id + 1;
+ } else {
+ return 0;
+ }
+}
+
static void
-dp_netdev_drop_packets(struct dp_packet ** packets, int cnt, bool may_steal)
+dp_netdev_drop_packets(struct dp_packet **packets, int cnt, bool may_steal)
{
if (may_steal) {
int i;
@@ -3387,7 +3398,8 @@ dp_execute_cb(void *aux_, struct dp_packet **packets, int cnt,
case OVS_ACTION_ATTR_OUTPUT:
p = dp_netdev_lookup_port(dp, u32_to_odp(nl_attr_get_u32(a)));
if (OVS_LIKELY(p)) {
- netdev_send(p->netdev, pmd->core_id, packets, cnt, may_steal);
+ netdev_send(p->netdev, core_id_to_qid(pmd->core_id), packets, cnt,
+ may_steal);
return;
}
break;
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 63243d8..1d20d98 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -892,9 +892,11 @@ netdev_dpdk_rxq_recv(struct netdev_rxq *rxq_, struct dp_packet **packets,
int nb_rx;
/* There is only one tx queue for this core. Do not flush other
- * queueus. */
+ * queues. */
if (rxq_->queue_id == rte_lcore_id()) {
- dpdk_queue_flush(dev, rxq_->queue_id);
+ /* TX queue 0 is the nonpmd queue. Each core owns TX queue
+ * number = core_id + 1 */
+ dpdk_queue_flush(dev, rxq_->queue_id + 1);
}
nb_rx = rte_eth_rx_burst(rx->port_id, rxq_->queue_id,
@@ -1070,8 +1072,8 @@ dpdk_do_tx_copy(struct netdev *netdev, int qid, struct dp_packet **pkts,
if (dev->type == DPDK_DEV_VHOST) {
__netdev_dpdk_vhost_send(netdev, (struct dp_packet **) mbufs, newcnt, true);
} else {
- dpdk_queue_pkts(dev, qid, mbufs, newcnt);
- dpdk_queue_flush(dev, qid);
+ dpdk_queue_pkts(dev, qid, mbufs, newcnt);
+ dpdk_queue_flush(dev, qid);
}
if (!thread_is_pmd()) {
--
1.9.3
More information about the dev
mailing list