[PATCH 2/3] shared/net-util-linux: add support for retrieving NIC h/w queues
Nilay Shroff <[email protected]>
| Newsgroups | org.infradead.lists.linux-nvme |
|---|---|
| Message-ID | <[email protected]> |
Add a new shared helper, shr_netdev_get_hw_queues(), which retrieves the NIC h/w queue details using ethtool ioctl ETHTOOL_GCHANNELS. This is a preparatory patch. A subsequent patch will use this helper to determine the h/w queue details when calculating the default --nr-io-queues value for NVMe/TCP connections. Signed-off-by: Nilay Shroff <[email protected]> --- shared/net-util-linux.c | 37 +++++++++++++++++++++++++++++++++++++ shared/net-util.h | 16 ++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/shared/net-util-linux.c b/shared/net-util-linux.c index 887755ce9..7517fccbe 100644 --- a/shared/net-util-linux.c +++ b/shared/net-util-linux.c @@ -9,13 +9,16 @@ #include <arpa/inet.h> #include <asm/types.h> #include <errno.h> +#include <linux/ethtool.h> #include <linux/netlink.h> #include <linux/rtnetlink.h> +#include <linux/sockios.h> #include <net/if.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/ioctl.h> #include <sys/socket.h> #include <unistd.h> @@ -409,3 +412,37 @@ out: close(fd); return ret; } + +int shr_netdev_get_hw_queues(const char *ifname, uint32_t *combined_count, + uint32_t *tx_count, uint32_t *rx_count) +{ + struct ethtool_channels chan = {}; + struct ifreq ifr = {}; + int fd, ret = 0; + + if (!ifname || !combined_count || !tx_count || !rx_count) + return -EINVAL; + + fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) { + fprintf(stderr, "opening socket failed\n"); + return -errno; + } + + chan.cmd = ETHTOOL_GCHANNELS; + snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", ifname); + ifr.ifr_data = (void *)&chan; + + if (ioctl(fd, SIOCETHTOOL, &ifr) < 0) { + fprintf(stderr, "SIOCETHTOOL failed\n"); + ret = -errno; + goto out; + } + + *combined_count = chan.combined_count; + *tx_count = chan.tx_count; + *rx_count = chan.rx_count; +out: + close(fd); + return ret; +} diff --git a/shared/net-util.h b/shared/net-util.h index 0208923e5..59d201210 100644 --- a/shared/net-util.h +++ b/shared/net-util.h @@ -8,6 +8,7 @@ #pragma once #include <ifaddrs.h> +#include <inttypes.h> #include <stdbool.h> /* @@ -64,3 +65,18 @@ bool shr_iface_primary_addr_matches(const struct ifaddrs *iface_list, */ int shr_route_get_egress_iface(const char *saddr, const char *daddr, char *ifname, size_t iflen); + +/* + * shr_netdev_get_hw_queues - Get h/w queues details for a netdevice + * + * @ifname: Name of network interface + * @combined_count: combined h/w queue count + * @tx_count: tx queue count + * @rx_count: rx queue count + * + * Retrieves the NIC h/w queue details. + * + * Return: 0 on success and negative errno on failure. + */ +int shr_netdev_get_hw_queues(const char *ifname, uint32_t *combined_count, + uint32_t *tx_count, uint32_t *rx_count); -- 2.53.0