You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
7.3 KiB
109 lines
7.3 KiB
From aacd9b79ecd97007bad3706234ccc1b2ae84ca11 Mon Sep 17 00:00:00 2001 |
|
From: Michal Sekletar <msekleta@redhat.com> |
|
Date: Wed, 23 Mar 2022 17:34:12 +0100 |
|
Subject: [PATCH] udev/net_id: avoid slot based names only for single function |
|
devices |
|
|
|
If we have two or more devices that share the same slot but they are |
|
also multifunction then it is OK to use the slot information even if it |
|
is the same for all of them. Name conflict will be avoided because we |
|
will append function number and form names like, ens1f1, ens1f2... |
|
|
|
(cherry picked from commit 66425daf2c68793adf24a48a26d58add8662e83f) |
|
|
|
Resolves: #2070097 |
|
--- |
|
man/systemd.net-naming-scheme.xml | 7 ++++++- |
|
src/shared/netif-naming-scheme.h | 31 ++++++++++++++++--------------- |
|
src/udev/udev-builtin-net_id.c | 11 +++++++++-- |
|
3 files changed, 31 insertions(+), 18 deletions(-) |
|
|
|
diff --git a/man/systemd.net-naming-scheme.xml b/man/systemd.net-naming-scheme.xml |
|
index 942ef572ff..73d08b681d 100644 |
|
--- a/man/systemd.net-naming-scheme.xml |
|
+++ b/man/systemd.net-naming-scheme.xml |
|
@@ -406,7 +406,12 @@ |
|
<varlistentry> |
|
<term><constant>rhel-9.0</constant></term> |
|
|
|
- <listitem><para>Same as naming scheme <constant>v250</constant>.</para> |
|
+ <listitem><para>Since version <constant>v247</constant> we no longer set |
|
+ <varname>ID_NET_NAME_SLOT</varname> if we detect that a PCI device associated with a slot is a PCI |
|
+ bridge as that would create naming conflict when there are more child devices on that bridge. Now, |
|
+ this is relaxed and we will use slot information to generate the name based on it but only if |
|
+ the PCI device has multiple functions. This is safe because distinct function number is a part of |
|
+ the device name for multifunction devices.</para> |
|
</listitem> |
|
</varlistentry> |
|
|
|
diff --git a/src/shared/netif-naming-scheme.h b/src/shared/netif-naming-scheme.h |
|
index f765db6ef2..5c86cb4545 100644 |
|
--- a/src/shared/netif-naming-scheme.h |
|
+++ b/src/shared/netif-naming-scheme.h |
|
@@ -22,20 +22,21 @@ |
|
* OS versions, but not fully stabilize them. */ |
|
typedef enum NamingSchemeFlags { |
|
/* First, the individual features */ |
|
- NAMING_SR_IOV_V = 1 << 0, /* Use "v" suffix for SR-IOV, see 609948c7043a */ |
|
- NAMING_NPAR_ARI = 1 << 1, /* Use NPAR "ARI", see 6bc04997b6ea */ |
|
- NAMING_INFINIBAND = 1 << 2, /* Use "ib" prefix for infiniband, see 938d30aa98df */ |
|
- NAMING_ZERO_ACPI_INDEX = 1 << 3, /* Use zero acpi_index field, see d81186ef4f6a */ |
|
- NAMING_ALLOW_RERENAMES = 1 << 4, /* Allow re-renaming of devices, see #9006 */ |
|
- NAMING_STABLE_VIRTUAL_MACS = 1 << 5, /* Use device name to generate MAC, see 6d3646406560 */ |
|
- NAMING_NETDEVSIM = 1 << 6, /* Generate names for netdevsim devices, see eaa9d507d855 */ |
|
- NAMING_LABEL_NOPREFIX = 1 << 7, /* Don't prepend ID_NET_LABEL_ONBOARD with interface type prefix */ |
|
- NAMING_NSPAWN_LONG_HASH = 1 << 8, /* Shorten nspawn interfaces by including 24bit hash, instead of simple truncation */ |
|
- NAMING_BRIDGE_NO_SLOT = 1 << 9, /* Don't use PCI hotplug slot information if the corresponding device is a PCI bridge */ |
|
- NAMING_SLOT_FUNCTION_ID = 1 << 10, /* Use function_id if present to identify PCI hotplug slots */ |
|
- NAMING_16BIT_INDEX = 1 << 11, /* Allow full 16-bit for the onboard index */ |
|
- NAMING_REPLACE_STRICTLY = 1 << 12, /* Use udev_replace_ifname() for NAME= rule */ |
|
- NAMING_XEN_VIF = 1 << 13, /* GEnerate names for Xen netfront devices */ |
|
+ NAMING_SR_IOV_V = 1 << 0, /* Use "v" suffix for SR-IOV, see 609948c7043a */ |
|
+ NAMING_NPAR_ARI = 1 << 1, /* Use NPAR "ARI", see 6bc04997b6ea */ |
|
+ NAMING_INFINIBAND = 1 << 2, /* Use "ib" prefix for infiniband, see 938d30aa98df */ |
|
+ NAMING_ZERO_ACPI_INDEX = 1 << 3, /* Use zero acpi_index field, see d81186ef4f6a */ |
|
+ NAMING_ALLOW_RERENAMES = 1 << 4, /* Allow re-renaming of devices, see #9006 */ |
|
+ NAMING_STABLE_VIRTUAL_MACS = 1 << 5, /* Use device name to generate MAC, see 6d3646406560 */ |
|
+ NAMING_NETDEVSIM = 1 << 6, /* Generate names for netdevsim devices, see eaa9d507d855 */ |
|
+ NAMING_LABEL_NOPREFIX = 1 << 7, /* Don't prepend ID_NET_LABEL_ONBOARD with interface type prefix */ |
|
+ NAMING_NSPAWN_LONG_HASH = 1 << 8, /* Shorten nspawn interfaces by including 24bit hash, instead of simple truncation */ |
|
+ NAMING_BRIDGE_NO_SLOT = 1 << 9, /* Don't use PCI hotplug slot information if the corresponding device is a PCI bridge */ |
|
+ NAMING_SLOT_FUNCTION_ID = 1 << 10, /* Use function_id if present to identify PCI hotplug slots */ |
|
+ NAMING_16BIT_INDEX = 1 << 11, /* Allow full 16-bit for the onboard index */ |
|
+ NAMING_REPLACE_STRICTLY = 1 << 12, /* Use udev_replace_ifname() for NAME= rule */ |
|
+ NAMING_XEN_VIF = 1 << 13, /* Generate names for Xen netfront devices */ |
|
+ NAMING_BRIDGE_MULTIFUNCTION_SLOT = 1 << 14, /* Use PCI hotplug slot information associated with bridge, but only if PCI device is multifunction */ |
|
|
|
/* And now the masks that combine the features above */ |
|
NAMING_V238 = 0, |
|
@@ -47,7 +48,7 @@ typedef enum NamingSchemeFlags { |
|
NAMING_V247 = NAMING_V245 | NAMING_BRIDGE_NO_SLOT, |
|
NAMING_V249 = NAMING_V247 | NAMING_SLOT_FUNCTION_ID | NAMING_16BIT_INDEX | NAMING_REPLACE_STRICTLY, |
|
NAMING_V250 = NAMING_V249 | NAMING_XEN_VIF, |
|
- NAMING_RHEL_9_0 = NAMING_V250, |
|
+ NAMING_RHEL_9_0 = NAMING_V250 | NAMING_BRIDGE_MULTIFUNCTION_SLOT, |
|
|
|
EXTRA_NET_NAMING_SCHEMES |
|
|
|
diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c |
|
index 65e003eb15..673ed7a7ca 100644 |
|
--- a/src/udev/udev-builtin-net_id.c |
|
+++ b/src/udev/udev-builtin-net_id.c |
|
@@ -451,8 +451,15 @@ static int dev_pci_slot(sd_device *dev, const LinkInfo *info, NetNames *names) { |
|
* devices that will try to claim the same index and that would create name |
|
* collision. */ |
|
if (naming_scheme_has(NAMING_BRIDGE_NO_SLOT) && is_pci_bridge(hotplug_slot_dev)) { |
|
- log_device_debug(dev, "Not using slot information because the PCI device is a bridge."); |
|
- return 0; |
|
+ if (naming_scheme_has(NAMING_BRIDGE_MULTIFUNCTION_SLOT) && !is_pci_multifunction(names->pcidev)) { |
|
+ log_device_debug(dev, "Not using slot information because the PCI device associated with the hotplug slot is a bridge and the PCI device has single function."); |
|
+ return 0; |
|
+ } |
|
+ |
|
+ if (!naming_scheme_has(NAMING_BRIDGE_MULTIFUNCTION_SLOT)) { |
|
+ log_device_debug(dev, "Not using slot information because the PCI device is a bridge."); |
|
+ return 0; |
|
+ } |
|
} |
|
|
|
break;
|
|
|