]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
link: Allow configuring RX mini and jumbo ring sizes, too 15630/head
authornabijaczleweli <nabijaczleweli@gmail.com>
Wed, 29 Apr 2020 00:00:25 +0000 (02:00 +0200)
committernabijaczleweli <nabijaczleweli@gmail.com>
Wed, 29 Apr 2020 16:57:13 +0000 (18:57 +0200)
This now covers all ethtool_ringparam configurables (as of v5.6;
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/ethtool.h?h=v5.6#n488)

man/systemd.link.xml
src/shared/ethtool-util.c
src/shared/ethtool-util.h
src/udev/net/link-config-gperf.gperf
src/udev/net/link-config.c
test/fuzz/fuzz-link-parser/directives.link

index 34d4834cca7f76c64edec643345a739dca30cd8a..7e17bf095fe8432e2a9ead034fb1988fb4dd56fa 100644 (file)
           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>
index 703e48025eba1f50c963724e48e38f4ac9927a51..0cde87f5ac34f80b55ba49383a0d6ebd67da5ced 100644 (file)
@@ -436,6 +436,16 @@ int ethtool_set_nic_buffer_size(int *ethtool_fd, const char *ifname, netdev_ring
                 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;
@@ -1032,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;
index 55c41f5bc751ef082e7ed32c1a50100947cf1139..47302417089874025badb0723cd47baa4cdde676 100644 (file)
@@ -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;
 
index 2784246dd7155547d175f74b58af4704d8deb649..60a9d21c1d11ec1b58badaecf3296030a918a62b 100644 (file)
@@ -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)
index 48039511fa69bc5d778f30e7c1f1cfa1c364cad7..098aa599133ca318311f69e23aad9877b60402a0 100644 (file)
@@ -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);
index fe71d26d89e866e4dee775b5f1ee83f78be65b8f..7d23a9ecf8e0bb59d7e4619623e8f967b75c653b 100644 (file)
@@ -40,6 +40,8 @@ OtherChannels=
 CombinedChannels=
 Advertise=
 RxBufferSize=
+RxMiniBufferSize=
+RxJumboBufferSize=
 TxBufferSize=
 RxFlowControl=
 TxFlowControl=