From 72328a5977d240d33b78b24e7a6b65b1074000b9 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 26 Aug 2021 03:31:05 +0900 Subject: [PATCH 1/2] ethtool: move function I'd like to locate all conf parsers at end of file. --- src/shared/ethtool-util.c | 250 +++++++++++++++++++------------------- 1 file changed, 125 insertions(+), 125 deletions(-) diff --git a/src/shared/ethtool-util.c b/src/shared/ethtool-util.c index c47d819f0596..af3b917c75cb 100644 --- a/src/shared/ethtool-util.c +++ b/src/shared/ethtool-util.c @@ -932,6 +932,131 @@ int ethtool_set_flow_control(int *fd, const char *ifname, int rx, int tx, int au return 0; } +int ethtool_set_nic_coalesce_settings(int *ethtool_fd, const char *ifname, const netdev_coalesce_param *coalesce) { + struct ethtool_coalesce ecmd = { + .cmd = ETHTOOL_GCOALESCE, + }; + struct ifreq ifr = { + .ifr_data = (void*) &ecmd, + }; + bool need_update = false; + int r; + + assert(ethtool_fd); + assert(ifname); + assert(coalesce); + + if (coalesce->use_adaptive_rx_coalesce < 0 && + coalesce->use_adaptive_tx_coalesce < 0 && + !coalesce->rx_coalesce_usecs.set && + !coalesce->rx_max_coalesced_frames.set && + !coalesce->rx_coalesce_usecs_irq.set && + !coalesce->rx_max_coalesced_frames_irq.set && + !coalesce->tx_coalesce_usecs.set && + !coalesce->tx_max_coalesced_frames.set && + !coalesce->tx_coalesce_usecs_irq.set && + !coalesce->tx_max_coalesced_frames_irq.set && + !coalesce->stats_block_coalesce_usecs.set && + !coalesce->pkt_rate_low.set && + !coalesce->rx_coalesce_usecs_low.set && + !coalesce->rx_max_coalesced_frames_low.set && + !coalesce->tx_coalesce_usecs_low.set && + !coalesce->tx_max_coalesced_frames_low.set && + !coalesce->pkt_rate_high.set && + !coalesce->rx_coalesce_usecs_high.set && + !coalesce->rx_max_coalesced_frames_high.set && + !coalesce->tx_coalesce_usecs_high.set && + !coalesce->tx_max_coalesced_frames_high.set && + !coalesce->rate_sample_interval.set) + return 0; + + r = ethtool_connect(ethtool_fd); + if (r < 0) + return r; + + strscpy(ifr.ifr_name, IFNAMSIZ, ifname); + + r = ioctl(*ethtool_fd, SIOCETHTOOL, &ifr); + if (r < 0) + return -errno; + + if (coalesce->use_adaptive_rx_coalesce >= 0) + UPDATE(ecmd.use_adaptive_rx_coalesce, (uint32_t) coalesce->use_adaptive_rx_coalesce, need_update); + + if (coalesce->use_adaptive_tx_coalesce >= 0) + UPDATE(ecmd.use_adaptive_tx_coalesce, (uint32_t) coalesce->use_adaptive_tx_coalesce, need_update); + + if (coalesce->rx_coalesce_usecs.set) + UPDATE(ecmd.rx_coalesce_usecs, coalesce->rx_coalesce_usecs.value, need_update); + + if (coalesce->rx_max_coalesced_frames.set) + UPDATE(ecmd.rx_max_coalesced_frames, coalesce->rx_max_coalesced_frames.value, need_update); + + if (coalesce->rx_coalesce_usecs_irq.set) + UPDATE(ecmd.rx_coalesce_usecs_irq, coalesce->rx_coalesce_usecs_irq.value, need_update); + + if (coalesce->rx_max_coalesced_frames_irq.set) + UPDATE(ecmd.rx_max_coalesced_frames_irq, coalesce->rx_max_coalesced_frames_irq.value, need_update); + + if (coalesce->tx_coalesce_usecs.set) + UPDATE(ecmd.tx_coalesce_usecs, coalesce->tx_coalesce_usecs.value, need_update); + + if (coalesce->tx_max_coalesced_frames.set) + UPDATE(ecmd.tx_max_coalesced_frames, coalesce->tx_max_coalesced_frames.value, need_update); + + if (coalesce->tx_coalesce_usecs_irq.set) + UPDATE(ecmd.tx_coalesce_usecs_irq, coalesce->tx_coalesce_usecs_irq.value, need_update); + + if (coalesce->tx_max_coalesced_frames_irq.set) + UPDATE(ecmd.tx_max_coalesced_frames_irq, coalesce->tx_max_coalesced_frames_irq.value, need_update); + + if (coalesce->stats_block_coalesce_usecs.set) + UPDATE(ecmd.stats_block_coalesce_usecs, coalesce->stats_block_coalesce_usecs.value, need_update); + + if (coalesce->pkt_rate_low.set) + UPDATE(ecmd.pkt_rate_low, coalesce->pkt_rate_low.value, need_update); + + if (coalesce->rx_coalesce_usecs_low.set) + UPDATE(ecmd.rx_coalesce_usecs_low, coalesce->rx_coalesce_usecs_low.value, need_update); + + if (coalesce->rx_max_coalesced_frames_low.set) + UPDATE(ecmd.rx_max_coalesced_frames_low, coalesce->rx_max_coalesced_frames_low.value, need_update); + + if (coalesce->tx_coalesce_usecs_low.set) + UPDATE(ecmd.tx_coalesce_usecs_low, coalesce->tx_coalesce_usecs_low.value, need_update); + + if (coalesce->tx_max_coalesced_frames_low.set) + UPDATE(ecmd.tx_max_coalesced_frames_low, coalesce->tx_max_coalesced_frames_low.value, need_update); + + if (coalesce->pkt_rate_high.set) + UPDATE(ecmd.pkt_rate_high, coalesce->pkt_rate_high.value, need_update); + + if (coalesce->rx_coalesce_usecs_high.set) + UPDATE(ecmd.rx_coalesce_usecs_high, coalesce->rx_coalesce_usecs_high.value, need_update); + + if (coalesce->rx_max_coalesced_frames_high.set) + UPDATE(ecmd.rx_max_coalesced_frames_high, coalesce->rx_max_coalesced_frames_high.value, need_update); + + if (coalesce->tx_coalesce_usecs_high.set) + UPDATE(ecmd.tx_coalesce_usecs_high, coalesce->tx_coalesce_usecs_high.value, need_update); + + if (coalesce->tx_max_coalesced_frames_high.set) + UPDATE(ecmd.tx_max_coalesced_frames_high, coalesce->tx_max_coalesced_frames_high.value, need_update); + + if (coalesce->rate_sample_interval.set) + UPDATE(ecmd.rate_sample_interval, DIV_ROUND_UP(coalesce->rate_sample_interval.value, USEC_PER_SEC), need_update); + + if (!need_update) + return 0; + + ecmd.cmd = ETHTOOL_SCOALESCE; + r = ioctl(*ethtool_fd, SIOCETHTOOL, &ifr); + if (r < 0) + return -errno; + + return 0; +} + int config_parse_advertise( const char *unit, const char *filename, @@ -1182,128 +1307,3 @@ int config_parse_coalesce_sec( return 0; } - -int ethtool_set_nic_coalesce_settings(int *ethtool_fd, const char *ifname, const netdev_coalesce_param *coalesce) { - struct ethtool_coalesce ecmd = { - .cmd = ETHTOOL_GCOALESCE, - }; - struct ifreq ifr = { - .ifr_data = (void*) &ecmd, - }; - bool need_update = false; - int r; - - assert(ethtool_fd); - assert(ifname); - assert(coalesce); - - if (coalesce->use_adaptive_rx_coalesce < 0 && - coalesce->use_adaptive_tx_coalesce < 0 && - !coalesce->rx_coalesce_usecs.set && - !coalesce->rx_max_coalesced_frames.set && - !coalesce->rx_coalesce_usecs_irq.set && - !coalesce->rx_max_coalesced_frames_irq.set && - !coalesce->tx_coalesce_usecs.set && - !coalesce->tx_max_coalesced_frames.set && - !coalesce->tx_coalesce_usecs_irq.set && - !coalesce->tx_max_coalesced_frames_irq.set && - !coalesce->stats_block_coalesce_usecs.set && - !coalesce->pkt_rate_low.set && - !coalesce->rx_coalesce_usecs_low.set && - !coalesce->rx_max_coalesced_frames_low.set && - !coalesce->tx_coalesce_usecs_low.set && - !coalesce->tx_max_coalesced_frames_low.set && - !coalesce->pkt_rate_high.set && - !coalesce->rx_coalesce_usecs_high.set && - !coalesce->rx_max_coalesced_frames_high.set && - !coalesce->tx_coalesce_usecs_high.set && - !coalesce->tx_max_coalesced_frames_high.set && - !coalesce->rate_sample_interval.set) - return 0; - - r = ethtool_connect(ethtool_fd); - if (r < 0) - return r; - - strscpy(ifr.ifr_name, IFNAMSIZ, ifname); - - r = ioctl(*ethtool_fd, SIOCETHTOOL, &ifr); - if (r < 0) - return -errno; - - if (coalesce->use_adaptive_rx_coalesce >= 0) - UPDATE(ecmd.use_adaptive_rx_coalesce, (uint32_t) coalesce->use_adaptive_rx_coalesce, need_update); - - if (coalesce->use_adaptive_tx_coalesce >= 0) - UPDATE(ecmd.use_adaptive_tx_coalesce, (uint32_t) coalesce->use_adaptive_tx_coalesce, need_update); - - if (coalesce->rx_coalesce_usecs.set) - UPDATE(ecmd.rx_coalesce_usecs, coalesce->rx_coalesce_usecs.value, need_update); - - if (coalesce->rx_max_coalesced_frames.set) - UPDATE(ecmd.rx_max_coalesced_frames, coalesce->rx_max_coalesced_frames.value, need_update); - - if (coalesce->rx_coalesce_usecs_irq.set) - UPDATE(ecmd.rx_coalesce_usecs_irq, coalesce->rx_coalesce_usecs_irq.value, need_update); - - if (coalesce->rx_max_coalesced_frames_irq.set) - UPDATE(ecmd.rx_max_coalesced_frames_irq, coalesce->rx_max_coalesced_frames_irq.value, need_update); - - if (coalesce->tx_coalesce_usecs.set) - UPDATE(ecmd.tx_coalesce_usecs, coalesce->tx_coalesce_usecs.value, need_update); - - if (coalesce->tx_max_coalesced_frames.set) - UPDATE(ecmd.tx_max_coalesced_frames, coalesce->tx_max_coalesced_frames.value, need_update); - - if (coalesce->tx_coalesce_usecs_irq.set) - UPDATE(ecmd.tx_coalesce_usecs_irq, coalesce->tx_coalesce_usecs_irq.value, need_update); - - if (coalesce->tx_max_coalesced_frames_irq.set) - UPDATE(ecmd.tx_max_coalesced_frames_irq, coalesce->tx_max_coalesced_frames_irq.value, need_update); - - if (coalesce->stats_block_coalesce_usecs.set) - UPDATE(ecmd.stats_block_coalesce_usecs, coalesce->stats_block_coalesce_usecs.value, need_update); - - if (coalesce->pkt_rate_low.set) - UPDATE(ecmd.pkt_rate_low, coalesce->pkt_rate_low.value, need_update); - - if (coalesce->rx_coalesce_usecs_low.set) - UPDATE(ecmd.rx_coalesce_usecs_low, coalesce->rx_coalesce_usecs_low.value, need_update); - - if (coalesce->rx_max_coalesced_frames_low.set) - UPDATE(ecmd.rx_max_coalesced_frames_low, coalesce->rx_max_coalesced_frames_low.value, need_update); - - if (coalesce->tx_coalesce_usecs_low.set) - UPDATE(ecmd.tx_coalesce_usecs_low, coalesce->tx_coalesce_usecs_low.value, need_update); - - if (coalesce->tx_max_coalesced_frames_low.set) - UPDATE(ecmd.tx_max_coalesced_frames_low, coalesce->tx_max_coalesced_frames_low.value, need_update); - - if (coalesce->pkt_rate_high.set) - UPDATE(ecmd.pkt_rate_high, coalesce->pkt_rate_high.value, need_update); - - if (coalesce->rx_coalesce_usecs_high.set) - UPDATE(ecmd.rx_coalesce_usecs_high, coalesce->rx_coalesce_usecs_high.value, need_update); - - if (coalesce->rx_max_coalesced_frames_high.set) - UPDATE(ecmd.rx_max_coalesced_frames_high, coalesce->rx_max_coalesced_frames_high.value, need_update); - - if (coalesce->tx_coalesce_usecs_high.set) - UPDATE(ecmd.tx_coalesce_usecs_high, coalesce->tx_coalesce_usecs_high.value, need_update); - - if (coalesce->tx_max_coalesced_frames_high.set) - UPDATE(ecmd.tx_max_coalesced_frames_high, coalesce->tx_max_coalesced_frames_high.value, need_update); - - if (coalesce->rate_sample_interval.set) - UPDATE(ecmd.rate_sample_interval, DIV_ROUND_UP(coalesce->rate_sample_interval.value, USEC_PER_SEC), need_update); - - if (!need_update) - return 0; - - ecmd.cmd = ETHTOOL_SCOALESCE; - r = ioctl(*ethtool_fd, SIOCETHTOOL, &ifr); - if (r < 0) - return -errno; - - return 0; -} From ee7512404b5de7c5ac36e09436379fada2ed84e7 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 26 Aug 2021 03:34:23 +0900 Subject: [PATCH 2/2] udev/net: initialize coalesce tristate variables Otherwise, 99-default.link may introduce something like the following warnings: ---- Aug 26 03:23:59 systemd-udevd[519]: wlan0: Could not set coalesce settings, ignoring: Operation not supported Aug 26 03:24:00 systemd-udevd[547]: wlp59s0: Could not set coalesce settings, ignoring: Operation not supported ---- Follow-up for 6c35ea5ef0231d519ff24d43a57a72cebab6a121. --- src/udev/net/link-config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 69f651435034..4963ba2fae81 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -142,6 +142,8 @@ int link_load_one(LinkConfigContext *ctx, const char *filename) { .tx_flow_control = -1, .autoneg_flow_control = -1, .txqueuelen = UINT32_MAX, + .coalesce.use_adaptive_rx_coalesce = -1, + .coalesce.use_adaptive_tx_coalesce = -1, }; for (i = 0; i < ELEMENTSOF(link->features); i++)