summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Wiles <keith.wiles@intel.com>2017-01-28 20:12:05 -0600
committerFerruh Yigit <ferruh.yigit@intel.com>2017-01-30 22:18:27 +0100
commit0002ca582de3fb397f8c606b4857d44fd266864a (patch)
tree7dca583067f8490a26966ddd88b1d546671b537f
parentf2462150ec92a846180df7e3f038214b731439ce (diff)
downloaddpdk-0002ca582de3fb397f8c606b4857d44fd266864a.zip
dpdk-0002ca582de3fb397f8c606b4857d44fd266864a.tar.gz
dpdk-0002ca582de3fb397f8c606b4857d44fd266864a.tar.xz
net/tap: fix invalid queue file descriptor
Rx and Tx queues share the common tap file descriptor, but save this value separately. Setting up Rx/Tx queue sets up both queues, release_queue close the tap file but update file descriptor only for that queue. This makes other queue's file descriptor invalid. As a workaround, prevent release_queue callback to be called by default. This is done by separating Rx/Tx setup functions, so that each only setup its own queue, this prevents rte_eth_rx/tx_queue_setup() calling release_queue before setup_queue. Fixes: 02f96a0a82d1 ("net/tap: add TUN/TAP device PMD") Signed-off-by: Keith Wiles <keith.wiles@intel.com> Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
-rw-r--r--drivers/net/tap/rte_eth_tap.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
index c0afc2d..91f63f5 100644
--- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c
@@ -428,8 +428,6 @@ tap_setup_queue(struct rte_eth_dev *dev,
}
}
}
- dev->data->rx_queues[qid] = rx;
- dev->data->tx_queues[qid] = tx;
rx->fd = fd;
tx->fd = fd;
@@ -438,6 +436,26 @@ tap_setup_queue(struct rte_eth_dev *dev,
}
static int
+rx_setup_queue(struct rte_eth_dev *dev,
+ struct pmd_internals *internals,
+ uint16_t qid)
+{
+ dev->data->rx_queues[qid] = &internals->rxq[qid];
+
+ return tap_setup_queue(dev, internals, qid);
+}
+
+static int
+tx_setup_queue(struct rte_eth_dev *dev,
+ struct pmd_internals *internals,
+ uint16_t qid)
+{
+ dev->data->tx_queues[qid] = &internals->txq[qid];
+
+ return tap_setup_queue(dev, internals, qid);
+}
+
+static int
tap_rx_queue_setup(struct rte_eth_dev *dev,
uint16_t rx_queue_id,
uint16_t nb_rx_desc __rte_unused,
@@ -469,7 +487,7 @@ tap_rx_queue_setup(struct rte_eth_dev *dev,
return -ENOMEM;
}
- fd = tap_setup_queue(dev, internals, rx_queue_id);
+ fd = rx_setup_queue(dev, internals, rx_queue_id);
if (fd == -1)
return -1;
@@ -493,7 +511,7 @@ tap_tx_queue_setup(struct rte_eth_dev *dev,
if (tx_queue_id >= internals->nb_queues)
return -1;
- ret = tap_setup_queue(dev, internals, tx_queue_id);
+ ret = tx_setup_queue(dev, internals, tx_queue_id);
if (ret == -1)
return -1;