diff mbox series

[net-next,v3,6/6] devlink: Use controller while building phys_port_name

Message ID 20200909045038.63181-7-parav@mellanox.com
State Accepted
Delegated to: David Miller
Headers show
Series devlink show controller number | expand

Commit Message

Parav Pandit Sept. 9, 2020, 4:50 a.m. UTC
From: Parav Pandit <parav@nvidia.com>

Now that controller number attribute is available, use it when
building phsy_port_name for external controller ports.

An example devlink port and representor netdev name consist of controller
annotation for external controller with controller number = 1,
for a VF 1 of PF 0:

$ 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",
            "flavour": "pcivf",
            "controller": 1,
            "pfnum": 0,
            "vfnum": 1,
            "external": true,
            "splittable": false,
            "function": {
                "hw_addr": "00:00:00:00:00:00"
            }
        }
    }
}

Controller number annotation is skipped for non external controllers to
maintain backward compatibility.

Signed-off-by: Parav Pandit <parav@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
---
Changelog:
v1->v2:
 - New patch
---
 net/core/devlink.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

Comments

David Ahern Sept. 10, 2020, 3:02 p.m. UTC | #1
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;
>
diff mbox series

Patch

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