diff mbox series

[net-next,V6,02/14] devlink: Introduce PCI SF port flavour and port attribute

Message ID 20210113192730.280656-3-saeed@kernel.org (mailing list archive)
State Superseded
Headers show
Series [net-next,V6,01/14] devlink: Prepare code to fill multiple port function attributes | expand

Commit Message

Saeed Mahameed Jan. 13, 2021, 7:27 p.m. UTC
From: Parav Pandit <parav@nvidia.com>

A PCI sub-function (SF) represents a portion of the device similar
to PCI VF.

In an eswitch, PCI SF may have port which is normally represented
using a representor netdevice.
To have better visibility of eswitch port, its association with SF,
and its representor netdevice, introduce a PCI SF port flavour.

When devlink port flavour is PCI SF, fill up PCI SF attributes of the
port.

Extend port name creation using PCI PF and SF number scheme on best
effort basis, so that vendor drivers can skip defining their own
scheme.
This is done as cApfNSfM, where A, N and M are controller, PCI PF and
PCI SF number respectively.
This is similar to existing naming for PCI PF and PCI VF ports.

An example view of a PCI SF port:

$ devlink port show pci/0000:06:00.0/32768
pci/0000:06:00.0/32768: type eth netdev ens2f0npf0sf88 flavour pcisf controller 0 pfnum 0 sfnum 88 external false splittable false
  function:
    hw_addr 00:00:00:00:88:88 state active opstate attached

$ devlink port show pci/0000:06:00.0/32768 -jp
{
    "port": {
        "pci/0000:06:00.0/32768": {
            "type": "eth",
            "netdev": "ens2f0npf0sf88",
            "flavour": "pcisf",
            "controller": 0,
            "pfnum": 0,
            "sfnum": 88,
            "splittable": false,
            "function": {
                "hw_addr": "00:00:00:00:88:88",
                "state": "active",
                "opstate": "attached"
            }
        }
    }
}

changelog:
v5->v6:
 - aligned code to 80 characters wherever readability is not affected
 - packed the sf attribute structure
 - removed external flag for sf for initial patchset

Signed-off-by: Parav Pandit <parav@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Reviewed-by: Vu Pham <vuhuong@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
---
 include/net/devlink.h        | 15 ++++++++++++++
 include/uapi/linux/devlink.h |  5 +++++
 net/core/devlink.c           | 39 ++++++++++++++++++++++++++++++++++++
 3 files changed, 59 insertions(+)

Comments

