From 0e4330f2b4742c6bea3339d4e066217a1b66f056 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 4 Mar 2025 10:08:58 +0100 Subject: [PATCH] ovs: introduce new "ovs-dpdk.lsc-interrupt" property Introduce a new "ovs-dpdk.lsc-interrupt", used to configure the Link State Change (LSC) detection mode. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/2149 --- NEWS | 4 +- src/core/devices/ovs/nm-ovsdb.c | 21 +++++++-- src/libnm-client-impl/libnm.ver | 2 + ...gen-metadata-nm-settings-libnm-core.xml.in | 4 ++ src/libnm-core-impl/nm-setting-ovs-dpdk.c | 46 ++++++++++++++++++- src/libnm-core-public/nm-setting-ovs-dpdk.h | 28 +++++++++-- src/libnmc-setting/nm-meta-setting-desc.c | 5 +- src/libnmc-setting/settings-docs.h.in | 1 + .../gen-metadata-nm-settings-nmcli.xml.in | 4 ++ 9 files changed, 104 insertions(+), 11 deletions(-) diff --git a/NEWS b/NEWS index bdf8b35d71..bd7d247184 100644 --- a/NEWS +++ b/NEWS @@ -8,7 +8,9 @@ subject to change and not guaranteed to be compatible with the later release. USE AT YOUR OWN RISK. NOT RECOMMENDED FOR PRODUCTION USE! -* Added systemd services to provide networking in the initrd. +* Add systemd services to provide networking in the initrd. +* Introduce a new "ovs-dpdk.lsc-interrupt" property to configure the + Link State Change (LSC) detection mode for OVS DPDK interfaces. ============================================= NetworkManager-1.52 diff --git a/src/core/devices/ovs/nm-ovsdb.c b/src/core/devices/ovs/nm-ovsdb.c index 528d44d8f1..d3dda273b1 100644 --- a/src/core/devices/ovs/nm-ovsdb.c +++ b/src/core/devices/ovs/nm-ovsdb.c @@ -903,15 +903,17 @@ _insert_interface(json_t *params, s_ovs_patch = nm_connection_get_setting_ovs_patch(interface); if (s_ovs_dpdk) { - const char *devargs; - guint32 n_rxq; - guint32 n_rxq_desc; - guint32 n_txq_desc; + const char *devargs; + guint32 n_rxq; + guint32 n_rxq_desc; + guint32 n_txq_desc; + NMSettingOvsDpdkLscInterrupt lsc_int; devargs = nm_setting_ovs_dpdk_get_devargs(s_ovs_dpdk); n_rxq = nm_setting_ovs_dpdk_get_n_rxq(s_ovs_dpdk); n_rxq_desc = nm_setting_ovs_dpdk_get_n_rxq_desc(s_ovs_dpdk); n_txq_desc = nm_setting_ovs_dpdk_get_n_txq_desc(s_ovs_dpdk); + lsc_int = nm_setting_ovs_dpdk_get_lsc_interrupt(s_ovs_dpdk); dpdk_array = json_array(); @@ -933,6 +935,17 @@ _insert_interface(json_t *params, json_pack("[s,s]", "n_txq_desc", nm_sprintf_buf(sbuf, "%u", n_txq_desc))); } + switch (lsc_int) { + case NM_SETTING_OVS_DPDK_LSC_INTERRUPT_IGNORE: + break; + case NM_SETTING_OVS_DPDK_LSC_INTERRUPT_ENABLED: + json_array_append_new(dpdk_array, json_pack("[s,s]", "dpdk-lsc-interrupt", "true")); + break; + case NM_SETTING_OVS_DPDK_LSC_INTERRUPT_DISABLED: + json_array_append_new(dpdk_array, json_pack("[s,s]", "dpdk-lsc-interrupt", "false")); + break; + } + json_array_append_new(options, dpdk_array); } else if (s_ovs_patch) { diff --git a/src/libnm-client-impl/libnm.ver b/src/libnm-client-impl/libnm.ver index 5c47b9679f..920caa4efb 100644 --- a/src/libnm-client-impl/libnm.ver +++ b/src/libnm-client-impl/libnm.ver @@ -2053,4 +2053,6 @@ libnm_1_54_0 { global: nm_setting_ip_config_forwarding_get_type; nm_setting_ip_config_get_forwarding; + nm_setting_ovs_dpdk_get_lsc_interrupt; + nm_setting_ovs_dpdk_lsc_interrupt_get_type; } libnm_1_52_0; diff --git a/src/libnm-core-impl/gen-metadata-nm-settings-libnm-core.xml.in b/src/libnm-core-impl/gen-metadata-nm-settings-libnm-core.xml.in index e1bc1feb76..44e338bb9a 100644 --- a/src/libnm-core-impl/gen-metadata-nm-settings-libnm-core.xml.in +++ b/src/libnm-core-impl/gen-metadata-nm-settings-libnm-core.xml.in @@ -2128,6 +2128,10 @@ dbus-type="s" gprop-type="gchararray" /> + n_txq_desc; } +/** + * nm_setting_ovs_dpdk_get_lsc_interrupt: + * @self: the #NMSettingOvsDpdk + * + * Returns: the #NMSettingOvsDpdk:lsc-interrupt property of the setting + * + * Since: 1.54 + **/ +NMSettingOvsDpdkLscInterrupt +nm_setting_ovs_dpdk_get_lsc_interrupt(NMSettingOvsDpdk *self) +{ + g_return_val_if_fail(NM_IS_SETTING_OVS_DPDK(self), NM_SETTING_OVS_DPDK_LSC_INTERRUPT_IGNORE); + + return self->lsc_interrupt; +} + /*****************************************************************************/ static gboolean @@ -257,6 +278,29 @@ nm_setting_ovs_dpdk_class_init(NMSettingOvsDpdkClass *klass) NMSettingOvsDpdk, n_txq_desc); + /** + * NMSettingOvsDpdk:lsc-interrupt: + * + * Configures the Link State Change (LSC) detection mode for the OVS DPDK interface. + * When set to %NM_SETTING_OVS_DPDK_LSC_INTERRUPT_IGNORE, NetworkManager doesn't + * change the default value configured by Open vSwitch. + * %NM_SETTING_OVS_DPDK_LSC_INTERRUPT_ENABLED enables interrupts. + * %NM_SETTING_OVS_DPDK_LSC_INTERRUPT_DISABLED disables interrupts, thus setting the + * interface in poll mode. + * + * Since: 1.54 + **/ + _nm_setting_property_define_direct_enum(properties_override, + obj_properties, + NM_SETTING_OVS_DPDK_LSC_INTERRUPT, + PROP_LSC_INTERRUPT, + NM_TYPE_SETTING_OVS_DPDK_LSC_INTERRUPT, + NM_SETTING_OVS_DPDK_LSC_INTERRUPT_IGNORE, + NM_SETTING_PARAM_NONE, + NULL, + NMSettingOvsDpdk, + lsc_interrupt); + g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); _nm_setting_class_commit(setting_class, diff --git a/src/libnm-core-public/nm-setting-ovs-dpdk.h b/src/libnm-core-public/nm-setting-ovs-dpdk.h index 0578ab2c48..0883dced08 100644 --- a/src/libnm-core-public/nm-setting-ovs-dpdk.h +++ b/src/libnm-core-public/nm-setting-ovs-dpdk.h @@ -27,13 +27,31 @@ G_BEGIN_DECLS #define NM_SETTING_OVS_DPDK_SETTING_NAME "ovs-dpdk" -#define NM_SETTING_OVS_DPDK_DEVARGS "devargs" -#define NM_SETTING_OVS_DPDK_N_RXQ "n-rxq" -#define NM_SETTING_OVS_DPDK_N_RXQ_DESC "n-rxq-desc" -#define NM_SETTING_OVS_DPDK_N_TXQ_DESC "n-txq-desc" +#define NM_SETTING_OVS_DPDK_DEVARGS "devargs" +#define NM_SETTING_OVS_DPDK_N_RXQ "n-rxq" +#define NM_SETTING_OVS_DPDK_N_RXQ_DESC "n-rxq-desc" +#define NM_SETTING_OVS_DPDK_N_TXQ_DESC "n-txq-desc" +#define NM_SETTING_OVS_DPDK_LSC_INTERRUPT "lsc-interrupt" typedef struct _NMSettingOvsDpdkClass NMSettingOvsDpdkClass; +/** + * NMSettingOvsDpdkLscInterrupt: + * @NM_SETTING_OVS_DPDK_LSC_INTERRUPT_IGNORE: leave the value set to Open vSwitch default + * @NM_SETTING_OVS_DPDK_LSC_INTERRUPT_DISABLED: interrupt disabled (poll mode) + * @NM_SETTING_OVS_DPDK_LSC_INTERRUPT_ENABLED: interrupt enabled + * + * #NMSettingOvsDpdkLscInterrupt indicates whether the interface uses interrupts + * or poll mode for Link State Change (LSC) detection on the OVS DPDK interface. + * + * Since: 1.54 + */ +typedef enum { + NM_SETTING_OVS_DPDK_LSC_INTERRUPT_IGNORE = -1, + NM_SETTING_OVS_DPDK_LSC_INTERRUPT_DISABLED = 0, + NM_SETTING_OVS_DPDK_LSC_INTERRUPT_ENABLED = 1, +} NMSettingOvsDpdkLscInterrupt; + NM_AVAILABLE_IN_1_20 GType nm_setting_ovs_dpdk_get_type(void); NM_AVAILABLE_IN_1_20 @@ -47,6 +65,8 @@ NM_AVAILABLE_IN_1_42 guint32 nm_setting_ovs_dpdk_get_n_rxq_desc(NMSettingOvsDpdk *self); NM_AVAILABLE_IN_1_42 guint32 nm_setting_ovs_dpdk_get_n_txq_desc(NMSettingOvsDpdk *self); +NM_AVAILABLE_IN_1_54 +NMSettingOvsDpdkLscInterrupt nm_setting_ovs_dpdk_get_lsc_interrupt(NMSettingOvsDpdk *self); G_END_DECLS diff --git a/src/libnmc-setting/nm-meta-setting-desc.c b/src/libnmc-setting/nm-meta-setting-desc.c index 002e7f6566..b234504a07 100644 --- a/src/libnmc-setting/nm-meta-setting-desc.c +++ b/src/libnmc-setting/nm-meta-setting-desc.c @@ -7309,7 +7309,10 @@ static const NMMetaPropertyInfo *const property_infos_OVS_DPDK[] = { PROPERTY_INFO_WITH_DESC (NM_SETTING_OVS_DPDK_N_TXQ_DESC, .property_type = &_pt_gobject_int, ), - NULL + PROPERTY_INFO_WITH_DESC (NM_SETTING_OVS_DPDK_LSC_INTERRUPT, + .property_type = &_pt_gobject_enum, + ), + NULL }; #undef _CURRENT_NM_META_SETTING_TYPE diff --git a/src/libnmc-setting/settings-docs.h.in b/src/libnmc-setting/settings-docs.h.in index 17faee0f4d..25aed3cfa9 100644 --- a/src/libnmc-setting/settings-docs.h.in +++ b/src/libnmc-setting/settings-docs.h.in @@ -303,6 +303,7 @@ #define DESCRIBE_DOC_NM_SETTING_OVS_BRIDGE_RSTP_ENABLE N_("Enable or disable RSTP.") #define DESCRIBE_DOC_NM_SETTING_OVS_BRIDGE_STP_ENABLE N_("Enable or disable STP.") #define DESCRIBE_DOC_NM_SETTING_OVS_DPDK_DEVARGS N_("Open vSwitch DPDK device arguments.") +#define DESCRIBE_DOC_NM_SETTING_OVS_DPDK_LSC_INTERRUPT N_("Configures the Link State Change (LSC) detection mode for the OVS DPDK interface. When set to \"ignore\" (-1), NetworkManager doesn't change the default value configured by Open vSwitch. \"enabled\" (1) enables interrupts. \"disabled\" (0) disables interrupts, thus setting the interface in poll mode.") #define DESCRIBE_DOC_NM_SETTING_OVS_DPDK_N_RXQ N_("Open vSwitch DPDK number of rx queues. Defaults to zero which means to leave the parameter in OVS unspecified and effectively configures one queue.") #define DESCRIBE_DOC_NM_SETTING_OVS_DPDK_N_RXQ_DESC N_("The rx queue size (number of rx descriptors) for DPDK ports. Must be zero or a power of 2 between 1 and 4096, and supported by the hardware. Defaults to zero which means to leave the parameter in OVS unspecified and effectively configures 2048 descriptors.") #define DESCRIBE_DOC_NM_SETTING_OVS_DPDK_N_TXQ_DESC N_("The tx queue size (number of tx descriptors) for DPDK ports. Must be zero or a power of 2 between 1 and 4096, and supported by the hardware. Defaults to zero which means to leave the parameter in OVS unspecified and effectively configures 2048 descriptors.") diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in index 4e4045728a..cf902a7e56 100644 --- a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in +++ b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in @@ -1763,6 +1763,10 @@ nmcli-description="The tx queue size (number of tx descriptors) for DPDK ports. Must be zero or a power of 2 between 1 and 4096, and supported by the hardware. Defaults to zero which means to leave the parameter in OVS unspecified and effectively configures 2048 descriptors." format="integer" values="0 - 4096" /> +