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/296quoted
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 1pfnum 0 sfnum 77 external true splittable falsequoted
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 index0b5548fb..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) #defineDL_OPT_PORT_FUNCTION_STATEquoted
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_to_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 namePARAMETER value VALUE cmode { permanent | driverinit | runtime }\n");quoted
pr_err(" devlink port param show [DEV/PORT_INDEX namePARAMETER]\n");quoted
pr_err(" devlink port health show [ DEV/PORT_INDEX reporterREPORTER_NAME ]\n");quoted
- pr_err(" devlink port add DEV/PORT_INDEX flavour FLAVOURpfnum PFNUM [ sfnum SFNUM ]\n");quoted
+ pr_err(" devlink port add DEV/PORT_INDEX flavour FLAVOURpfnum 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, boolshow_device, bool show_port); static void cmd_port_add_help(void) { - pr_err(" devlink port add { DEV | DEV/PORT_INDEX } flavourFLAVOUR pfnum PFNUM [ sfnum SFNUM ]\n");quoted
+ pr_err(" devlink port add { DEV | DEV/PORT_INDEX } flavourFLAVOUR 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 index563c5833..a5142c4e 100644--- a/man/man8/devlink-port.8 +++ b/man/man8/devlink-port.8@@ -54,6 +54,8 @@ devlink-port \- devlink port configuration .IRPFNUMBER " ]" .RB "{ " pcisf .IR SFNUMBER " }" +.RB "{ " controller +.IR CNUM " }" .br .ti -8@@ -174,6 +176,12 @@ Specifies sfnumber to assign to the device of theSF.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 nameinternal_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 isdetached.quoted
+.RE .SH SEE ALSO .BR devlink (8),