Jakub Kicinski Jan. 14, 2021, 5:42 p.m. UTC | #1
On Wed, 13 Jan 2021 11:27:18 -0800 Saeed Mahameed wrote:
>  /**
>   * struct devlink_port_attrs - devlink port object
>   * @flavour: flavour of the port
> @@ -114,6 +126,7 @@ struct devlink_port_attrs {
>  		struct devlink_port_phys_attrs phys;
>  		struct devlink_port_pci_pf_attrs pci_pf;
>  		struct devlink_port_pci_vf_attrs pci_vf;
> +		struct devlink_port_pci_sf_attrs pci_sf;
>  	};
>  };

include/net/devlink.h:131: warning: Function parameter or member 'pci_sf' not described in 'devlink_port_attrs'
Parav Pandit Jan. 14, 2021, 5:53 p.m. UTC | #2
> From: Jakub Kicinski <kuba@kernel.org>
> Sent: Thursday, January 14, 2021 11:13 PM
> 
> On Wed, 13 Jan 2021 11:27:18 -0800 Saeed Mahameed wrote:
> >  /**
> >   * struct devlink_port_attrs - devlink port object
> >   * @flavour: flavour of the port
> > @@ -114,6 +126,7 @@ struct devlink_port_attrs {
> >  		struct devlink_port_phys_attrs phys;
> >  		struct devlink_port_pci_pf_attrs pci_pf;
> >  		struct devlink_port_pci_vf_attrs pci_vf;
> > +		struct devlink_port_pci_sf_attrs pci_sf;
> >  	};
> >  };
> 
> include/net/devlink.h:131: warning: Function parameter or member 'pci_sf'
> not described in 'devlink_port_attrs'
Wasn't reported till v5.
Can you please share, which script catches this? So that I can run next time early.
Jakub Kicinski Jan. 14, 2021, 6:22 p.m. UTC | #3
On Thu, 14 Jan 2021 17:53:09 +0000 Parav Pandit wrote:
> > From: Jakub Kicinski <kuba@kernel.org>
> > Sent: Thursday, January 14, 2021 11:13 PM
> > 
> > On Wed, 13 Jan 2021 11:27:18 -0800 Saeed Mahameed wrote:  
> > >  /**
> > >   * struct devlink_port_attrs - devlink port object
> > >   * @flavour: flavour of the port
> > > @@ -114,6 +126,7 @@ struct devlink_port_attrs {
> > >  		struct devlink_port_phys_attrs phys;
> > >  		struct devlink_port_pci_pf_attrs pci_pf;
> > >  		struct devlink_port_pci_vf_attrs pci_vf;
> > > +		struct devlink_port_pci_sf_attrs pci_sf;
> > >  	};
> > >  };  
> > 
> > include/net/devlink.h:131: warning: Function parameter or member 'pci_sf'
> > not described in 'devlink_port_attrs'  
> Wasn't reported till v5.
> Can you please share, which script catches this? So that I can run next time early.

This is just scripts/kernel-doc from the tree.

All the tests are here:

https://github.com/kuba-moo/nipa/blob/master/tests/
Parav Pandit Jan. 14, 2021, 6:33 p.m. UTC | #4
> From: Jakub Kicinski <kuba@kernel.org>
> Sent: Thursday, January 14, 2021 11:52 PM
> 
> On Thu, 14 Jan 2021 17:53:09 +0000 Parav Pandit wrote:
> > > From: Jakub Kicinski <kuba@kernel.org>
> > > Sent: Thursday, January 14, 2021 11:13 PM
> > >
> > > On Wed, 13 Jan 2021 11:27:18 -0800 Saeed Mahameed wrote:
> > > >  /**
> > > >   * struct devlink_port_attrs - devlink port object
> > > >   * @flavour: flavour of the port
> > > > @@ -114,6 +126,7 @@ struct devlink_port_attrs {
> > > >  		struct devlink_port_phys_attrs phys;
> > > >  		struct devlink_port_pci_pf_attrs pci_pf;
> > > >  		struct devlink_port_pci_vf_attrs pci_vf;
> > > > +		struct devlink_port_pci_sf_attrs pci_sf;
> > > >  	};
> > > >  };
> > >
> > > include/net/devlink.h:131: warning: Function parameter or member
> 'pci_sf'
> > > not described in 'devlink_port_attrs'
> > Wasn't reported till v5.
> > Can you please share, which script catches this? So that I can run next time
> early.
> 
> This is just scripts/kernel-doc from the tree.
> 
Ok. Got it. This is helpful.
Will wait to gather other comments.
Otherwise better to do bulk conversion for all the below one in include/net/devlink.h apart from this SF one.

./scripts/kernel-doc -none include/net/devlink.h

include/net/devlink.h:217: warning: Function parameter or member 'field_id' not described in 'devlink_dpipe_match'
include/net/devlink.h:232: warning: Function parameter or member 'field_id' not described in 'devlink_dpipe_action'
include/net/devlink.h:275: warning: Function parameter or member 'match_values_count' not described in 'devlink_dpipe_entry'
include/net/devlink.h:320: warning: Function parameter or member 'list' not described in 'devlink_dpipe_table'
include/net/devlink.h:339: warning: Function parameter or member 'actions_dump' not described in 'devlink_dpipe_table_ops'
include/net/devlink.h:339: warning: Function parameter or member 'matches_dump' not described in 'devlink_dpipe_table_ops'
include/net/devlink.h:339: warning: Function parameter or member 'entries_dump' not described in 'devlink_dpipe_table_ops'
include/net/devlink.h:339: warning: Function parameter or member 'counters_set_update' not described in 'devlink_dpipe_table_ops'
include/net/devlink.h:339: warning: Function parameter or member 'size_get' not described in 'devlink_dpipe_table_ops'
include/net/devlink.h:349: warning: Function parameter or member 'headers' not described in 'devlink_dpipe_headers'
include/net/devlink.h:349: warning: Function parameter or member 'headers_count' not described in 'devlink_dpipe_headers'
include/net/devlink.h:363: warning: Function parameter or member 'unit' not described in 'devlink_resource_size_params'
include/net/devlink.h:404: warning: Function parameter or member 'occ_get' not described in 'devlink_resource'
include/net/devlink.h:404: warning: Function parameter or member 'occ_get_priv' not described in 'devlink_resource'
include/net/devlink.h:477: warning: Function parameter or member 'id' not described in 'devlink_param'
include/net/devlink.h:606: warning: Function parameter or member 'overwrite_mask' not described in 'devlink_flash_update_params'


> All the tests are here:
> 
> https://github.com/kuba-moo/nipa/blob/master/tests/
diff mbox series

Patch

diff --git a/include/net/devlink.h b/include/net/devlink.h
index f466819cc477..b6ebb516f1b0 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -93,6 +93,18 @@  struct devlink_port_pci_vf_attrs {
 	u8 external:1;
 };
 
+/**
+ * struct devlink_port_pci_sf_attrs - devlink port's PCI SF attributes
+ * @controller: Associated controller number
+ * @sf: Associated PCI SF for of the PCI PF for this port.
+ * @pf: Associated PCI PF number for this port.
+ */
+struct devlink_port_pci_sf_attrs {
+	u32 controller;
+	u32 sf;
+	u16 pf;
+};
+
 /**
  * struct devlink_port_attrs - devlink port object
  * @flavour: flavour of the port
@@ -114,6 +126,7 @@  struct devlink_port_attrs {
 		struct devlink_port_phys_attrs phys;
 		struct devlink_port_pci_pf_attrs pci_pf;
 		struct devlink_port_pci_vf_attrs pci_vf;
+		struct devlink_port_pci_sf_attrs pci_sf;
 	};
 };
 
@@ -1404,6 +1417,8 @@  void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, u32 contro
 				   u16 pf, bool external);
 void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 controller,
 				   u16 pf, u16 vf, bool external);
+void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port,
+				   u32 controller, u16 pf, u32 sf);
 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
 			u32 size, u16 ingress_pools_count,
 			u16 egress_pools_count, u16 ingress_tc_count,
diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
index cf89c318f2ac..1a241b09a7f8 100644
--- a/include/uapi/linux/devlink.h
+++ b/include/uapi/linux/devlink.h
@@ -200,6 +200,10 @@  enum devlink_port_flavour {
 	DEVLINK_PORT_FLAVOUR_UNUSED, /* Port which exists in the switch, but
 				      * is not used in any way.
 				      */
