From 59c60cccf54bcb8067c20b5e4751c8c041498058 Mon Sep 17 00:00:00 2001 From: Fernando Fernandez Mancera Date: Tue, 22 Feb 2022 15:51:09 +0100 Subject: [PATCH] ovsdb: set DPDK port MTU when creating them The DPDK port will not have a link after the devbind which is needed for configuring an interface to be a DPDK port. The MTU is being committed during the link change but for DPDK ports there is no link. The DPDK port MTU should be set on ovsdb right after the interface is added to ovsdb. This way the users will be able to set MTU for DPDK ports and modify it. Please see the following results: ``` port 2: iface0 (dpdk: configured_rx_queues=1, configured_rxq_descriptors=2048, configured_tx_queues=3, configured_txq_descriptors=2048, lsc_interrupt_mode=false, mtu=2000, requested_rx_queues=1, requested_rxq_descriptors=2048, requested_tx_queues=3, requested_txq_descriptors=2048, rx_csum_offload=true, tx_tso_offload=false) ``` --- src/core/devices/ovs/nm-device-ovs-port.c | 46 ++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/src/core/devices/ovs/nm-device-ovs-port.c b/src/core/devices/ovs/nm-device-ovs-port.c index 500dbc0fdd..8406c3648c 100644 --- a/src/core/devices/ovs/nm-device-ovs-port.c +++ b/src/core/devices/ovs/nm-device-ovs-port.c @@ -15,7 +15,8 @@ #include "nm-active-connection.h" #include "nm-setting-connection.h" #include "nm-setting-ovs-port.h" -#include "nm-setting-ovs-port.h" +#include "nm-setting-ovs-interface.h" +#include "nm-setting-wired.h" #define _NMLOG_DEVICE_TYPE NMDeviceOvsPort #include "devices/nm-device-logging.h" @@ -87,6 +88,33 @@ add_iface_cb(GError *error, gpointer user_data) g_object_unref(slave); } +static gboolean +_ovs_interface_is_dpdk(NMDevice *device) +{ + NMSettingOvsInterface *s_ovs_iface; + + s_ovs_iface = nm_device_get_applied_setting(device, NM_TYPE_SETTING_OVS_INTERFACE); + + g_return_val_if_fail(s_ovs_iface, FALSE); + + return nm_streq(nm_setting_ovs_interface_get_interface_type(s_ovs_iface), "dpdk"); +} + +static void +set_mtu_cb(GError *error, gpointer user_data) +{ + NMDevice *self = user_data; + + if (error && !g_error_matches(error, NM_UTILS_ERROR, NM_UTILS_ERROR_CANCELLED_DISPOSING)) { + _LOGW(LOGD_DEVICE, + "could not change mtu of '%s': %s", + nm_device_get_iface(self), + error->message); + } + + g_object_unref(self); +} + static gboolean enslave_slave(NMDevice *device, NMDevice *slave, NMConnection *connection, gboolean configure) { @@ -94,6 +122,7 @@ enslave_slave(NMDevice *device, NMDevice *slave, NMConnection *connection, gbool NMActiveConnection *ac_port = NULL; NMActiveConnection *ac_bridge = NULL; NMDevice *bridge_device; + NMSettingWired *s_wired; if (!configure) return TRUE; @@ -122,6 +151,21 @@ enslave_slave(NMDevice *device, NMDevice *slave, NMConnection *connection, gbool add_iface_cb, g_object_ref(slave)); + /* DPDK ports does not have a link after the devbind, so the MTU must be + * set on ovsdb after adding the interface. */ + if (NM_IS_DEVICE_OVS_INTERFACE(slave) && _ovs_interface_is_dpdk(slave)) { + s_wired = nm_device_get_applied_setting(slave, NM_TYPE_SETTING_WIRED); + + if (!s_wired || !nm_setting_wired_get_mtu(s_wired)) + return TRUE; + + nm_ovsdb_set_interface_mtu(nm_ovsdb_get(), + nm_device_get_ip_iface(slave), + nm_setting_wired_get_mtu(s_wired), + set_mtu_cb, + g_object_ref(slave)); + } + return TRUE; }