configs: add udev helper for pinning virtual function names

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>
Link: https://lore.proxmox.com/20250722145223.351778-2-s.hanreich@proxmox.com
This commit is contained in:
Stefan Hanreich 2025-07-22 16:52:22 +02:00 committed by Thomas Lamprecht
parent 5034a93f6d
commit 017359f376
3 changed files with 41 additions and 1 deletions

View file

@ -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

View file

@ -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;

View file

@ -0,0 +1 @@
SUBSYSTEM=="net",ACTION=="add",PROGRAM=="/usr/lib/udev/virtual-function-naming-helper",NAME="%c"