Drivers like GVE work with rx/tx queue configuration rather than combined queue. Enable AF_XDP vdev to use rx/tx queue configuration instead of combined queue configuration if available.
Signed-off-by: Shivaji Kant <shivajik...@google.com> Reviewed-by: Joshua Washington <joshw...@google.com> --- Changes in v2: - Rephrased the first sentence of the commit message for clarity. - Corrected spelling error "dirvers" to "drivers" in code comment. --- .mailmap | 1 + drivers/net/af_xdp/rte_eth_af_xdp.c | 30 ++++++++++++++++++----------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/.mailmap b/.mailmap index 8483d96ec5..c67caa7c9d 100644 --- a/.mailmap +++ b/.mailmap @@ -1423,6 +1423,7 @@ Shijith Thotton <sthot...@marvell.com> <shijith.thot...@caviumnetworks.com> Shiqi Liu <835703...@qq.com> Shiri Kuzin <shi...@nvidia.com> <shi...@mellanox.com> Shivah Shankar S <sshankarn...@marvell.com> +Shivaji Kant <shivajik...@google.com> Shivanshu Shukla <shivanshu.shu...@intel.com> Shiweixian <shiweix...@huawei.com> Shiyang He <shiyangx...@intel.com> diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_eth_af_xdp.c index 05115150a7..5f65850a27 100644 --- a/drivers/net/af_xdp/rte_eth_af_xdp.c +++ b/drivers/net/af_xdp/rte_eth_af_xdp.c @@ -168,7 +168,7 @@ struct pmd_internals { int start_queue_idx; int queue_cnt; int max_queue_cnt; - int combined_queue_cnt; + int configured_queue_cnt; bool shared_umem; char prog_path[PATH_MAX]; bool custom_prog_configured; @@ -2043,11 +2043,11 @@ parse_prog_arg(const char *key __rte_unused, static int xdp_get_channels_info(const char *if_name, int *max_queues, - int *combined_queues) + int *configured_queues) { struct ethtool_channels channels; struct ifreq ifr; - int fd, ret; + int fd, ret, rxtx_q_count; fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) @@ -2066,15 +2066,23 @@ xdp_get_channels_info(const char *if_name, int *max_queues, } } - if (channels.max_combined == 0 || errno == EOPNOTSUPP) { + /* For drivers with rx/tx queue configured */ + rxtx_q_count = RTE_MIN(channels.rx_count, channels.tx_count); + + if ((channels.max_combined == 0 && rxtx_q_count == 0) || errno == EOPNOTSUPP) { /* If the device says it has no channels, then all traffic * is sent to a single stream, so max queues = 1. */ *max_queues = 1; - *combined_queues = 1; - } else { + *configured_queues = 1; + } else if (channels.max_combined > 0) { *max_queues = channels.max_combined; - *combined_queues = channels.combined_count; + *configured_queues = channels.combined_count; + AF_XDP_LOG_LINE(INFO, "Using Combined queues configuration"); + } else { + *max_queues = RTE_MIN(channels.max_rx, channels.max_tx); + *configured_queues = rxtx_q_count; + AF_XDP_LOG_LINE(INFO, "Using Rx/Tx queues configuration"); } out: @@ -2215,15 +2223,15 @@ init_internals(struct rte_vdev_device *dev, const char *if_name, strlcpy(internals->dp_path, dp_path, PATH_MAX); if (xdp_get_channels_info(if_name, &internals->max_queue_cnt, - &internals->combined_queue_cnt)) { + &internals->configured_queue_cnt)) { AF_XDP_LOG_LINE(ERR, "Failed to get channel info of interface: %s", if_name); goto err_free_internals; } - if (queue_cnt > internals->combined_queue_cnt) { - AF_XDP_LOG_LINE(ERR, "Specified queue count %d is larger than combined queue count %d.", - queue_cnt, internals->combined_queue_cnt); + if (queue_cnt > internals->configured_queue_cnt) { + AF_XDP_LOG_LINE(ERR, "Specified queue count %d is larger than configured queue count %d.", + queue_cnt, internals->configured_queue_cnt); goto err_free_internals; } -- 2.50.0.727.gbf7dc18ff4-goog