aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-dpdk/odp_packet_dpdk.c
diff options
context:
space:
mode:
Diffstat (limited to 'platform/linux-dpdk/odp_packet_dpdk.c')
-rw-r--r--platform/linux-dpdk/odp_packet_dpdk.c77
1 files changed, 41 insertions, 36 deletions
diff --git a/platform/linux-dpdk/odp_packet_dpdk.c b/platform/linux-dpdk/odp_packet_dpdk.c
index a8e4298fb..f62e9c2cc 100644
--- a/platform/linux-dpdk/odp_packet_dpdk.c
+++ b/platform/linux-dpdk/odp_packet_dpdk.c
@@ -82,7 +82,7 @@
/** DPDK runtime configuration options */
typedef struct {
int multicast_enable;
- int num_rx_desc;
+ int num_rx_desc_default;
int num_tx_desc_default;
int rx_drop_en;
} dpdk_opt_t;
@@ -114,15 +114,17 @@ typedef struct ODP_ALIGNED_CACHE {
uint32_t mtu_max;
/* DPDK MTU has been modified */
uint8_t mtu_set;
+ /* Number of RX descriptors per queue */
+ uint16_t num_rx_desc[ODP_PKTIN_MAX_QUEUES];
/* Number of TX descriptors per queue */
- uint16_t num_tx_desc[PKTIO_MAX_QUEUES];
+ uint16_t num_tx_desc[ODP_PKTOUT_MAX_QUEUES];
/* --- Locks for MT safe operations --- */
/* RX queue locks */
- odp_ticketlock_t rx_lock[PKTIO_MAX_QUEUES] ODP_ALIGNED_CACHE;
+ odp_ticketlock_t rx_lock[ODP_PKTIN_MAX_QUEUES] ODP_ALIGNED_CACHE;
/* TX queue locks */
- odp_ticketlock_t tx_lock[PKTIO_MAX_QUEUES] ODP_ALIGNED_CACHE;
+ odp_ticketlock_t tx_lock[ODP_PKTOUT_MAX_QUEUES] ODP_ALIGNED_CACHE;
} pkt_dpdk_t;
@@ -174,7 +176,7 @@ static int init_options(pktio_entry_t *pktio_entry,
dpdk_opt_t *opt = &pkt_priv(pktio_entry)->opt;
if (!lookup_opt("num_rx_desc", dev_info->driver_name,
- &opt->num_rx_desc))
+ &opt->num_rx_desc_default))
return -1;
if (!lookup_opt("num_tx_desc", dev_info->driver_name,
@@ -194,7 +196,7 @@ static int init_options(pktio_entry_t *pktio_entry,
_ODP_DBG("DPDK interface (%s): %" PRIu16 "\n", dev_info->driver_name,
pkt_priv(pktio_entry)->port_id);
_ODP_DBG(" multicast: %d\n", opt->multicast_enable);
- _ODP_DBG(" num_rx_desc: %d\n", opt->num_rx_desc);
+ _ODP_DBG(" num_rx_desc: %d\n", opt->num_rx_desc_default);
_ODP_DBG(" num_tx_desc: %d\n", opt->num_tx_desc_default);
_ODP_DBG(" rx_drop_en: %d\n", opt->rx_drop_en);
@@ -395,6 +397,7 @@ static void prepare_rss_conf(pktio_entry_t *pktio_entry,
static int dpdk_input_queues_config(pktio_entry_t *pktio_entry,
const odp_pktin_queue_param_t *p)
{
+ pkt_dpdk_t *pkt_dpdk = pkt_priv(pktio_entry);
odp_pktin_mode_t mode = pktio_entry->param.in_mode;
uint8_t lockless;
@@ -403,13 +406,32 @@ static int dpdk_input_queues_config(pktio_entry_t *pktio_entry,
/**
* Scheduler synchronizes input queue polls. Only single thread
* at a time polls a queue */
- if (mode == ODP_PKTIN_MODE_SCHED ||
- p->op_mode == ODP_PKTIO_OP_MT_UNSAFE)
+ if (mode == ODP_PKTIN_MODE_SCHED || p->op_mode == ODP_PKTIO_OP_MT_UNSAFE)
lockless = 1;
else
lockless = 0;
- pkt_priv(pktio_entry)->flags.lockless_rx = lockless;
+ pkt_dpdk->flags.lockless_rx = lockless;
+
+ /* Configure RX descriptors */
+ for (uint32_t i = 0; i < p->num_queues; i++) {
+ uint16_t num_rx_desc = pkt_dpdk->opt.num_rx_desc_default;
+ int ret;
+
+ if (mode == ODP_PKTIN_MODE_DIRECT && p->queue_size[i] != 0)
+ num_rx_desc = p->queue_size[i];
+
+ /* Adjust descriptor count */
+ ret = rte_eth_dev_adjust_nb_rx_tx_desc(pkt_dpdk->port_id, &num_rx_desc, NULL);
+ if (ret && ret != -ENOTSUP) {
+ _ODP_ERR("DPDK: rte_eth_dev_adjust_nb_rx_tx_desc() failed: %d\n", ret);
+ return -1;
+ }
+ pkt_dpdk->num_rx_desc[i] = num_rx_desc;
+
+ _ODP_DBG("Port %" PRIu16 " RX queue %" PRIu32 " using %" PRIu16 " descriptors\n",
+ pkt_dpdk->port_id, i, num_rx_desc);
+ }
return 0;
}
@@ -417,10 +439,8 @@ static int dpdk_input_queues_config(pktio_entry_t *pktio_entry,
static int dpdk_output_queues_config(pktio_entry_t *pktio_entry,
const odp_pktout_queue_param_t *p)
{
- struct rte_eth_dev_info dev_info;
pkt_dpdk_t *pkt_dpdk = pkt_priv(pktio_entry);
uint8_t lockless;
- int ret;
if (p->op_mode == ODP_PKTIO_OP_MT_UNSAFE)
lockless = 1;
@@ -429,15 +449,10 @@ static int dpdk_output_queues_config(pktio_entry_t *pktio_entry,
pkt_dpdk->flags.lockless_tx = lockless;
- ret = rte_eth_dev_info_get(pkt_dpdk->port_id, &dev_info);
- if (ret) {
- _ODP_ERR("DPDK: rte_eth_dev_info_get() failed: %d\n", ret);
- return -1;
- }
-
/* Configure TX descriptors */
for (uint32_t i = 0; i < p->num_queues; i++) {
uint16_t num_tx_desc = pkt_dpdk->opt.num_tx_desc_default;
+ int ret;
if (p->queue_size[i] != 0)
num_tx_desc = p->queue_size[i];
@@ -450,8 +465,8 @@ static int dpdk_output_queues_config(pktio_entry_t *pktio_entry,
}
pkt_dpdk->num_tx_desc[i] = num_tx_desc;
- _ODP_DBG("TX queue %" PRIu32 " using %" PRIu16 " descriptors\n", i, num_tx_desc);
- }
+ _ODP_DBG("Port %" PRIu16 " TX queue %" PRIu32 " using %" PRIu16 " descriptors\n",
+ pkt_dpdk->port_id, i, num_tx_desc); }
return 0;
}
@@ -508,8 +523,9 @@ static int dpdk_init_capability(pktio_entry_t *pktio_entry,
memset(capa, 0, sizeof(odp_pktio_capability_t));
- capa->max_input_queues = RTE_MIN(dev_info->max_rx_queues,
- PKTIO_MAX_QUEUES);
+ capa->max_input_queues = RTE_MIN(dev_info->max_rx_queues, ODP_PKTIN_MAX_QUEUES);
+ capa->min_input_queue_size = dev_info->rx_desc_lim.nb_min;
+ capa->max_input_queue_size = dev_info->rx_desc_lim.nb_max;
/* ixgbe devices support only 16 RX queues in RSS mode */
if (!strncmp(dev_info->driver_name, IXGBE_DRV_NAME,
@@ -517,8 +533,7 @@ static int dpdk_init_capability(pktio_entry_t *pktio_entry,
capa->max_input_queues = RTE_MIN(16,
(int)capa->max_input_queues);
- capa->max_output_queues = RTE_MIN(dev_info->max_tx_queues,
- PKTIO_MAX_QUEUES);
+ capa->max_output_queues = RTE_MIN(dev_info->max_tx_queues, ODP_PKTOUT_MAX_QUEUES);
capa->min_output_queue_size = dev_info->tx_desc_lim.nb_min;
capa->max_output_queue_size = dev_info->tx_desc_lim.nb_max;
@@ -700,10 +715,10 @@ static int setup_pkt_dpdk(odp_pktio_t pktio ODP_UNUSED,
else
rte_eth_allmulticast_disable(pkt_dpdk->port_id);
- for (i = 0; i < PKTIO_MAX_QUEUES; i++) {
+ for (i = 0; i < ODP_PKTIN_MAX_QUEUES; i++)
odp_ticketlock_init(&pkt_dpdk->rx_lock[i]);
+ for (i = 0; i < ODP_PKTOUT_MAX_QUEUES; i++)
odp_ticketlock_init(&pkt_dpdk->tx_lock[i]);
- }
return 0;
}
@@ -762,24 +777,14 @@ static int dpdk_setup_eth_rx(const pktio_entry_t *pktio_entry,
uint32_t i;
int ret;
uint16_t port_id = pkt_dpdk->port_id;
- uint16_t num_rx_desc = pkt_dpdk->opt.num_rx_desc;
pool_t *pool = _odp_pool_entry(pktio_entry->pool);
rxconf = dev_info->default_rxconf;
rxconf.rx_drop_en = pkt_dpdk->opt.rx_drop_en;
- /* Adjust descriptor count */
- ret = rte_eth_dev_adjust_nb_rx_tx_desc(port_id, &num_rx_desc, NULL);
- if (ret && ret != -ENOTSUP) {
- _ODP_ERR("DPDK: rte_eth_dev_adjust_nb_rx_tx_desc() failed: %d\n", ret);
- return -1;
- }
-
- _ODP_DBG("RX queues using %" PRIu16 " descriptors\n", num_rx_desc);
-
for (i = 0; i < pktio_entry->num_in_queue; i++) {
- ret = rte_eth_rx_queue_setup(port_id, i, num_rx_desc,
+ ret = rte_eth_rx_queue_setup(port_id, i, pkt_dpdk->num_rx_desc[i],
rte_eth_dev_socket_id(port_id),
&rxconf, pool->rte_mempool);
if (ret < 0) {