On Fri, Mar 15, 2024 at 7:23 AM Tushar Vyavahare <tushar.vyavahare@xxxxxxxxx> wrote: > > Introduce a new function called set_hw_ring_size that allows for the > dynamic configuration of the ring size within the interface. > > Signed-off-by: Tushar Vyavahare <tushar.vyavahare@xxxxxxxxx> > --- > tools/testing/selftests/bpf/xskxceiver.c | 35 ++++++++++++++++++++++++ > 1 file changed, 35 insertions(+) > > diff --git a/tools/testing/selftests/bpf/xskxceiver.c b/tools/testing/selftests/bpf/xskxceiver.c > index 32005bfb9c9f..aafa78307586 100644 > --- a/tools/testing/selftests/bpf/xskxceiver.c > +++ b/tools/testing/selftests/bpf/xskxceiver.c > @@ -441,6 +441,41 @@ static int get_hw_ring_size(struct ifobject *ifobj) > return 0; > } > > +static int set_hw_ring_size(struct ifobject *ifobj, u32 tx, u32 rx) > +{ > + struct ethtool_ringparam ring_param = {0}; > + struct ifreq ifr = {0}; > + int sockfd, ret; > + u32 ctr = 0; > + > + sockfd = socket(AF_INET, SOCK_DGRAM, 0); > + if (sockfd < 0) > + return errno; > + > + memcpy(ifr.ifr_name, ifobj->ifname, sizeof(ifr.ifr_name)); > + > + ring_param.tx_pending = tx; > + ring_param.rx_pending = rx; > + > + ring_param.cmd = ETHTOOL_SRINGPARAM; > + ifr.ifr_data = (char *)&ring_param; > + > + while (ctr++ < SOCK_RECONF_CTR) { > + ret = ioctl(sockfd, SIOCETHTOOL, &ifr); > + if (!ret) > + break; > + /* Retry if it fails */ > + if (ctr >= SOCK_RECONF_CTR) { > + close(sockfd); > + return errno; > + } > + usleep(USLEEP_MAX); Does it really have to sleep or copy paste from other places? This ioctl() is supposed to do synchronous config, no?