On 03/15, Tushar Vyavahare 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) Hmm, now that we have set/get, should we put them into network_helpers.c? These seem pretty generic if you accept iface_name + ethtool_ringparam in the api. > +{ > + 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) { Is it to retry EINTR? Retrying something else doesn't make sense probably? So maybe do only errno==EINTR cases? Will make it more generic and not dependent on 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); Same here. Not sure what's the purpose of sleep? Alternatively, maybe clarify in the commit description what particular error case we want to retry.