mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-10-26 17:25:34 +03:00
udev: Support "max" string for BufferSize options (#20458)
"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.
This commit is contained in:
parent
91546abf9e
commit
406041b7de
@ -735,29 +735,33 @@
|
|||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>RxBufferSize=</varname></term>
|
<term><varname>RxBufferSize=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Takes an integer. Specifies the maximum number of pending packets in the NIC receive buffer.
|
<para>Takes an integer or <literal>max</literal>. Specifies the maximum number of pending packets
|
||||||
When unset, the kernel's default will be used.</para>
|
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>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>RxMiniBufferSize=</varname></term>
|
<term><varname>RxMiniBufferSize=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Takes an integer. Specifies the maximum number of pending packets in the NIC mini receive buffer.
|
<para>Takes an integer or <literal>max</literal>. Specifies the maximum number of pending packets
|
||||||
When unset, the kernel's default will be used.</para>
|
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>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>RxJumboBufferSize=</varname></term>
|
<term><varname>RxJumboBufferSize=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Takes an integer. Specifies the maximum number of pending packets in the NIC jumbo receive buffer.
|
<para>Takes an integer or <literal>max</literal>. Specifies the maximum number of pending packets
|
||||||
When unset, the kernel's default will be used.</para>
|
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>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>TxBufferSize=</varname></term>
|
<term><varname>TxBufferSize=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Takes an integer. Specifies the maximum number of pending packets in the NIC transmit buffer.
|
<para>Takes an integer or <literal>max</literal>. Specifies the maximum number of pending packets
|
||||||
When unset, the kernel's default will be used.</para>
|
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>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
|
@ -399,16 +399,24 @@ int ethtool_set_nic_buffer_size(int *ethtool_fd, const char *ifname, const netde
|
|||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
if (ring->rx_pending_set)
|
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)
|
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)
|
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)
|
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)
|
if (!need_update)
|
||||||
return 0;
|
return 0;
|
||||||
@ -1047,16 +1055,20 @@ int config_parse_nic_buffer_size(
|
|||||||
assert(rvalue);
|
assert(rvalue);
|
||||||
assert(data);
|
assert(data);
|
||||||
|
|
||||||
r = safe_atou32(rvalue, &k);
|
if (streq(rvalue, "max"))
|
||||||
if (r < 0) {
|
k = 0;
|
||||||
log_syntax(unit, LOG_WARNING, filename, line, r,
|
else {
|
||||||
"Failed to parse interface buffer value, ignoring: %s", rvalue);
|
r = safe_atou32(rvalue, &k);
|
||||||
return 0;
|
if (r < 0) {
|
||||||
}
|
log_syntax(unit, LOG_WARNING, filename, line, r,
|
||||||
if (k < 1) {
|
"Failed to parse interface buffer value, ignoring: %s", rvalue);
|
||||||
log_syntax(unit, LOG_WARNING, filename, line, 0,
|
return 0;
|
||||||
"Invalid %s= value, ignoring: %s", lvalue, 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")) {
|
if (streq(lvalue, "RxBufferSize")) {
|
||||||
|
@ -70,6 +70,8 @@ typedef struct netdev_channels {
|
|||||||
} netdev_channels;
|
} netdev_channels;
|
||||||
|
|
||||||
typedef struct netdev_ring_param {
|
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_pending;
|
||||||
uint32_t rx_mini_pending;
|
uint32_t rx_mini_pending;
|
||||||
uint32_t rx_jumbo_pending;
|
uint32_t rx_jumbo_pending;
|
||||||
|
Loading…
Reference in New Issue
Block a user