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:
parent
5034a93f6d
commit
017359f376
3 changed files with 41 additions and 1 deletions
|
|
@ -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
|
||||
|
|
|
|||
37
configs/virtual-function-pinning-helper
Normal file
37
configs/virtual-function-pinning-helper
Normal 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;
|
||||
|
||||
1
configs/virtual-function-pinning.rules
Normal file
1
configs/virtual-function-pinning.rules
Normal file
|
|
@ -0,0 +1 @@
|
|||
SUBSYSTEM=="net",ACTION=="add",PROGRAM=="/usr/lib/udev/virtual-function-naming-helper",NAME="%c"
|
||||
Loading…
Add table
Add a link
Reference in a new issue