0daf48d9aa
Resolves: #2047682,#2068043,#2068131,#2073003,#2073994,#2082131,#2083493,#2087652,#2100340
110 lines
7.3 KiB
Diff
110 lines
7.3 KiB
Diff
From 07a2159c8dc575745c967499b068209e8926ea79 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: #2073003
|
|
---
|
|
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;
|