]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: Support "max" string for BufferSize options (#20458)
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Wed, 18 Aug 2021 06:59:13 +0000 (07:59 +0100)
committerGitHub <noreply@github.com>
Wed, 18 Aug 2021 06:59:13 +0000 (15:59 +0900)
"max" indicates the hardware advertised maximum queue buffer size
should be used.

The max sizes can be checked by running `ethtool -g <dev>` (Preset maximums).
Since the buffer sizes can't be set to 0 by users, internally we use 0 to
indicate that the hardware advertised maximum should be used.

man/systemd.link.xml
src/shared/ethtool-util.c
src/shared/ethtool-util.h

index ee4356ac3d66b6f14e021eb49168db1b70dd9059..d72533b16253e08dd2b20fafd570be0a130d3240 100644 (file)
       <varlistentry>
         <term><varname>RxBufferSize=</varname></term>
         <listitem>
-          <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>
+          <para>Takes an integer or <literal>max</literal>. Specifies the maximum number of pending packets
+          in the NIC receive buffer. When unset, the kernel's default will be used. If set to
+          <literal>max</literal>, the hardware's advertised maximum size 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>
+          <para>Takes an integer or <literal>max</literal>. Specifies the maximum number of pending packets
+          in the NIC mini receive buffer. When unset, the kernel's default will be used. If set to
+          <literal>max</literal>, the hardware's advertised maximum size 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>
+          <para>Takes an integer or <literal>max</literal>. Specifies the maximum number of pending packets
+          in the NIC jumbo receive buffer. When unset, the kernel's default will be used. If set to
+          <literal>max</literal>, the hardware's advertised maximum size will be used.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>TxBufferSize=</varname></term>
         <listitem>
-          <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>
+          <para>Takes an integer or <literal>max</literal>. Specifies the maximum number of pending packets
+          in the NIC transmit buffer. When unset, the kernel's default will be used. If set to
+          <literal>max</literal>, the hardware's advertised maximum size will be used.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
index 4ca90615f3c148f7a0b2a49f39179f72ef3abc1a..4e81e027b22ffcf65cab15633ed518c465df736f 100644 (file)
@@ -399,16 +399,24 @@ int ethtool_set_nic_buffer_size(int *ethtool_fd, const char *ifname, const netde
                 return -errno;
 
         if (ring->rx_pending_set)
-                UPDATE(ecmd.rx_pending, ring->rx_pending, need_update);
+                UPDATE(ecmd.rx_pending,
+                       ring->rx_pending == 0 ? ecmd.rx_max_pending : ring->rx_pending,
+                       need_update);
 
         if (ring->rx_mini_pending_set)
-                UPDATE(ecmd.rx_mini_pending, ring->rx_mini_pending, need_update);
+                UPDATE(ecmd.rx_mini_pending,
+                       ring->rx_mini_pending == 0 ? ecmd.rx_mini_max_pending : ring->rx_mini_pending,
+                       need_update);
 
         if (ring->rx_jumbo_pending_set)
-                UPDATE(ecmd.rx_jumbo_pending, ring->rx_jumbo_pending, need_update);
+                UPDATE(ecmd.rx_jumbo_pending,
+                       ring->rx_jumbo_pending == 0 ? ecmd.rx_jumbo_max_pending : ring->rx_jumbo_pending,
+                       need_update);
 
         if (ring->tx_pending_set)
-                UPDATE(ecmd.tx_pending, ring->tx_pending, need_update);
+                UPDATE(ecmd.tx_pending,
+                       ring->tx_pending == 0 ? ecmd.tx_max_pending : ring->tx_pending,
+                       need_update);
 
         if (!need_update)
                 return 0;
@@ -1047,16 +1055,20 @@ int config_parse_nic_buffer_size(
         assert(rvalue);
         assert(data);
 
-        r = safe_atou32(rvalue, &k);
-        if (r < 0) {
-                log_syntax(unit, LOG_WARNING, filename, line, r,
-                           "Failed to parse interface buffer value, ignoring: %s", rvalue);
-                return 0;
-        }
-        if (k < 1) {
-                log_syntax(unit, LOG_WARNING, filename, line, 0,
-                           "Invalid %s= value, ignoring: %s", lvalue, rvalue);
-                return 0;
+        if (streq(rvalue, "max"))
+                k = 0;
+        else {
+                r = safe_atou32(rvalue, &k);
+                if (r < 0) {
+                        log_syntax(unit, LOG_WARNING, filename, line, r,
+                                "Failed to parse interface buffer value, ignoring: %s", rvalue);
+                        return 0;
+                }
+                if (k < 1) {
+                        log_syntax(unit, LOG_WARNING, filename, line, 0,
+                                "Invalid %s= value, ignoring: %s", lvalue, rvalue);
+                        return 0;
+                }
         }
 
         if (streq(lvalue, "RxBufferSize")) {
index f0fc40b0595fcb3aa82336d1dd21653de7f07800..f392a1cf42a9c7005550c7487afaa93aaf28f13a 100644 (file)
@@ -70,6 +70,8 @@ typedef struct netdev_channels {
 } netdev_channels;
 
 typedef struct netdev_ring_param {
+        /* For any of the 4 following settings, a value of 0 indicates the hardware advertised maximum should
+         * be used. */
         uint32_t rx_pending;
         uint32_t rx_mini_pending;
         uint32_t rx_jumbo_pending;