On 9/8/20 10:50 PM, Parav Pandit wrote: > $ devlink port show pci/0000:06:00.0/2 > pci/0000:06:00.0/2: type eth netdev ens2f0c1pf0vf1 flavour pcivf controller 1 > pfnum 0 vfnum 1 external true splittable false > function: > hw_addr 00:00:00:00:00:00 > > $ devlink port show pci/0000:06:00.0/2 -jp > { > "port": { > "pci/0000:06:00.0/2": { > "type": "eth", > "netdev": "ens2f0c1pf0vf1",
That strlen is 14 chars. Any 2 ids go to a second digit and you overrrun the IFNAMSZ which means ... > diff --git a/net/core/devlink.c b/net/core/devlink.c > index 9cf5b118253b..91c12612f2b7 100644 > --- a/net/core/devlink.c > +++ b/net/core/devlink.c > @@ -7793,9 +7793,23 @@ static int __devlink_port_phys_port_name_get(struct > devlink_port *devlink_port, > WARN_ON(1); > return -EINVAL; > case DEVLINK_PORT_FLAVOUR_PCI_PF: > + if (attrs->pci_pf.external) { > + n = snprintf(name, len, "c%u", > attrs->pci_pf.controller); > + if (n >= len) > + return -EINVAL; ... this function returns EINVAL which is going to be confusing to users. > + len -= n; > + name += n; > + } > n = snprintf(name, len, "pf%u", attrs->pci_pf.pf); > break; > case DEVLINK_PORT_FLAVOUR_PCI_VF: > + if (attrs->pci_vf.external) { > + n = snprintf(name, len, "c%u", > attrs->pci_vf.controller); > + if (n >= len) > + return -EINVAL; > + len -= n; > + name += n; > + } > n = snprintf(name, len, "pf%uvf%u", > attrs->pci_vf.pf, attrs->pci_vf.vf); > break; >