+	DEVLINK_PORT_FLAVOUR_PCI_SF, /* Represents eswitch port
+				      * for the PCI SF. It is an internal
+				      * port that faces the PCI SF.
+				      */
 };
 
 enum devlink_param_cmode {
@@ -529,6 +533,7 @@  enum devlink_attr {
 	DEVLINK_ATTR_RELOAD_ACTION_INFO,        /* nested */
 	DEVLINK_ATTR_RELOAD_ACTION_STATS,       /* nested */
 
+	DEVLINK_ATTR_PORT_PCI_SF_NUMBER,	/* u32 */
 	/* add new attributes above here, update the policy in devlink.c */
 
 	__DEVLINK_ATTR_MAX,
diff --git a/net/core/devlink.c b/net/core/devlink.c
index c39496311b71..4cbc02fb602d 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -690,6 +690,15 @@  static int devlink_nl_port_attrs_put(struct sk_buff *msg,
 		if (nla_put_u8(msg, DEVLINK_ATTR_PORT_EXTERNAL, attrs->pci_vf.external))
 			return -EMSGSIZE;
 		break;
+	case DEVLINK_PORT_FLAVOUR_PCI_SF:
+		if (nla_put_u32(msg, DEVLINK_ATTR_PORT_CONTROLLER_NUMBER,
+				attrs->pci_sf.controller) ||
+		    nla_put_u16(msg, DEVLINK_ATTR_PORT_PCI_PF_NUMBER,
+				attrs->pci_sf.pf) ||
+		    nla_put_u32(msg, DEVLINK_ATTR_PORT_PCI_SF_NUMBER,
+				attrs->pci_sf.sf))
+			return -EMSGSIZE;
+		break;
 	case DEVLINK_PORT_FLAVOUR_PHYSICAL:
 	case DEVLINK_PORT_FLAVOUR_CPU:
 	case DEVLINK_PORT_FLAVOUR_DSA:
@@ -8374,6 +8383,32 @@  void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 contro
 }
 EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_vf_set);
 
+/**
+ *	devlink_port_attrs_pci_sf_set - Set PCI SF port attributes
+ *
+ *	@devlink_port: devlink port
+ *	@controller: associated controller number for the devlink port instance
+ *	@pf: associated PF for the devlink port instance
+ *	@sf: associated SF of a PF for the devlink port instance
+ */
+void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port, u32 controller,
+				   u16 pf, u32 sf)
+{
+	struct devlink_port_attrs *attrs = &devlink_port->attrs;
+	int ret;
+
+	if (WARN_ON(devlink_port->registered))
+		return;
+	ret = __devlink_port_attrs_set(devlink_port,
+				       DEVLINK_PORT_FLAVOUR_PCI_SF);
+	if (ret)
+		return;
+	attrs->pci_sf.controller = controller;
+	attrs->pci_sf.pf = pf;
+	attrs->pci_sf.sf = sf;
+}
+EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_sf_set);
+
 static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
 					     char *name, size_t len)
 {
@@ -8422,6 +8457,10 @@  static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
 		n = snprintf(name, len, "pf%uvf%u",
 			     attrs->pci_vf.pf, attrs->pci_vf.vf);
 		break;
+	case DEVLINK_PORT_FLAVOUR_PCI_SF:
+		n = snprintf(name, len, "pf%usf%u", attrs->pci_sf.pf,
+			     attrs->pci_sf.sf);
+		break;
 	}
 
 	if (n >= len)