Thread (22 messages) flat view 22 messages, 3 authors, 2021-06-09

RE: [PATCH RESEND iproute2-next] devlink: Add optional controller user input

From: Parav Pandit <hidden>
Date: 2021-06-06 07:10:56

Hi Yunsheng,
From: Yunsheng Lin <redacted>
Sent: Friday, June 4, 2021 7:05 AM

On 2021/6/3 19:19, Parav Pandit wrote:
quoted
A user optionally provides the external controller number when user
wants to create devlink port for the external controller.
Hi, Parav
   I was planing to use controller id to solve the devlink instance representing
problem for multi-function which shares common resource in the same ASIC,
see [1].

It seems the controller id used here is to differentiate the function used in
different host?
That’s correct. Controller holds one or more PCI functions (PF,VF,SF).
In your case if there is single devlink instance representing ASIC, it is better to have health reporters under this single instance.

Devlink parameters do not span multiple devlink instance.
So if you need to control devlink instance parameters of each function byitself, you likely need devlink instance for each.
And still continue to have ASIC wide health reporters under single instance that represents whole ASIC.
 
1. https://lkml.org/lkml/2021/5/31/296
quoted
An example on eswitch system:
$ devlink dev eswitch set pci/0033:01:00.0 mode switchdev

$ devlink port show
pci/0033:01:00.0/196607: type eth netdev enP51p1s0f0np0 flavour
physical port 0 splittable false

$ devlink port add pci/0033:01:00.0 flavour pcisf pfnum 0 sfnum 77
controller 1
pci/0033:01:00.0/163840: type eth netdev eth0 flavour pcisf controller 1
pfnum 0 sfnum 77 external true splittable false
quoted
  function:
    hw_addr 00:00:00:00:00:00 state inactive opstate detached

Signed-off-by: Parav Pandit <redacted>
Reviewed-by: Jiri Pirko <redacted>
---
 devlink/devlink.c       | 17 ++++++++++++++---
 man/man8/devlink-port.8 | 19 +++++++++++++++++++
 2 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/devlink/devlink.c b/devlink/devlink.c index
