From: Stefan Hanreich <s.hanreich@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH pve-manager 1/2] configs: add udev helper for pinning virtual function names
Date: Tue, 22 Jul 2025 16:52:22 +0200 [thread overview]
Message-ID: <20250722145223.351778-2-s.hanreich@proxmox.com> (raw)
In-Reply-To: <20250722145223.351778-1-s.hanreich@proxmox.com>
This commmit adds a udev rule that triggers for every network device
that gets added. It checks if the network device is a VF and if the
parent device is pinned. If it is pinned, then generate a new name for
the VF which consists of the pinned name of the parent device, as well
as the index of the VF.
It relies on the network device driver exposing the information via
sysfs, which was the case in my tests for mlx5_core, igb and bnxt_en.
Specifically it checks if a device is a virtual function by checking
for the existence of:
/sys/class/net/<iface>/device/physfn
It then follows that symlink and infers the vf index by looking at the
virtfnX symlinks in the folder above.
Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com>
---
configs/Makefile | 4 ++-
configs/virtual-function-pinning-helper | 37 +++++++++++++++++++++++++
configs/virtual-function-pinning.rules | 1 +
3 files changed, 41 insertions(+), 1 deletion(-)
create mode 100644 configs/virtual-function-pinning-helper
create mode 100644 configs/virtual-function-pinning.rules
diff --git a/configs/Makefile b/configs/Makefile
index 57d61a0bd..6b89e8b3a 100644
--- a/configs/Makefile
+++ b/configs/Makefile
@@ -6,7 +6,7 @@ country.dat: country.pl
./country.pl > country.dat
.PHONY: install
-install: country.dat vzdump.conf pve-sources.sources pve-initramfs.conf pve-blacklist.conf pve.logrotate
+install: country.dat vzdump.conf pve-sources.sources pve-initramfs.conf pve-blacklist.conf pve.logrotate virtual-function-pinning.rules virtual-function-pinning-helper
install -D -m 0644 pve.logrotate $(DESTDIR)/etc/logrotate.d/pve
install -D -m 0644 pve-sources.sources $(DESTDIR)/etc/apt/sources.list.d/pve-enterprise.sources
install -D -m 0644 pve-blacklist.conf $(DESTDIR)/etc/modprobe.d/pve-blacklist.conf
@@ -14,6 +14,8 @@ install: country.dat vzdump.conf pve-sources.sources pve-initramfs.conf pve-blac
install -D -m 0644 pve-initramfs.conf $(DESTDIR)/etc/initramfs-tools/conf.d/pve-initramfs.conf
install -D -m 0644 country.dat $(DESTDIR)/usr/share/$(PACKAGE)/country.dat
install -D -m 0644 proxmox-ve-default.link $(DESTDIR)/usr/lib/systemd/network/99-default.link.d/proxmox-mac-address-policy.conf
+ install -D -m 0644 virtual-function-pinning.rules $(DESTDIR)/usr/lib/udev/rules.d/70-virtual-function-pinning.rules
+ install -D -m 0755 virtual-function-pinning-helper $(DESTDIR)/usr/lib/udev/virtual-function-naming-helper
clean:
rm -f country.dat
diff --git a/configs/virtual-function-pinning-helper b/configs/virtual-function-pinning-helper
new file mode 100644
index 000000000..9a8a95b54
--- /dev/null
+++ b/configs/virtual-function-pinning-helper
@@ -0,0 +1,37 @@
+#!/bin/sh
+set -eu
+
+DEVICE_SYSFS_PCI_PATH=$(realpath "/sys${DEVPATH}/../..");
+
+if [ ! -L "$DEVICE_SYSFS_PCI_PATH/physfn" ]; then
+ exit;
+fi
+
+PHYSFN_SYSFS_PCI_PATH=$(realpath "${DEVICE_SYSFS_PCI_PATH}/physfn");
+PHYSFN_IFACE_NAME=$(ls "${PHYSFN_SYSFS_PCI_PATH}/net")
+
+# interface is not pinned
+if [ ! -f "/usr/local/lib/systemd/network/50-pve-${PHYSFN_IFACE_NAME}.link" ]; then
+ exit;
+fi
+
+# pin is not applied - or interface doesn't exist
+if ! ip link show "$PHYSFN_IFACE_NAME" > /dev/null 2>&1 ; then
+ exit;
+fi
+
+DEVICE_PCI_ID=$(basename "$DEVICE_SYSFS_PCI_PATH");
+
+for file in $(find "${PHYSFN_SYSFS_PCI_PATH=$}/" -maxdepth 1 -type l -name 'virtfn*' ); do
+ VF_PCI_ID=$(basename "$(realpath "$file")");
+
+ if [ "$DEVICE_PCI_ID" = "$VF_PCI_ID" ]; then
+ VF_INDEX=$(basename "$file" | grep -Eo '[[:digit:]]+$' -);
+ echo "${PHYSFN_IFACE_NAME}v${VF_INDEX}";
+ exit;
+ fi
+done
+
+echo "interface seems to be a VF of ${PHYSFN_IFACE_NAME}, but could not find the VF index" 1>&2;
+exit;
+
diff --git a/configs/virtual-function-pinning.rules b/configs/virtual-function-pinning.rules
new file mode 100644
index 000000000..dc2224886
--- /dev/null
+++ b/configs/virtual-function-pinning.rules
@@ -0,0 +1 @@
+SUBSYSTEM=="net",ACTION=="add",PROGRAM=="/usr/lib/udev/virtual-function-naming-helper",NAME="%c"
--
2.39.5
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
next prev parent reply other threads:[~2025-07-22 14:51 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-22 14:52 [pve-devel] [PATCH manager 0/2] add virtual function support to network-interface-pinning Stefan Hanreich
2025-07-22 14:52 ` Stefan Hanreich [this message]
2025-07-22 14:52 ` [pve-devel] [PATCH pve-manager 2/2] network-interface-pinning: do not generate link files for vfs Stefan Hanreich
2025-07-23 17:31 ` [pve-devel] applied: [PATCH manager 0/2] add virtual function support to network-interface-pinning Thomas Lamprecht
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250722145223.351778-2-s.hanreich@proxmox.com \
--to=s.hanreich@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.