summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2023-01-13 10:33:26 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2023-01-17 08:45:04 +0100
commitf930d55fea4a9cd7cd7b7cd9c6875be58719ef4c (patch)
tree0d400d242b4df4126807957757b43918ae8fb289
parent4721f83003be9d0d82c0a4d29708d91a96d42a25 (diff)
all: add support for ovs-dpdk n-rxq-desc and n-txq-descbg/ovs-dpdk-n-queue-desc
https://bugzilla.redhat.com/show_bug.cgi?id=2156385 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1500
-rw-r--r--src/core/devices/ovs/nm-ovsdb.c23
-rw-r--r--src/libnm-client-impl/libnm.ver2
-rw-r--r--src/libnm-core-impl/gen-metadata-nm-settings-libnm-core.xml.in8
-rw-r--r--src/libnm-core-impl/nm-setting-ovs-dpdk.c116
-rw-r--r--src/libnm-core-public/nm-setting-ovs-dpdk.h10
-rw-r--r--src/libnmc-setting/nm-meta-setting-desc.c6
-rw-r--r--src/libnmc-setting/settings-docs.h.in2
-rw-r--r--src/nmcli/gen-metadata-nm-settings-nmcli.xml.in4
8 files changed, 164 insertions, 7 deletions
diff --git a/src/core/devices/ovs/nm-ovsdb.c b/src/core/devices/ovs/nm-ovsdb.c
index d6422434c7..85b7953f7e 100644
--- a/src/core/devices/ovs/nm-ovsdb.c
+++ b/src/core/devices/ovs/nm-ovsdb.c
@@ -867,8 +867,6 @@ _insert_interface(json_t *params,
const char *type = NULL;
NMSettingOvsInterface *s_ovs_iface;
NMSettingOvsDpdk *s_ovs_dpdk;
- const char *devargs;
- guint32 n_rxq;
char sbuf[64];
json_t *dpdk_array;
NMSettingOvsPatch *s_ovs_patch;
@@ -899,8 +897,15 @@ _insert_interface(json_t *params,
s_ovs_patch = nm_connection_get_setting_ovs_patch(interface);
if (s_ovs_dpdk) {
- devargs = nm_setting_ovs_dpdk_get_devargs(s_ovs_dpdk);
- n_rxq = nm_setting_ovs_dpdk_get_n_rxq(s_ovs_dpdk);
+ const char *devargs;
+ guint32 n_rxq;
+ guint32 n_rxq_desc;
+ guint32 n_txq_desc;
+
+ 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);
dpdk_array = json_array();
@@ -911,6 +916,16 @@ _insert_interface(json_t *params,
json_array_append_new(dpdk_array,
json_pack("[s,s]", "n_rxq", nm_sprintf_buf(sbuf, "%u", n_rxq)));
}
+ if (n_rxq_desc != 0) {
+ json_array_append_new(
+ dpdk_array,
+ json_pack("[s,s]", "n_rxq_desc", nm_sprintf_buf(sbuf, "%u", n_rxq_desc)));
+ }
+ if (n_txq_desc != 0) {
+ json_array_append_new(
+ dpdk_array,
+ json_pack("[s,s]", "n_txq_desc", nm_sprintf_buf(sbuf, "%u", n_txq_desc)));
+ }
json_array_append_new(options, dpdk_array);
diff --git a/src/libnm-client-impl/libnm.ver b/src/libnm-client-impl/libnm.ver
index e6807e9d82..c373c82322 100644
--- a/src/libnm-client-impl/libnm.ver
+++ b/src/libnm-client-impl/libnm.ver
@@ -1901,6 +1901,8 @@ global:
nm_setting_loopback_get_mtu;
nm_setting_loopback_get_type;
nm_setting_loopback_new;
+ nm_setting_ovs_dpdk_get_n_rxq_desc;
+ nm_setting_ovs_dpdk_get_n_txq_desc;
nm_setting_ovs_interface_get_ofport_request;
nm_setting_ovs_other_config_get_data;
nm_setting_ovs_other_config_get_data_keys;
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 a5c1fd1699..3b210b1686 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
@@ -1858,6 +1858,14 @@
dbus-type="u"
gprop-type="guint"
/>
+ <property name="n-rxq-desc"
+ dbus-type="u"
+ gprop-type="guint"
+ />
+ <property name="n-txq-desc"
+ dbus-type="u"
+ gprop-type="guint"
+ />
</setting>
<setting name="ovs-external-ids"
gtype="NMSettingOvsExternalIDs"
diff --git a/src/libnm-core-impl/nm-setting-ovs-dpdk.c b/src/libnm-core-impl/nm-setting-ovs-dpdk.c
index e26f918b8b..87e9a3e8ce 100644
--- a/src/libnm-core-impl/nm-setting-ovs-dpdk.c
+++ b/src/libnm-core-impl/nm-setting-ovs-dpdk.c
@@ -22,7 +22,7 @@
/*****************************************************************************/
-NM_GOBJECT_PROPERTIES_DEFINE_BASE(PROP_DEVARGS, PROP_N_RXQ, );
+NM_GOBJECT_PROPERTIES_DEFINE_BASE(PROP_DEVARGS, PROP_N_RXQ, PROP_N_RXQ_DESC, PROP_N_TXQ_DESC, );
/**
* NMSettingOvsDpdk:
@@ -34,6 +34,8 @@ struct _NMSettingOvsDpdk {
char *devargs;
guint32 n_rxq;
+ guint32 n_rxq_desc;
+ guint32 n_txq_desc;
};
struct _NMSettingOvsDpdkClass {
@@ -76,6 +78,72 @@ nm_setting_ovs_dpdk_get_n_rxq(NMSettingOvsDpdk *self)
return self->n_rxq;
}
+/**
+ * nm_setting_ovs_dpdk_get_n_rxq_desc:
+ * @self: the #NMSettingOvsDpdk
+ *
+ * Returns: the #NMSettingOvsDpdk:n-rxq-desc property of the setting
+ *
+ * Since: 1.42
+ **/
+guint32
+nm_setting_ovs_dpdk_get_n_rxq_desc(NMSettingOvsDpdk *self)
+{
+ g_return_val_if_fail(NM_IS_SETTING_OVS_DPDK(self), 0);
+
+ return self->n_rxq_desc;
+}
+
+/**
+ * nm_setting_ovs_dpdk_get_n_txq_desc:
+ * @self: the #NMSettingOvsDpdk
+ *
+ * Returns: the #NMSettingOvsDpdk:n-txq-desc property of the setting
+ *
+ * Since: 1.42
+ **/
+guint32
+nm_setting_ovs_dpdk_get_n_txq_desc(NMSettingOvsDpdk *self)
+{
+ g_return_val_if_fail(NM_IS_SETTING_OVS_DPDK(self), 0);
+
+ return self->n_txq_desc;
+}
+
+/*****************************************************************************/
+
+static gboolean
+verify(NMSetting *setting, NMConnection *connection, GError **error)
+{
+ NMSettingOvsDpdk *self = NM_SETTING_OVS_DPDK(setting);
+
+ if (self->n_rxq_desc != 0 && !nm_utils_is_power_of_two(self->n_rxq_desc)) {
+ g_set_error(error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("must be a power of two"));
+ g_prefix_error(error,
+ "%s.%s: ",
+ NM_SETTING_OVS_DPDK_SETTING_NAME,
+ NM_SETTING_OVS_DPDK_N_RXQ_DESC);
+ return FALSE;
+ }
+
+ if (self->n_txq_desc != 0 && !nm_utils_is_power_of_two(self->n_txq_desc)) {
+ g_set_error(error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("must be a power of two"));
+ g_prefix_error(error,
+ "%s.%s: ",
+ NM_SETTING_OVS_DPDK_SETTING_NAME,
+ NM_SETTING_OVS_DPDK_N_TXQ_DESC);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
/*****************************************************************************/
static void
@@ -107,6 +175,8 @@ nm_setting_ovs_dpdk_class_init(NMSettingOvsDpdkClass *klass)
object_class->get_property = _nm_setting_property_get_property_direct;
object_class->set_property = _nm_setting_property_set_property_direct;
+ setting_class->verify = verify;
+
/**
* NMSettingOvsDpdk:devargs:
*
@@ -142,6 +212,50 @@ nm_setting_ovs_dpdk_class_init(NMSettingOvsDpdkClass *klass)
NMSettingOvsDpdk,
n_rxq);
+ /**
+ * NMSettingOvsDpdk:n-rxq-desc:
+ *
+ * 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.
+ *
+ * Since: 1.42
+ **/
+ _nm_setting_property_define_direct_uint32(properties_override,
+ obj_properties,
+ NM_SETTING_OVS_DPDK_N_RXQ_DESC,
+ PROP_N_RXQ_DESC,
+ 0,
+ 4096,
+ 0,
+ NM_SETTING_PARAM_INFERRABLE,
+ NMSettingOvsDpdk,
+ n_rxq_desc);
+
+ /**
+ * NMSettingOvsDpdk:n-txq-desc:
+ *
+ * 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.
+ *
+ * Since: 1.42
+ **/
+ _nm_setting_property_define_direct_uint32(properties_override,
+ obj_properties,
+ NM_SETTING_OVS_DPDK_N_TXQ_DESC,
+ PROP_N_TXQ_DESC,
+ 0,
+ 4096,
+ 0,
+ NM_SETTING_PARAM_INFERRABLE,
+ NMSettingOvsDpdk,
+ n_txq_desc);
+
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 2e2d11b95b..0578ab2c48 100644
--- a/src/libnm-core-public/nm-setting-ovs-dpdk.h
+++ b/src/libnm-core-public/nm-setting-ovs-dpdk.h
@@ -27,8 +27,10 @@ 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_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"
typedef struct _NMSettingOvsDpdkClass NMSettingOvsDpdkClass;
@@ -41,6 +43,10 @@ NM_AVAILABLE_IN_1_20
const char *nm_setting_ovs_dpdk_get_devargs(NMSettingOvsDpdk *self);
NM_AVAILABLE_IN_1_36
guint32 nm_setting_ovs_dpdk_get_n_rxq(NMSettingOvsDpdk *self);
+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);
G_END_DECLS
diff --git a/src/libnmc-setting/nm-meta-setting-desc.c b/src/libnmc-setting/nm-meta-setting-desc.c
index 6a3e36044b..f3372fb230 100644
--- a/src/libnmc-setting/nm-meta-setting-desc.c
+++ b/src/libnmc-setting/nm-meta-setting-desc.c
@@ -6860,6 +6860,12 @@ static const NMMetaPropertyInfo *const property_infos_OVS_DPDK[] = {
PROPERTY_INFO_WITH_DESC (NM_SETTING_OVS_DPDK_N_RXQ,
.property_type = &_pt_gobject_int,
),
+ PROPERTY_INFO_WITH_DESC (NM_SETTING_OVS_DPDK_N_RXQ_DESC,
+ .property_type = &_pt_gobject_int,
+ ),
+ PROPERTY_INFO_WITH_DESC (NM_SETTING_OVS_DPDK_N_TXQ_DESC,
+ .property_type = &_pt_gobject_int,
+ ),
NULL
};
diff --git a/src/libnmc-setting/settings-docs.h.in b/src/libnmc-setting/settings-docs.h.in
index 9d0a34883a..b7f1dc2458 100644
--- a/src/libnmc-setting/settings-docs.h.in
+++ b/src/libnmc-setting/settings-docs.h.in
@@ -255,6 +255,8 @@
#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_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.")
#define DESCRIBE_DOC_NM_SETTING_OVS_INTERFACE_OFPORT_REQUEST N_("Open vSwitch openflow port number. Defaults to zero which means that port number will not be specified and it will be chosen randomly by ovs. OpenFlow ports are the network interfaces for passing packets between OpenFlow processing and the rest of the network. OpenFlow switches connect logically to each other via their OpenFlow ports.")
#define DESCRIBE_DOC_NM_SETTING_OVS_INTERFACE_TYPE N_("The interface type. Either \"internal\", \"system\", \"patch\", \"dpdk\", or empty.")
#define DESCRIBE_DOC_NM_SETTING_OVS_PATCH_PEER N_("Specifies the name of the interface for the other side of the patch. The patch on the other side must also set this interface as peer.")
diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
index 469360e24b..cec7a58eb8 100644
--- a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
+++ b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
@@ -839,6 +839,10 @@
description="Open vSwitch DPDK device arguments." />
<property name="n-rxq"
description="Open vSwitch DPDK number of rx queues. Defaults to zero which means to leave the parameter in OVS unspecified and effectively configures one queue." />
+ <property name="n-rxq-desc"
+ description="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." />
+ <property name="n-txq-desc"
+ 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." />
</setting>
<setting name="ovs-external-ids" >
</setting>