0b5548fb..170e8616 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -286,6 +286,7 @@ static void ifname_map_free(struct ifname_map
*ifname_map)  #define DL_OPT_PORT_PFNUMBER BIT(43)  #define
DL_OPT_PORT_SFNUMBER BIT(44)  #define
DL_OPT_PORT_FUNCTION_STATE
quoted
BIT(45)
+#define DL_OPT_PORT_CONTROLLER BIT(46)

 struct dl_opts {
 	uint64_t present; /* flags of present items */ @@ -336,6 +337,7 @@
struct dl_opts {
 	uint32_t overwrite_mask;
 	enum devlink_reload_action reload_action;
 	enum devlink_reload_limit reload_limit;
+	uint32_t port_controller;
 	uint32_t port_sfnumber;
 	uint16_t port_flavour;
 	uint16_t port_pfnumber;
@@ -1886,6 +1888,12 @@ static int dl_argv_parse(struct dl *dl, uint64_t
o_required,
quoted
 			if (err)
 				return err;
 			o_found |= DL_OPT_PORT_SFNUMBER;
+		} else if (dl_argv_match(dl, "controller") && (o_all &
DL_OPT_PORT_CONTROLLER)) {
quoted
+			dl_arg_inc(dl);
+			err = dl_argv_uint32_t(dl, &opts->port_controller);
+			if (err)
+				return err;
+			o_found |= DL_OPT_PORT_CONTROLLER;
 		} else {
 			pr_err("Unknown option \"%s\"\n", dl_argv(dl));
 			return -EINVAL;
@@ -2079,6 +2087,9 @@ static void dl_opts_put(struct nlmsghdr *nlh,
struct dl *dl)
quoted
 		mnl_attr_put_u16(nlh,
DEVLINK_ATTR_PORT_PCI_PF_NUMBER, opts->port_pfnumber);
quoted
 	if (opts->present & DL_OPT_PORT_SFNUMBER)
 		mnl_attr_put_u32(nlh,
DEVLINK_ATTR_PORT_PCI_SF_NUMBER,
quoted
opts->port_sfnumber);
+	if (opts->present & DL_OPT_PORT_CONTROLLER)
+		mnl_attr_put_u32(nlh,
DEVLINK_ATTR_PORT_CONTROLLER_NUMBER,
quoted
+				 opts->port_controller);
 }

 static int dl_argv_parse_put(struct nlmsghdr *nlh, struct dl *dl, @@
-3795,7 +3806,7 @@ static void cmd_port_help(void)
 	pr_err("       devlink port param set DEV/PORT_INDEX name
PARAMETER value VALUE cmode { permanent | driverinit | runtime }\n");
quoted
 	pr_err("       devlink port param show [DEV/PORT_INDEX name
PARAMETER]\n");
quoted
 	pr_err("       devlink port health show [ DEV/PORT_INDEX reporter
REPORTER_NAME ]\n");
quoted
-	pr_err("       devlink port add DEV/PORT_INDEX flavour FLAVOUR
pfnum PFNUM [ sfnum SFNUM ]\n");
quoted
+	pr_err("       devlink port add DEV/PORT_INDEX flavour FLAVOUR
pfnum PFNUM [ sfnum SFNUM ] [ controller CNUM ]\n");
quoted
 	pr_err("       devlink port del DEV/PORT_INDEX\n");
 }
@@ -4324,7 +4335,7 @@ static int __cmd_health_show(struct dl *dl, bool
show_device, bool show_port);

 static void cmd_port_add_help(void)
 {
-	pr_err("       devlink port add { DEV | DEV/PORT_INDEX } flavour
FLAVOUR pfnum PFNUM [ sfnum SFNUM ]\n");
quoted
+	pr_err("       devlink port add { DEV | DEV/PORT_INDEX } flavour
FLAVOUR pfnum PFNUM [ sfnum SFNUM ] [ controller CNUM ]\n");
quoted
 }

 static int cmd_port_add(struct dl *dl) @@ -4342,7 +4353,7 @@ static
int cmd_port_add(struct dl *dl)

 	err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE |
DL_OPT_HANDLEP |
quoted
 				DL_OPT_PORT_FLAVOUR |
DL_OPT_PORT_PFNUMBER,
quoted
-				DL_OPT_PORT_SFNUMBER);
+				DL_OPT_PORT_SFNUMBER |
DL_OPT_PORT_CONTROLLER);
quoted
 	if (err)
 		return err;
diff --git a/man/man8/devlink-port.8 b/man/man8/devlink-port.8 index
563c5833..a5142c4e 100644
--- a/man/man8/devlink-port.8
+++ b/man/man8/devlink-port.8
@@ -54,6 +54,8 @@ devlink-port \- devlink port configuration  .IR
PFNUMBER " ]"
 .RB "{ " pcisf
 .IR SFNUMBER " }"
+.RB "{ " controller
+.IR CNUM " }"
 .br

 .ti -8
@@ -174,6 +176,12 @@ Specifies sfnumber to assign to the device of the
SF.
quoted
 This field is optional for those devices which supports auto
assignment of the  SF number.

+.TP
+.BR controller " { " controller " } "
+Specifies controller number for which the SF port is created.
+This field is optional. It is used only when SF port is created for
+the external controller.
+
 .ti -8
 .SS devlink port function set - Set the port function attribute(s).
@@ -327,6 +335,17 @@ devlink dev param set pci/0000:01:00.0/1 name
internal_error_reset value true cm  .RS 4  Sets the parameter
internal_error_reset of specified devlink port (#1) to true.
 .RE
+.PP
+devlink port add pci/0000:06:00.0 flavour pcisf pfnum 0 sfnum 88
+controller 1 .RS 4 Add a devlink port of flavour PCI SF on controller
+1 which has PCI PF of number
+0 with SF number 88. To make use of the function an example sequence
+is to add a port, configure the function attribute and activate the
+function. Once the function usage is completed, deactivate the
+function and finally delete the port. When there is desire to reuse
+the port without deletion, it can be reconfigured and activated again
+when function is in inactive state and function's operational state is
detached.
quoted
+.RE

 .SH SEE ALSO
 .BR devlink (8),
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help