summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2020-04-30 08:06:26 +0200
committerGitHub <noreply@github.com>2020-04-30 08:06:26 +0200
commitd47df15b11b139ea5848e9dbf14efbed5dc0be2e (patch)
treebe1d79f32dcec30948f3a92e9da659df116a1edd
parentf20078df0b568cf365eea8278e98170e59ce2b2d (diff)
parente81f5fc4e86cef5a99e37eaaa2e5fb869bc76039 (diff)
downloadsystemd-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.xml20
-rw-r--r--src/shared/ethtool-util.c32
-rw-r--r--src/shared/ethtool-util.h4
-rw-r--r--src/udev/net/link-config-gperf.gperf2
-rw-r--r--src/udev/net/link-config.c2
-rw-r--r--test/fuzz/fuzz-link-parser/directives.link2
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=