[PATCH] util: Add phys_port_name support on virPCIGetNetName

Laine Stump laine at redhat.com
Tue Sep 22 12:31:15 UTC 2020


On 8/28/20 6:53 AM, Dmytro Linkin wrote:
> Current virPCIGetNetName() logic is to get net device name by checking
> it's phys_port_id, if caller provide it, or by it's index (eg, by it's
> position at sysfs net directory). This approach worked fine up until
> linux kernel version 5.8, where NVIDIA Mellanox driver implemented
> linking of VFs' representors to PCI device in switchdev mode. This mean
> that device's sysfs net directory will hold multiple net devices. Ex.:
>
> $ ls '/sys/bus/pci/devices/0000:82:00.0/net'
> ens1f0  eth0  eth1
>
> Most switch devices support phys_port_name instead of phys_port_id, so
> virPCIGetNetName() will try to get PF name by it's index - 0. The
> problem here is that the PF nedev entry may not be the first.
>
> To fix that, for switch devices, we introduce a new logic to select the
> PF uplink netdev according to the content of phys_port_name. Extend
> virPCIGetNetName() with physPortNameRegex variable to get proper device
> by it's phys_port_name scheme, for ex., "p[0-9]+$" to get PF,
> "pf[0-9]+vf[0-9]+$" to get VF or "p1$" to get exact net device. So now
> virPCIGetNetName() logic work in following sequence:
>   - filter by phys_port_id, if it's provided,
>   or
>   - filter by phys_port_name, if it's regex provided,
>   or
>   - get net device by it's index (position) in sysfs net directory.
> Also, make getting content of iface sysfs files more generic.
>
> Signed-off-by: Dmytro Linkin <dlinkin at nvidia.com>
> Reviewed-by: Adrian Chiris <adrianc at nvidia.com>


[...]


>
>   
> +/* Represents format of PF's phys_port_name in switchdev mode:
> + * 'p%u' or 'p%us%u'. New line checked since value is readed from sysfs file.
> + */
> +# define VIR_PF_PHYS_PORT_NAME_REGEX ((char *)"(p[0-9]+$)|(p[0-9]+s[0-9]+$)")
> +


I've come back to look at this patch several times since it was posted 
(sorry for the extreme delay in responding), but just can't figure out 
what it's doing with this regex and why the regex is necessary. Not 
having access to the hardware that it works with is a bit of a problem, 
but perhaps I could get a better idea if you gave a full example of 
sysfs contents? My concern with using a regex is that it might work just 
fine when using one method for net device naming, but break if that was 
changed. Also, it seems counterintuitive that it would be necessary to 
look for a device with a name matching a specific pattern; why isn't 
there simply a single symbolic link somewhere in the sysfs tree for the 
net device that just directly points at its physical port? That would be 
so much simpler and more reliable (or at least it would give the 
*perception* of being more reliable).




More information about the libvir-list mailing list