diff options
author | Lennart Poettering <lennart@poettering.net> | 2020-04-30 08:06:26 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-30 08:06:26 +0200 |
commit | d47df15b11b139ea5848e9dbf14efbed5dc0be2e (patch) | |
tree | be1d79f32dcec30948f3a92e9da659df116a1edd | |
parent | f20078df0b568cf365eea8278e98170e59ce2b2d (diff) | |
parent | e81f5fc4e86cef5a99e37eaaa2e5fb869bc76039 (diff) | |
download | systemd-d47df15b11b139ea5848e9dbf14efbed5dc0be2e.tar.gz |
Merge pull request #15630 from nabijaczleweli/symmetric-buffers
link: Allow configuring RX mini and jumbo ring sizes, too
-rw-r--r-- | man/systemd.link.xml | 20 | ||||
-rw-r--r-- | src/shared/ethtool-util.c | 32 | ||||
-rw-r--r-- | src/shared/ethtool-util.h | 4 | ||||
-rw-r--r-- | src/udev/net/link-config-gperf.gperf | 2 | ||||
-rw-r--r-- | src/udev/net/link-config.c | 2 | ||||
-rw-r--r-- | test/fuzz/fuzz-link-parser/directives.link | 2 |
6 files changed, 49 insertions, 13 deletions
diff --git a/man/systemd.link.xml b/man/systemd.link.xml index e04618340b..7e17bf095f 100644 --- a/man/systemd.link.xml +++ b/man/systemd.link.xml @@ -691,13 +691,29 @@ <varlistentry> <term><varname>RxBufferSize=</varname></term> <listitem> - <para>Takes a integer. Specifies the NIC receive ring buffer size. When unset, the kernel's default will be used.</para> + <para>Takes an integer. Specifies the maximum number of pending packets in the NIC receive buffer. + When unset, the kernel's default will be used.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><varname>RxMiniBufferSize=</varname></term> + <listitem> + <para>Takes an integer. Specifies the maximum number of pending packets in the NIC mini receive buffer. + When unset, the kernel's default will be used.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><varname>RxJumboBufferSize=</varname></term> + <listitem> + <para>Takes an integer. Specifies the maximum number of pending packets in the NIC jumbo receive buffer. + When unset, the kernel's default will be used.</para> </listitem> </varlistentry> <varlistentry> <term><varname>TxBufferSize=</varname></term> <listitem> - <para>Takes a integer. Specifies the NIC transmit ring buffer size. When unset, the kernel's default will be used.</para> + <para>Takes an integer. Specifies the maximum number of pending packets in the NIC transmit buffer. + When unset, the kernel's default will be used.</para> </listitem> </varlistentry> <varlistentry> diff --git a/src/shared/ethtool-util.c b/src/shared/ethtool-util.c index fe29af24d0..0cde87f5ac 100644 --- a/src/shared/ethtool-util.c +++ b/src/shared/ethtool-util.c @@ -431,18 +431,24 @@ int ethtool_set_nic_buffer_size(int *ethtool_fd, const char *ifname, netdev_ring if (r < 0) return -errno; - if (ring->rx_pending_set) { - if (ecmd.rx_pending != ring->rx_pending) { - ecmd.rx_pending = ring->rx_pending; - need_update = true; - } + if (ring->rx_pending_set && ecmd.rx_pending != ring->rx_pending) { + ecmd.rx_pending = ring->rx_pending; + need_update = true; } - if (ring->tx_pending_set) { - if (ecmd.tx_pending != ring->tx_pending) { - ecmd.tx_pending = ring->tx_pending; - need_update = true; - } + if (ring->rx_mini_pending_set && ecmd.rx_mini_pending != ring->rx_mini_pending) { + ecmd.rx_mini_pending = ring->rx_mini_pending; + need_update = true; + } + + if (ring->rx_jumbo_pending_set && ecmd.rx_jumbo_pending != ring->rx_jumbo_pending) { + ecmd.rx_jumbo_pending = ring->rx_jumbo_pending; + need_update = true; + } + + if (ring->tx_pending_set && ecmd.tx_pending != ring->tx_pending) { + ecmd.tx_pending = ring->tx_pending; + need_update = true; } if (need_update) { @@ -1036,6 +1042,12 @@ int config_parse_nic_buffer_size(const char *unit, if (streq(lvalue, "RxBufferSize")) { ring->rx_pending = k; ring->rx_pending_set = true; + } else if (streq(lvalue, "RxMiniBufferSize")) { + ring->rx_mini_pending = k; + ring->rx_mini_pending_set = true; + } else if (streq(lvalue, "RxJumboBufferSize")) { + ring->rx_jumbo_pending = k; + ring->rx_jumbo_pending_set = true; } else if (streq(lvalue, "TxBufferSize")) { ring->tx_pending = k; ring->tx_pending_set = true; diff --git a/src/shared/ethtool-util.h b/src/shared/ethtool-util.h index 55c41f5bc7..4730241708 100644 --- a/src/shared/ethtool-util.h +++ b/src/shared/ethtool-util.h @@ -84,9 +84,13 @@ typedef struct netdev_channels { typedef struct netdev_ring_param { uint32_t rx_pending; + uint32_t rx_mini_pending; + uint32_t rx_jumbo_pending; uint32_t tx_pending; bool rx_pending_set; + bool rx_mini_pending_set; + bool rx_jumbo_pending_set; bool tx_pending_set; } netdev_ring_param; diff --git a/src/udev/net/link-config-gperf.gperf b/src/udev/net/link-config-gperf.gperf index 2784246dd7..60a9d21c1d 100644 --- a/src/udev/net/link-config-gperf.gperf +++ b/src/udev/net/link-config-gperf.gperf @@ -59,6 +59,8 @@ Link.OtherChannels, config_parse_channel, 0, Link.CombinedChannels, config_parse_channel, 0, offsetof(link_config, channels) Link.Advertise, config_parse_advertise, 0, offsetof(link_config, advertise) Link.RxBufferSize, config_parse_nic_buffer_size, 0, offsetof(link_config, ring) +Link.RxMiniBufferSize, config_parse_nic_buffer_size, 0, offsetof(link_config, ring) +Link.RxJumboBufferSize, config_parse_nic_buffer_size, 0, offsetof(link_config, ring) Link.TxBufferSize, config_parse_nic_buffer_size, 0, offsetof(link_config, ring) Link.RxFlowControl, config_parse_tristate, 0, offsetof(link_config, rx_flow_control) Link.TxFlowControl, config_parse_tristate, 0, offsetof(link_config, tx_flow_control) diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 48039511fa..098aa59913 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -407,7 +407,7 @@ int link_config_apply(link_config_ctx *ctx, link_config *config, log_warning_errno(r, "Could not set channels of %s: %m", old_name); } - if (config->ring.rx_pending_set || config->ring.tx_pending_set) { + if (config->ring.rx_pending_set || config->ring.rx_mini_pending_set || config->ring.rx_jumbo_pending_set || config->ring.tx_pending_set) { r = ethtool_set_nic_buffer_size(&ctx->ethtool_fd, old_name, &config->ring); if (r < 0) log_warning_errno(r, "Could not set ring buffer of %s: %m", old_name); diff --git a/test/fuzz/fuzz-link-parser/directives.link b/test/fuzz/fuzz-link-parser/directives.link index fe71d26d89..7d23a9ecf8 100644 --- a/test/fuzz/fuzz-link-parser/directives.link +++ b/test/fuzz/fuzz-link-parser/directives.link @@ -40,6 +40,8 @@ OtherChannels= CombinedChannels= Advertise= RxBufferSize= +RxMiniBufferSize= +RxJumboBufferSize= TxBufferSize= RxFlowControl= TxFlowControl= |