All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH iproute2-next v1 0/2] devlink: add support to run selftests
@ 2022-06-28 16:44 Vikas Gupta
  2022-06-28 16:44 ` [PATCH iproute2-next v1 1/2] Update kernel header Vikas Gupta
                   ` (3 more replies)
  0 siblings, 4 replies; 13+ messages in thread
From: Vikas Gupta @ 2022-06-28 16:44 UTC (permalink / raw)
  To: jiri, dsahern, stephen
  Cc: kuba, netdev, edumazet, michael.chan, andrew.gospodarek, Vikas Gupta

[-- Attachment #1: Type: text/plain, Size: 635 bytes --]

Hi,
  This patchset adds support in devlink to run selftests.
  A related patchset for kernel has been pushed for review.
  Below are the few examples for the commands.
  
   $ devlink dev selftests run pci/0000:03:00.0 test flash
     results:
        flash test :  failed

    $ devlink dev selftests show pci/0000:03:00.0
    device suuports:
        flash test


Thanks,
Vikas   

Vikas Gupta (2):
  Update kernel header
  devlink: add support for running selftests

 devlink/devlink.c            | 157 +++++++++++++++++++++++++++++++++++
 include/uapi/linux/devlink.h |  24 ++++++
 2 files changed, 181 insertions(+)

-- 
2.31.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4206 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH iproute2-next v1 1/2] Update kernel header
  2022-06-28 16:44 [PATCH iproute2-next v1 0/2] devlink: add support to run selftests Vikas Gupta
@ 2022-06-28 16:44 ` Vikas Gupta
  2022-06-28 16:44 ` [PATCH iproute2-next v1 2/2] devlink: add support for running selftests Vikas Gupta
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 13+ messages in thread
From: Vikas Gupta @ 2022-06-28 16:44 UTC (permalink / raw)
  To: jiri, dsahern, stephen
  Cc: kuba, netdev, edumazet, michael.chan, andrew.gospodarek, Vikas Gupta

[-- Attachment #1: Type: text/plain, Size: 1784 bytes --]

Signed-off-by: Vikas Gupta <vikas.gupta@broadcom.com>
---
 include/uapi/linux/devlink.h | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
index da0f1ba8..ea215b7f 100644
--- a/include/uapi/linux/devlink.h
+++ b/include/uapi/linux/devlink.h
@@ -136,6 +136,9 @@ enum devlink_command {
 	DEVLINK_CMD_LINECARD_NEW,
 	DEVLINK_CMD_LINECARD_DEL,
 
+	DEVLINK_CMD_SELFTESTS_SHOW,
+	DEVLINK_CMD_SELFTESTS_RUN,
+
 	/* add new commands above here */
 	__DEVLINK_CMD_MAX,
 	DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1
@@ -276,6 +279,21 @@ enum {
 #define DEVLINK_SUPPORTED_FLASH_OVERWRITE_SECTIONS \
 	(_BITUL(__DEVLINK_FLASH_OVERWRITE_MAX_BIT) - 1)
 
+/* Commonly used test cases. Drivers might interpret test bit
+ * in their own way and it may map single to multiple tests.
+ */
+enum {
+	DEVLINK_SELFTEST_FLASH_BIT,
+
+	__DEVLINK_SELFTEST_MAX_BIT,
+	DEVLINK_SELFTEST_MAX_BIT = __DEVLINK_SELFTEST_MAX_BIT - 1
+};
+
+#define DEVLINK_SELFTEST_FLASH _BITUL(DEVLINK_SELFTEST_FLASH_BIT)
+
+#define DEVLINK_SUPPORTED_SELFTESTS \
+	(_BITUL(__DEVLINK_SELFTEST_MAX_BIT) - 1)
+
 /**
  * enum devlink_trap_action - Packet trap action.
  * @DEVLINK_TRAP_ACTION_DROP: Packet is dropped by the device and a copy is not
@@ -576,6 +594,12 @@ enum devlink_attr {
 	DEVLINK_ATTR_LINECARD_TYPE,		/* string */
 	DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES,	/* nested */
 
+	DEVLINK_ATTR_SELFTESTS_MASK,		/* bitfield32 */
+	DEVLINK_ATTR_TEST_NAMES,		/* nested */
+	DEVLINK_ATTR_TEST_NAME,			/* string */
+	DEVLINK_ATTR_TEST_RESULTS,		/* nested */
+	DEVLINK_ATTR_TEST_RESULT,		/* nested */
+	DEVLINK_ATTR_TEST_RESULT_VAL,		/* u8 */
 	/* add new attributes above here, update the policy in devlink.c */
 
 	__DEVLINK_ATTR_MAX,
-- 
2.31.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4206 bytes --]

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH iproute2-next v1 2/2] devlink: add support for running selftests
  2022-06-28 16:44 [PATCH iproute2-next v1 0/2] devlink: add support to run selftests Vikas Gupta
  2022-06-28 16:44 ` [PATCH iproute2-next v1 1/2] Update kernel header Vikas Gupta
@ 2022-06-28 16:44 ` Vikas Gupta
  2022-06-29 11:37 ` [PATCH iproute2-next v1 0/2] devlink: add support to run selftests Ido Schimmel
  2022-07-07 18:31 ` [PATCH iproute2-next v2 0/3] " Vikas Gupta
  3 siblings, 0 replies; 13+ messages in thread
From: Vikas Gupta @ 2022-06-28 16:44 UTC (permalink / raw)
  To: jiri, dsahern, stephen
  Cc: kuba, netdev, edumazet, michael.chan, andrew.gospodarek, Vikas Gupta

[-- Attachment #1: Type: text/plain, Size: 7660 bytes --]

Add command and helper APIs to run selfests.
Also add a seltest for flash on the device.

Examples:
$ devlink dev selftests run pci/0000:03:00.0 test flash
 results:
    flash test :  failed

$ devlink dev selftests show pci/0000:03:00.0
device suuports:
    flash test

Signed-off-by: Vikas Gupta <vikas.gupta@broadcom.com>
---
 devlink/devlink.c | 157 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 157 insertions(+)

diff --git a/devlink/devlink.c b/devlink/devlink.c
index ddf430bb..2f7c4ff9 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -294,6 +294,7 @@ static void ifname_map_free(struct ifname_map *ifname_map)
 #define DL_OPT_PORT_FN_RATE_TX_MAX	BIT(49)
 #define DL_OPT_PORT_FN_RATE_NODE_NAME	BIT(50)
 #define DL_OPT_PORT_FN_RATE_PARENT	BIT(51)
+#define DL_OPT_SELFTESTS		BIT(52)
 
 struct dl_opts {
 	uint64_t present; /* flags of present items */
@@ -344,6 +345,7 @@ struct dl_opts {
 	uint32_t overwrite_mask;
 	enum devlink_reload_action reload_action;
 	enum devlink_reload_limit reload_limit;
+	uint32_t selftests_mask;
 	uint32_t port_controller;
 	uint32_t port_sfnumber;
 	uint16_t port_flavour;
@@ -1401,6 +1403,19 @@ static struct str_num_map port_fn_opstate_map[] = {
 	{ .str = NULL, }
 };
 
+static int selftests_get(const char *testname, uint32_t *mask)
+{
+	if (strcmp(testname, "flash") == 0) {
+		*mask |= DEVLINK_SELFTEST_FLASH;
+	} else if (strcmp(testname, "all") == 0) {
+		*mask = DEVLINK_SUPPORTED_SELFTESTS;
+	} else {
+		pr_err("Unknown selftest \"%s\"\n", testname);
+		return -EINVAL;
+	}
+	return 0;
+}
+
 static int port_flavour_parse(const char *flavour, uint16_t *value)
 {
 	int num;
@@ -1490,6 +1505,7 @@ static const struct dl_args_metadata dl_args_required[] = {
 	{DL_OPT_PORT_FUNCTION_HW_ADDR, "Port function's hardware address is expected."},
 	{DL_OPT_PORT_FLAVOUR,          "Port flavour is expected."},
 	{DL_OPT_PORT_PFNUMBER,         "Port PCI PF number is expected."},
+	{DL_OPT_SELFTESTS,             "Test name is expected"},
 };
 
 static int dl_args_finding_required_validate(uint64_t o_required,
@@ -1793,6 +1809,20 @@ static int dl_argv_parse(struct dl *dl, uint64_t o_required,
 				return err;
 			o_found |= DL_OPT_FLASH_OVERWRITE;
 
+		} else if (dl_argv_match(dl, "test") &&
+				(o_all & DL_OPT_SELFTESTS)) {
+			const char *testname;
+
+			dl_arg_inc(dl);
+			err = dl_argv_str(dl, &testname);
+			if( err)
+				return err;
+			err = selftests_get(testname,
+					    &opts->selftests_mask);
+			if (err)
+				return err;
+			o_found |= DL_OPT_SELFTESTS;
+
 		} else if (dl_argv_match(dl, "reporter") &&
 			   (o_all & DL_OPT_HEALTH_REPORTER_NAME)) {
 			dl_arg_inc(dl);
@@ -2063,6 +2093,17 @@ dl_reload_limits_put(struct nlmsghdr *nlh, const struct dl_opts *opts)
 	mnl_attr_put(nlh, DEVLINK_ATTR_RELOAD_LIMITS, sizeof(limits), &limits);
 }
 
+static void
+dl_selftests_put(struct nlmsghdr *nlh, const struct dl_opts *opts)
+{
+	struct nla_bitfield32 selftests_mask;
+	selftests_mask.selector = DEVLINK_SUPPORTED_SELFTESTS;
+	selftests_mask.value = opts->selftests_mask;
+
+	mnl_attr_put(nlh, DEVLINK_ATTR_SELFTESTS_MASK,
+		     sizeof(selftests_mask), &selftests_mask);
+}
+
 static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl)
 {
 	struct dl_opts *opts = &dl->opts;
@@ -2157,6 +2198,8 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl)
 				  opts->flash_component);
 	if (opts->present & DL_OPT_FLASH_OVERWRITE)
 		dl_flash_update_overwrite_put(nlh, opts);
+	if (opts->present & DL_OPT_SELFTESTS)
+		dl_selftests_put(nlh, opts);
 	if (opts->present & DL_OPT_HEALTH_REPORTER_NAME)
 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME,
 				  opts->reporter_name);
@@ -2285,6 +2328,8 @@ static void cmd_dev_help(void)
 	pr_err("                              [ action { driver_reinit | fw_activate } ] [ limit no_reset ]\n");
 	pr_err("       devlink dev info [ DEV ]\n");
 	pr_err("       devlink dev flash DEV file PATH [ component NAME ] [ overwrite SECTION ]\n");
+	pr_err("       devlink dev selftests show DEV\n");
+	pr_err("       devlink dev selftests run DEV test {flash | all}\n");
 }
 
 static bool cmp_arr_last_handle(struct dl *dl, const char *bus_name,
@@ -3904,6 +3949,115 @@ err_socket:
 	return err;
 }
 
+static int cmd_dev_selftests_show_tests(const struct nlmsghdr *nlh, void *data)
+{
+	struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
+	struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {};
+	struct nlattr *test_name_attr;
+	struct dl *dl = data;
+
+	mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb);
+	if (!tb[DEVLINK_ATTR_TEST_NAMES])  {
+		return MNL_CB_ERROR;
+	}
+
+	pr_out_array_start(dl, "device supports");
+
+	mnl_attr_for_each_nested(test_name_attr, tb[DEVLINK_ATTR_TEST_NAMES]) {
+		pr_out_entry_start(dl);
+		check_indent_newline(dl);
+		print_string(PRINT_ANY, NULL, "%s",
+			     mnl_attr_get_str(test_name_attr));
+		pr_out_entry_end(dl);
+	}
+
+	pr_out_array_end(dl);
+	return 0;
+}
+
+static int cmd_dev_selftests_result_show(const struct nlmsghdr *nlh, void *data)
+{
+	struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
+	struct nlattr *test_res[DEVLINK_ATTR_MAX + 1] = {};
+	struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {};
+	struct nlattr *nla_header;
+	struct dl *dl = data;
+	int err = 0;
+
+	mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb);
+	if (!tb[DEVLINK_ATTR_TEST_RESULTS])  {
+		return MNL_CB_ERROR;
+	}
+
+	pr_out_array_start(dl, "results");
+
+	mnl_attr_for_each_nested(nla_header, tb[DEVLINK_ATTR_TEST_RESULTS]) {
+		err = mnl_attr_parse_nested(nla_header, attr_cb, test_res);
+		if (err != MNL_CB_OK)
+			goto err_result_show;
+		pr_out_entry_start(dl);
+		check_indent_newline(dl);
+		print_string(PRINT_ANY, NULL, "%s : ",
+			     mnl_attr_get_str(test_res[DEVLINK_ATTR_TEST_NAME]));
+		print_string(PRINT_ANY, NULL, " %s",
+			     mnl_attr_get_u8(test_res[DEVLINK_ATTR_TEST_RESULT_VAL]) ? "passed" : "failed");
+		pr_out_entry_end(dl);
+	}
+
+err_result_show:
+	pr_out_array_end(dl);
+	return err;
+}
+
+static int cmd_dev_selftests_run(struct dl *dl)
+{
+	struct nlmsghdr *nlh;
+	uint16_t flags = NLM_F_REQUEST | NLM_F_ACK;
+	int err;
+
+	nlh = mnlu_gen_socket_cmd_prepare(&dl->nlg, DEVLINK_CMD_SELFTESTS_RUN, flags);
+
+	err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE | DL_OPT_SELFTESTS, 0);
+	if (err)
+		return err;
+
+	err = mnlu_gen_socket_sndrcv(&dl->nlg, nlh, cmd_dev_selftests_result_show, dl);
+	return err;
+}
+
+static int cmd_dev_selftests_show(struct dl *dl)
+{
+	uint16_t flags = NLM_F_REQUEST | NLM_F_ACK;
+	struct nlmsghdr *nlh;
+	int err;
+
+	nlh = mnlu_gen_socket_cmd_prepare(&dl->nlg, DEVLINK_CMD_SELFTESTS_SHOW, flags);
+
+	err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE, 0);
+	if (err)
+		return err;
+
+	err = mnlu_gen_socket_sndrcv(&dl->nlg, nlh, cmd_dev_selftests_show_tests, dl);
+	return err;
+}
+
+static int cmd_dev_selftests(struct dl *dl)
+{
+	if (dl_argv_match(dl, "help")) {
+		cmd_dev_help();
+		return 0;
+	} else if (dl_argv_match(dl, "show") ||
+		   dl_argv_match(dl, "list") || dl_no_arg(dl)) {
+		dl_arg_inc(dl);
+		return cmd_dev_selftests_show(dl);
+	} else if (dl_argv_match(dl, "run")) {
+		dl_arg_inc(dl);
+		return cmd_dev_selftests_run(dl);
+	}
+	pr_err("Command \"%s\" not found\n", dl_argv(dl));
+	return -ENOENT;
+}
+
 static int cmd_dev(struct dl *dl)
 {
 	if (dl_argv_match(dl, "help")) {
@@ -3928,6 +4082,9 @@ static int cmd_dev(struct dl *dl)
 	} else if (dl_argv_match(dl, "flash")) {
 		dl_arg_inc(dl);
 		return cmd_dev_flash(dl);
+	} else if (dl_argv_match(dl, "selftests")) {
+		dl_arg_inc(dl);
+		return cmd_dev_selftests(dl);
 	}
 	pr_err("Command \"%s\" not found\n", dl_argv(dl));
 	return -ENOENT;
-- 
2.31.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4206 bytes --]

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH iproute2-next v1 0/2] devlink: add support to run selftests
  2022-06-28 16:44 [PATCH iproute2-next v1 0/2] devlink: add support to run selftests Vikas Gupta
  2022-06-28 16:44 ` [PATCH iproute2-next v1 1/2] Update kernel header Vikas Gupta
  2022-06-28 16:44 ` [PATCH iproute2-next v1 2/2] devlink: add support for running selftests Vikas Gupta
@ 2022-06-29 11:37 ` Ido Schimmel
  2022-07-07 18:31 ` [PATCH iproute2-next v2 0/3] " Vikas Gupta
  3 siblings, 0 replies; 13+ messages in thread
From: Ido Schimmel @ 2022-06-29 11:37 UTC (permalink / raw)
  To: Vikas Gupta
  Cc: jiri, dsahern, stephen, kuba, netdev, edumazet, michael.chan,
	andrew.gospodarek

On Tue, Jun 28, 2022 at 10:14:45PM +0530, Vikas Gupta wrote:
>  devlink/devlink.c            | 157 +++++++++++++++++++++++++++++++++++
>  include/uapi/linux/devlink.h |  24 ++++++
>  2 files changed, 181 insertions(+)

Please update the man pages and bash completion
(bash-completion/devlink) in the next version

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH iproute2-next v2 0/3] devlink: add support to run selftests
  2022-06-28 16:44 [PATCH iproute2-next v1 0/2] devlink: add support to run selftests Vikas Gupta
                   ` (2 preceding siblings ...)
  2022-06-29 11:37 ` [PATCH iproute2-next v1 0/2] devlink: add support to run selftests Ido Schimmel
@ 2022-07-07 18:31 ` Vikas Gupta
  2022-07-07 18:31   ` [PATCH iproute2-next v2 1/3] devlink: update the devlink.h Vikas Gupta
                     ` (4 more replies)
  3 siblings, 5 replies; 13+ messages in thread
From: Vikas Gupta @ 2022-07-07 18:31 UTC (permalink / raw)
  To: jiri, dsahern, stephen
  Cc: kuba, netdev, edumazet, michael.chan, andrew.gospodarek, Vikas Gupta

[-- Attachment #1: Type: text/plain, Size: 937 bytes --]

Hi,
  This patchset adds support in devlink to run selftests.
  A related patchset for kernel has been pushed for review.
  Below are the few examples for the commands.
  
 Examples:
    $ devlink dev selftests run pci/0000:03:00.0 test flash
       selftests results:
          flash failed

    $ devlink dev selftests show pci/0000:03:00.0
       supported selftests:
          flash

changes from:
v1->v2
    a) Changes required to implement command due to changes
       in kernel patch (under review).
    b) Added commands descriptions in devlink-dev man page.

Thanks,
Vikas   


Vikas Gupta (3):
  devlink: update the devlink.h
  devlink: add support for running selftests
  devlink : update man page for new commands

 devlink/devlink.c            | 193 +++++++++++++++++++++++++++++++++++
 include/uapi/linux/devlink.h |  26 +++++
 man/man8/devlink-dev.8       |  46 +++++++++
 3 files changed, 265 insertions(+)

-- 
2.31.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4206 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH iproute2-next v2 1/3] devlink: update the devlink.h
  2022-07-07 18:31 ` [PATCH iproute2-next v2 0/3] " Vikas Gupta
@ 2022-07-07 18:31   ` Vikas Gupta
  2022-07-07 18:31   ` [PATCH iproute2-next v2 2/3] devlink: add support for running selftests Vikas Gupta
                     ` (3 subsequent siblings)
  4 siblings, 0 replies; 13+ messages in thread
From: Vikas Gupta @ 2022-07-07 18:31 UTC (permalink / raw)
  To: jiri, dsahern, stephen
  Cc: kuba, netdev, edumazet, michael.chan, andrew.gospodarek, Vikas Gupta

[-- Attachment #1: Type: text/plain, Size: 1854 bytes --]

update the devlink.h to comaptible with net-next kernel.

Signed-off-by: Vikas Gupta <vikas.gupta@broadcom.com>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
---
 include/uapi/linux/devlink.h | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
index da0f1ba8..281aa1fa 100644
--- a/include/uapi/linux/devlink.h
+++ b/include/uapi/linux/devlink.h
@@ -136,6 +136,9 @@ enum devlink_command {
 	DEVLINK_CMD_LINECARD_NEW,
 	DEVLINK_CMD_LINECARD_DEL,
 
+	DEVLINK_CMD_SELFTESTS_SHOW,
+	DEVLINK_CMD_SELFTESTS_RUN,
+
 	/* add new commands above here */
 	__DEVLINK_CMD_MAX,
 	DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1
@@ -276,6 +279,25 @@ enum {
 #define DEVLINK_SUPPORTED_FLASH_OVERWRITE_SECTIONS \
 	(_BITUL(__DEVLINK_FLASH_OVERWRITE_MAX_BIT) - 1)
 
+/* Commonly used test cases */
+enum {
+	DEVLINK_SELFTEST_FLASH_BIT,
+
+	__DEVLINK_SELFTEST_MAX_BIT,
+	DEVLINK_SELFTEST_MAX_BIT = __DEVLINK_SELFTEST_MAX_BIT - 1
+};
+
+#define DEVLINK_SELFTEST_FLASH _BITUL(DEVLINK_SELFTEST_FLASH_BIT)
+
+#define DEVLINK_SELFTESTS_MASK \
+	(_BITUL(__DEVLINK_SELFTEST_MAX_BIT) - 1)
+
+enum {
+	DEVLINK_SELFTEST_SKIP,
+	DEVLINK_SELFTEST_PASS,
+	DEVLINK_SELFTEST_FAIL
+};
+
 /**
  * enum devlink_trap_action - Packet trap action.
  * @DEVLINK_TRAP_ACTION_DROP: Packet is dropped by the device and a copy is not
@@ -576,6 +598,10 @@ enum devlink_attr {
 	DEVLINK_ATTR_LINECARD_TYPE,		/* string */
 	DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES,	/* nested */
 
+	DEVLINK_ATTR_SELFTESTS_MASK,		/* u32 */
+	DEVLINK_ATTR_TEST_RESULT,		/* nested */
+	DEVLINK_ATTR_TEST_NAME,			/* string */
+	DEVLINK_ATTR_TEST_RESULT_VAL,		/* u8 */
 	/* add new attributes above here, update the policy in devlink.c */
 
 	__DEVLINK_ATTR_MAX,
-- 
2.31.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4206 bytes --]

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH iproute2-next v2 2/3] devlink: add support for running selftests
  2022-07-07 18:31 ` [PATCH iproute2-next v2 0/3] " Vikas Gupta
  2022-07-07 18:31   ` [PATCH iproute2-next v2 1/3] devlink: update the devlink.h Vikas Gupta
@ 2022-07-07 18:31   ` Vikas Gupta
  2022-07-07 18:31   ` [PATCH iproute2-next v2 3/3] devlink : update man page for new commands Vikas Gupta
                     ` (2 subsequent siblings)
  4 siblings, 0 replies; 13+ messages in thread
From: Vikas Gupta @ 2022-07-07 18:31 UTC (permalink / raw)
  To: jiri, dsahern, stephen
  Cc: kuba, netdev, edumazet, michael.chan, andrew.gospodarek, Vikas Gupta

[-- Attachment #1: Type: text/plain, Size: 8525 bytes --]

Add command and helper APIs to run selfests.
Also add a seltest for flash on the device.

Examples:
$ devlink dev selftests run pci/0000:03:00.0 test flash
   selftests results:
      flash failed

$ devlink dev selftests show pci/0000:03:00.0
   supported selftests:
      flash

Signed-off-by: Vikas Gupta <vikas.gupta@broadcom.com>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
---
 devlink/devlink.c | 193 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 193 insertions(+)

diff --git a/devlink/devlink.c b/devlink/devlink.c
index ddf430bb..ebd33f9d 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -294,6 +294,7 @@ static void ifname_map_free(struct ifname_map *ifname_map)
 #define DL_OPT_PORT_FN_RATE_TX_MAX	BIT(49)
 #define DL_OPT_PORT_FN_RATE_NODE_NAME	BIT(50)
 #define DL_OPT_PORT_FN_RATE_PARENT	BIT(51)
+#define DL_OPT_SELFTESTS		BIT(52)
 
 struct dl_opts {
 	uint64_t present; /* flags of present items */
@@ -344,6 +345,7 @@ struct dl_opts {
 	uint32_t overwrite_mask;
 	enum devlink_reload_action reload_action;
 	enum devlink_reload_limit reload_limit;
+	uint32_t selftests_mask;
 	uint32_t port_controller;
 	uint32_t port_sfnumber;
 	uint16_t port_flavour;
@@ -693,6 +695,7 @@ static const enum mnl_attr_data_type devlink_policy[DEVLINK_ATTR_MAX + 1] = {
 	[DEVLINK_ATTR_TRAP_POLICER_ID] = MNL_TYPE_U32,
 	[DEVLINK_ATTR_TRAP_POLICER_RATE] = MNL_TYPE_U64,
 	[DEVLINK_ATTR_TRAP_POLICER_BURST] = MNL_TYPE_U64,
+	[DEVLINK_ATTR_TEST_RESULT] = MNL_TYPE_NESTED
 };
 
 static const enum mnl_attr_data_type
@@ -1401,6 +1404,19 @@ static struct str_num_map port_fn_opstate_map[] = {
 	{ .str = NULL, }
 };
 
+static int selftests_get(const char *testname, uint32_t *mask)
+{
+	if (strcmp(testname, "flash") == 0) {
+		*mask |= DEVLINK_SELFTEST_FLASH;
+	} else if (strcmp(testname, "all") == 0) {
+		*mask = DEVLINK_SELFTESTS_MASK;
+	} else {
+		pr_err("Unknown selftest \"%s\"\n", testname);
+		return -EINVAL;
+	}
+	return 0;
+}
+
 static int port_flavour_parse(const char *flavour, uint16_t *value)
 {
 	int num;
@@ -1490,6 +1506,7 @@ static const struct dl_args_metadata dl_args_required[] = {
 	{DL_OPT_PORT_FUNCTION_HW_ADDR, "Port function's hardware address is expected."},
 	{DL_OPT_PORT_FLAVOUR,          "Port flavour is expected."},
 	{DL_OPT_PORT_PFNUMBER,         "Port PCI PF number is expected."},
+	{DL_OPT_SELFTESTS,             "Test name is expected"},
 };
 
 static int dl_args_finding_required_validate(uint64_t o_required,
@@ -1793,6 +1810,20 @@ static int dl_argv_parse(struct dl *dl, uint64_t o_required,
 				return err;
 			o_found |= DL_OPT_FLASH_OVERWRITE;
 
+		} else if (dl_argv_match(dl, "test") &&
+				(o_all & DL_OPT_SELFTESTS)) {
+			const char *testname;
+
+			dl_arg_inc(dl);
+			err = dl_argv_str(dl, &testname);
+			if (err)
+				return err;
+			err = selftests_get(testname,
+					    &opts->selftests_mask);
+			if (err)
+				return err;
+			o_found |= DL_OPT_SELFTESTS;
+
 		} else if (dl_argv_match(dl, "reporter") &&
 			   (o_all & DL_OPT_HEALTH_REPORTER_NAME)) {
 			dl_arg_inc(dl);
@@ -2063,6 +2094,17 @@ dl_reload_limits_put(struct nlmsghdr *nlh, const struct dl_opts *opts)
 	mnl_attr_put(nlh, DEVLINK_ATTR_RELOAD_LIMITS, sizeof(limits), &limits);
 }
 
+static void
+dl_selftests_put(struct nlmsghdr *nlh, const struct dl_opts *opts)
+{
+	uint32_t selftests_mask;
+
+	selftests_mask = opts->selftests_mask;
+
+	mnl_attr_put(nlh, DEVLINK_ATTR_SELFTESTS_MASK,
+		     sizeof(selftests_mask), &selftests_mask);
+}
+
 static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl)
 {
 	struct dl_opts *opts = &dl->opts;
@@ -2157,6 +2199,8 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl)
 				  opts->flash_component);
 	if (opts->present & DL_OPT_FLASH_OVERWRITE)
 		dl_flash_update_overwrite_put(nlh, opts);
+	if (opts->present & DL_OPT_SELFTESTS)
+		dl_selftests_put(nlh, opts);
 	if (opts->present & DL_OPT_HEALTH_REPORTER_NAME)
 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME,
 				  opts->reporter_name);
@@ -2285,6 +2329,8 @@ static void cmd_dev_help(void)
 	pr_err("                              [ action { driver_reinit | fw_activate } ] [ limit no_reset ]\n");
 	pr_err("       devlink dev info [ DEV ]\n");
 	pr_err("       devlink dev flash DEV file PATH [ component NAME ] [ overwrite SECTION ]\n");
+	pr_err("       devlink dev selftests show DEV\n");
+	pr_err("       devlink dev selftests run DEV test { TESTNAME | all }\n");
 }
 
 static bool cmp_arr_last_handle(struct dl *dl, const char *bus_name,
@@ -3904,6 +3950,150 @@ err_socket:
 	return err;
 }
 
+static int cmd_dev_selftests_show_tests(const struct nlmsghdr *nlh, void *data)
+{
+	struct nlattr *version;
+	struct dl *dl = data;
+	int avail = 0;
+
+	mnl_attr_for_each(version, nlh, sizeof(struct genlmsghdr)) {
+		int type = mnl_attr_get_type(version);
+
+		if (type == DEVLINK_ATTR_BUS_NAME || type == DEVLINK_ATTR_DEV_NAME)
+			continue;
+
+		if (type != DEVLINK_ATTR_TEST_NAME)
+			return MNL_CB_ERROR;
+
+		if (!avail) {
+			pr_out_object_start(dl, "supported selftests");
+			avail = 1;
+		}
+
+		check_indent_newline(dl);
+		print_string(PRINT_ANY, NULL, "%s", mnl_attr_get_str(version));
+		if (!dl->json_output)
+			__pr_out_newline();
+	}
+
+	if (avail)
+		pr_out_object_end(dl);
+
+	return MNL_CB_OK;
+}
+
+static const char *selftest_result_to_str(uint8_t res)
+{
+	switch (res) {
+	case DEVLINK_SELFTEST_SKIP:
+		return "skipped";
+	case DEVLINK_SELFTEST_PASS:
+		return "passed";
+	case DEVLINK_SELFTEST_FAIL:
+		return "failed";
+	default:
+		return "unknown";
+	}
+}
+
+static int cmd_dev_selftests_result_show(const struct nlmsghdr *nlh, void *data)
+{
+	struct nlattr *version;
+	struct dl *dl = data;
+	int avail = 0;
+
+	mnl_attr_for_each(version, nlh, sizeof(struct genlmsghdr)) {
+		struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {};
+		int type = mnl_attr_get_type(version);
+		const char *test_name;
+		const char *test_res;
+		uint8_t res_val;
+		int err;
+
+		if (type == DEVLINK_ATTR_BUS_NAME || type == DEVLINK_ATTR_DEV_NAME)
+			continue;
+
+		if (type != DEVLINK_ATTR_TEST_RESULT)
+			return MNL_CB_ERROR;
+
+		err = mnl_attr_parse_nested(version, attr_cb, tb);
+		if (err != MNL_CB_OK)
+			return MNL_CB_ERROR;
+
+		if (!tb[DEVLINK_ATTR_TEST_NAME] ||
+		    !tb[DEVLINK_ATTR_TEST_RESULT_VAL])
+			return MNL_CB_ERROR;
+
+		if (!avail) {
+			pr_out_object_start(dl, "selftests results");
+			avail = 1;
+		}
+
+		test_name = mnl_attr_get_str(tb[DEVLINK_ATTR_TEST_NAME]);
+		res_val = mnl_attr_get_u8(tb[DEVLINK_ATTR_TEST_RESULT_VAL]);
+		test_res = selftest_result_to_str(res_val);
+
+		check_indent_newline(dl);
+		print_string_name_value(test_name, test_res);
+		if (!dl->json_output)
+			__pr_out_newline();
+	}
+
+	if (avail)
+		pr_out_object_end(dl);
+
+	return MNL_CB_OK;
+}
+
+static int cmd_dev_selftests_run(struct dl *dl)
+{
+	struct nlmsghdr *nlh;
+	uint16_t flags = NLM_F_REQUEST | NLM_F_ACK;
+	int err;
+
+	nlh = mnlu_gen_socket_cmd_prepare(&dl->nlg, DEVLINK_CMD_SELFTESTS_RUN, flags);
+
+	err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE | DL_OPT_SELFTESTS, 0);
+	if (err)
+		return err;
+
+	err = mnlu_gen_socket_sndrcv(&dl->nlg, nlh, cmd_dev_selftests_result_show, dl);
+	return err;
+}
+
+static int cmd_dev_selftests_show(struct dl *dl)
+{
+	uint16_t flags = NLM_F_REQUEST | NLM_F_ACK;
+	struct nlmsghdr *nlh;
+	int err;
+
+	nlh = mnlu_gen_socket_cmd_prepare(&dl->nlg, DEVLINK_CMD_SELFTESTS_SHOW, flags);
+
+	err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE, 0);
+	if (err)
+		return err;
+
+	err = mnlu_gen_socket_sndrcv(&dl->nlg, nlh, cmd_dev_selftests_show_tests, dl);
+	return err;
+}
+
+static int cmd_dev_selftests(struct dl *dl)
+{
+	if (dl_argv_match(dl, "help")) {
+		cmd_dev_help();
+		return 0;
+	} else if (dl_argv_match(dl, "show") ||
+		   dl_argv_match(dl, "list") || dl_no_arg(dl)) {
+		dl_arg_inc(dl);
+		return cmd_dev_selftests_show(dl);
+	} else if (dl_argv_match(dl, "run")) {
+		dl_arg_inc(dl);
+		return cmd_dev_selftests_run(dl);
+	}
+	pr_err("Command \"%s\" not found\n", dl_argv(dl));
+	return -ENOENT;
+}
+
 static int cmd_dev(struct dl *dl)
 {
 	if (dl_argv_match(dl, "help")) {
@@ -3928,6 +4118,9 @@ static int cmd_dev(struct dl *dl)
 	} else if (dl_argv_match(dl, "flash")) {
 		dl_arg_inc(dl);
 		return cmd_dev_flash(dl);
+	} else if (dl_argv_match(dl, "selftests")) {
+		dl_arg_inc(dl);
+		return cmd_dev_selftests(dl);
 	}
 	pr_err("Command \"%s\" not found\n", dl_argv(dl));
 	return -ENOENT;
-- 
2.31.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4206 bytes --]

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH iproute2-next v2 3/3] devlink : update man page for new commands
  2022-07-07 18:31 ` [PATCH iproute2-next v2 0/3] " Vikas Gupta
  2022-07-07 18:31   ` [PATCH iproute2-next v2 1/3] devlink: update the devlink.h Vikas Gupta
  2022-07-07 18:31   ` [PATCH iproute2-next v2 2/3] devlink: add support for running selftests Vikas Gupta
@ 2022-07-07 18:31   ` Vikas Gupta
  2022-07-10  8:56   ` [PATCH iproute2-next v2 0/3] devlink: add support to run selftests Ido Schimmel
  2022-07-18  6:22   ` [PATCH iproute2-next v3 0/3] devlink: add support to run selftest Vikas Gupta
  4 siblings, 0 replies; 13+ messages in thread
From: Vikas Gupta @ 2022-07-07 18:31 UTC (permalink / raw)
  To: jiri, dsahern, stephen
  Cc: kuba, netdev, edumazet, michael.chan, andrew.gospodarek, Vikas Gupta

[-- Attachment #1: Type: text/plain, Size: 1861 bytes --]

Update the man page for newly added selftests commands.
Examples:
 devlink dev selftests run pci/0000:03:00.0 test flash
 devlink dev selftests show pci/0000:03:00.0

Signed-off-by: Vikas Gupta <vikas.gupta@broadcom.com>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
---
 man/man8/devlink-dev.8 | 46 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/man/man8/devlink-dev.8 b/man/man8/devlink-dev.8
index 6906e509..057551a8 100644
--- a/man/man8/devlink-dev.8
+++ b/man/man8/devlink-dev.8
@@ -85,6 +85,16 @@ devlink-dev \- devlink device configuration
 .I ID
 ]
 
+.ti -8
+.B devlink dev selftests show
+.I DEV
+
+.ti -8
+.B devlink dev selftests run
+.I DEV
+.B test
+.I TESTNAME
+
 .SH "DESCRIPTION"
 .SS devlink dev show - display devlink device attributes
 
@@ -249,6 +259,32 @@ should match the component names from
 .B "devlink dev info"
 and may be driver-dependent.
 
+.SS devlink dev selftests show - shows supported selftests on devlink device.
+
+.PP
+.I "DEV"
+- specifies the devlink device.
+
+.SS devlink dev selftests run - runs selftests on devlink device.
+
+.PP
+.I "DEV"
+- specifies the devlink device to execute selftests.
+
+.B test
+{
+.BI " TESTNAME "
+|
+.B " all "
+}
+- The value of
+.I TESTNAME
+should match the test names from
+.B "devlink dev selftests show".
+OR Pass option
+.B "all"
+to execute all the selftests on the devlink device.
+
 .SH "EXAMPLES"
 .PP
 devlink dev show
@@ -296,6 +332,16 @@ Flashing 100%
 .br
 Flashing done
 .RE
+.PP
+devlink dev selftests show pci/0000:01:00.0
+.RS 4
+Shows the supported selftests by the devlink device.
+.RE
+.PP
+devlink dev selftests run pci/0000:01:00.0 test flash
+.RS 4
+Perform a flash test on the devlink device.
+.RE
 
 .SH SEE ALSO
 .BR devlink (8),
-- 
2.31.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4206 bytes --]

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH iproute2-next v2 0/3] devlink: add support to run selftests
  2022-07-07 18:31 ` [PATCH iproute2-next v2 0/3] " Vikas Gupta
                     ` (2 preceding siblings ...)
  2022-07-07 18:31   ` [PATCH iproute2-next v2 3/3] devlink : update man page for new commands Vikas Gupta
@ 2022-07-10  8:56   ` Ido Schimmel
  2022-07-18  6:22   ` [PATCH iproute2-next v3 0/3] devlink: add support to run selftest Vikas Gupta
  4 siblings, 0 replies; 13+ messages in thread
From: Ido Schimmel @ 2022-07-10  8:56 UTC (permalink / raw)
  To: Vikas Gupta
  Cc: jiri, dsahern, stephen, kuba, netdev, edumazet, michael.chan,
	andrew.gospodarek

On Fri, Jul 08, 2022 at 12:01:13AM +0530, Vikas Gupta wrote:
>  devlink/devlink.c            | 193 +++++++++++++++++++++++++++++++++++
>  include/uapi/linux/devlink.h |  26 +++++
>  man/man8/devlink-dev.8       |  46 +++++++++
>  3 files changed, 265 insertions(+)

What about bash completion [1]?

[1] https://lore.kernel.org/netdev/Yrw5d9jqe8%2FJCIbj@shredder/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH iproute2-next v3 0/3] devlink: add support to run selftest
  2022-07-07 18:31 ` [PATCH iproute2-next v2 0/3] " Vikas Gupta
                     ` (3 preceding siblings ...)
  2022-07-10  8:56   ` [PATCH iproute2-next v2 0/3] devlink: add support to run selftests Ido Schimmel
@ 2022-07-18  6:22   ` Vikas Gupta
  2022-07-18  6:22     ` [PATCH iproute2-next v3 1/3] devlink: update the devlink.h Vikas Gupta
                       ` (2 more replies)
  4 siblings, 3 replies; 13+ messages in thread
From: Vikas Gupta @ 2022-07-18  6:22 UTC (permalink / raw)
  To: jiri, dsahern, stephen
  Cc: kuba, netdev, edumazet, michael.chan, andrew.gospodarek, Vikas Gupta

[-- Attachment #1: Type: text/plain, Size: 1121 bytes --]

Hi,
  This patchset adds support in devlink to run selftests.
  A related patchset for kernel has been pushed for review.
  Below are the few examples for the commands.
  
Examples:
$ devlink dev selftests run pci/0000:03:00.0 test flash
pci/0000:03:00.0
      flash failed

$ devlink dev selftests show pci/0000:03:00.0
pci/0000:03:00.0
      flash

changes from:
v2->v3
    a) Update the implementation of commands according to 
       the latest patch set of kernel devlink patch.
    b) Added bash-completion.

v1->v2
    a) Changes required to implement command due to changes
       in kernel patch (under review).
    b) Added commands descriptions in devlink-dev man page.

Thanks,
Vikas   


Vikas Gupta (3):
  devlink: update the devlink.h
  devlink: add support for running selftests
  devlink : update man page and bash-completion for new commands

 bash-completion/devlink      |  21 ++-
 devlink/devlink.c            | 292 +++++++++++++++++++++++++++++++++++
 include/uapi/linux/devlink.h |  29 ++++
 man/man8/devlink-dev.8       |  47 ++++++
 4 files changed, 388 insertions(+), 1 deletion(-)

-- 
2.31.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4206 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH iproute2-next v3 1/3] devlink: update the devlink.h
  2022-07-18  6:22   ` [PATCH iproute2-next v3 0/3] devlink: add support to run selftest Vikas Gupta
@ 2022-07-18  6:22     ` Vikas Gupta
  2022-07-18  6:22     ` [PATCH iproute2-next v3 2/3] devlink: add support for running selftests Vikas Gupta
  2022-07-18  6:22     ` [PATCH iproute2-next v3 3/3] devlink : update man page and bash-completion for new commands Vikas Gupta
  2 siblings, 0 replies; 13+ messages in thread
From: Vikas Gupta @ 2022-07-18  6:22 UTC (permalink / raw)
  To: jiri, dsahern, stephen
  Cc: kuba, netdev, edumazet, michael.chan, andrew.gospodarek, Vikas Gupta

[-- Attachment #1: Type: text/plain, Size: 2068 bytes --]

update the devlink.h to comaptible with net-next kernel.

Signed-off-by: Vikas Gupta <vikas.gupta@broadcom.com>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
---
 include/uapi/linux/devlink.h | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
index da0f1ba8..efa8af0e 100644
--- a/include/uapi/linux/devlink.h
+++ b/include/uapi/linux/devlink.h
@@ -136,6 +136,9 @@ enum devlink_command {
 	DEVLINK_CMD_LINECARD_NEW,
 	DEVLINK_CMD_LINECARD_DEL,
 
+	DEVLINK_CMD_SELFTESTS_LIST,	/* can dump */
+	DEVLINK_CMD_SELFTESTS_RUN,
+
 	/* add new commands above here */
 	__DEVLINK_CMD_MAX,
 	DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1
@@ -276,6 +279,31 @@ enum {
 #define DEVLINK_SUPPORTED_FLASH_OVERWRITE_SECTIONS \
 	(_BITUL(__DEVLINK_FLASH_OVERWRITE_MAX_BIT) - 1)
 
+/* Commonly used test cases */
+enum devlink_selftest_attr {
+	DEVLINK_SELFTEST_ATTR_UNSPEC,
+	DEVLINK_SELFTEST_ATTR_FLASH,		/* flag */
+
+	__DEVLINK_SELFTEST_ATTR_MAX,
+	DEVLINK_SELFTEST_ATTR_MAX = __DEVLINK_SELFTEST_ATTR_MAX - 1
+};
+
+enum devlink_selftest_result {
+	DEVLINK_SELFTEST_SKIP,
+	DEVLINK_SELFTEST_PASS,
+	DEVLINK_SELFTEST_FAIL
+};
+
+enum devlink_selftest_result_attr {
+	DEVLINK_SELFTEST_ATTR_RESULT_UNSPEC,
+	DEVLINK_SELFTEST_ATTR_RESULT,		/* nested */
+	DEVLINK_SELFTEST_ATTR_TEST_ID,		/* u32, devlink_selftest_attr */
+	DEVLINK_SELFTEST_ATTR_TEST_STATUS,	/* u8, devlink_selftest_result */
+
+	__DEVLINK_SELFTEST_ATTR_RES_MAX,
+	DEVLINK_SELFTEST_ATTR_RES_MAX = __DEVLINK_SELFTEST_ATTR_RES_MAX - 1
+};
+
 /**
  * enum devlink_trap_action - Packet trap action.
  * @DEVLINK_TRAP_ACTION_DROP: Packet is dropped by the device and a copy is not
@@ -576,6 +604,7 @@ enum devlink_attr {
 	DEVLINK_ATTR_LINECARD_TYPE,		/* string */
 	DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES,	/* nested */
 
+	DEVLINK_ATTR_SELFTESTS_INFO,		/* nested */
 	/* add new attributes above here, update the policy in devlink.c */
 
 	__DEVLINK_ATTR_MAX,
-- 
2.31.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4206 bytes --]

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH iproute2-next v3 2/3] devlink: add support for running selftests
  2022-07-18  6:22   ` [PATCH iproute2-next v3 0/3] devlink: add support to run selftest Vikas Gupta
  2022-07-18  6:22     ` [PATCH iproute2-next v3 1/3] devlink: update the devlink.h Vikas Gupta
@ 2022-07-18  6:22     ` Vikas Gupta
  2022-07-18  6:22     ` [PATCH iproute2-next v3 3/3] devlink : update man page and bash-completion for new commands Vikas Gupta
  2 siblings, 0 replies; 13+ messages in thread
From: Vikas Gupta @ 2022-07-18  6:22 UTC (permalink / raw)
  To: jiri, dsahern, stephen
  Cc: kuba, netdev, edumazet, michael.chan, andrew.gospodarek, Vikas Gupta

[-- Attachment #1: Type: text/plain, Size: 11182 bytes --]

Add command and helper APIs to run selfests.
Also add a seltest for flash on the device.

Examples:
$ devlink dev selftests run pci/0000:03:00.0 test flash
pci/0000:03:00.0
      flash failed

$ devlink dev selftests show pci/0000:03:00.0
pci/0000:03:00.0
      flash

Signed-off-by: Vikas Gupta <vikas.gupta@broadcom.com>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
---
 devlink/devlink.c | 292 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 292 insertions(+)

diff --git a/devlink/devlink.c b/devlink/devlink.c
index ddf430bb..36982332 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -294,6 +294,7 @@ static void ifname_map_free(struct ifname_map *ifname_map)
 #define DL_OPT_PORT_FN_RATE_TX_MAX	BIT(49)
 #define DL_OPT_PORT_FN_RATE_NODE_NAME	BIT(50)
 #define DL_OPT_PORT_FN_RATE_PARENT	BIT(51)
+#define DL_OPT_SELFTESTS		BIT(52)
 
 struct dl_opts {
 	uint64_t present; /* flags of present items */
@@ -344,6 +345,7 @@ struct dl_opts {
 	uint32_t overwrite_mask;
 	enum devlink_reload_action reload_action;
 	enum devlink_reload_limit reload_limit;
+	bool test_ids[DEVLINK_SELFTEST_ATTR_MAX + 1];
 	uint32_t port_controller;
 	uint32_t port_sfnumber;
 	uint16_t port_flavour;
@@ -693,6 +695,7 @@ static const enum mnl_attr_data_type devlink_policy[DEVLINK_ATTR_MAX + 1] = {
 	[DEVLINK_ATTR_TRAP_POLICER_ID] = MNL_TYPE_U32,
 	[DEVLINK_ATTR_TRAP_POLICER_RATE] = MNL_TYPE_U64,
 	[DEVLINK_ATTR_TRAP_POLICER_BURST] = MNL_TYPE_U64,
+	[DEVLINK_ATTR_SELFTESTS_INFO] = MNL_TYPE_NESTED,
 };
 
 static const enum mnl_attr_data_type
@@ -1401,6 +1404,17 @@ static struct str_num_map port_fn_opstate_map[] = {
 	{ .str = NULL, }
 };
 
+static int selftests_get(const char *testname, bool *test_ids)
+{
+	if (strcmp(testname, "flash") == 0) {
+		test_ids[0] = 1;
+	} else {
+		pr_err("Unknown selftest \"%s\"\n", testname);
+		return -EINVAL;
+	}
+	return 0;
+}
+
 static int port_flavour_parse(const char *flavour, uint16_t *value)
 {
 	int num;
@@ -1490,6 +1504,7 @@ static const struct dl_args_metadata dl_args_required[] = {
 	{DL_OPT_PORT_FUNCTION_HW_ADDR, "Port function's hardware address is expected."},
 	{DL_OPT_PORT_FLAVOUR,          "Port flavour is expected."},
 	{DL_OPT_PORT_PFNUMBER,         "Port PCI PF number is expected."},
+	{DL_OPT_SELFTESTS,             "Test name is expected"},
 };
 
 static int dl_args_finding_required_validate(uint64_t o_required,
@@ -1793,6 +1808,20 @@ static int dl_argv_parse(struct dl *dl, uint64_t o_required,
 				return err;
 			o_found |= DL_OPT_FLASH_OVERWRITE;
 
+		} else if (dl_argv_match(dl, "test") &&
+				(o_all & DL_OPT_SELFTESTS)) {
+			const char *testname;
+
+			dl_arg_inc(dl);
+			err = dl_argv_str(dl, &testname);
+			if (err)
+				return err;
+			err = selftests_get(testname,
+					    opts->test_ids);
+			if (err)
+				return err;
+			o_found |= DL_OPT_SELFTESTS;
+
 		} else if (dl_argv_match(dl, "reporter") &&
 			   (o_all & DL_OPT_HEALTH_REPORTER_NAME)) {
 			dl_arg_inc(dl);
@@ -2063,6 +2092,32 @@ dl_reload_limits_put(struct nlmsghdr *nlh, const struct dl_opts *opts)
 	mnl_attr_put(nlh, DEVLINK_ATTR_RELOAD_LIMITS, sizeof(limits), &limits);
 }
 
+static void
+dl_selftests_put(struct nlmsghdr *nlh, const struct dl_opts *opts)
+{
+	bool test_sel = false;
+	struct nlattr *nest;
+	int test_id;
+
+	nest = mnl_attr_nest_start(nlh, DEVLINK_ATTR_SELFTESTS_INFO);
+
+	for (test_id = 1; test_id < DEVLINK_SELFTEST_ATTR_MAX + 1 &&
+		opts->test_ids[test_id]; test_id++) {
+		if (opts->test_ids[test_id]) {
+			test_sel = true;
+			mnl_attr_put(nlh, test_id, 0, NULL);
+		}
+	}
+
+	/* No test selcted from user, select all */
+	if (!test_sel) {
+		for (test_id = 1; test_id < DEVLINK_SELFTEST_ATTR_MAX + 1; test_id++)
+			mnl_attr_put(nlh, test_id, 0, NULL);
+	}
+
+	mnl_attr_nest_end(nlh, nest);
+}
+
 static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl)
 {
 	struct dl_opts *opts = &dl->opts;
@@ -2157,6 +2212,8 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl)
 				  opts->flash_component);
 	if (opts->present & DL_OPT_FLASH_OVERWRITE)
 		dl_flash_update_overwrite_put(nlh, opts);
+	if (opts->present & DL_OPT_SELFTESTS)
+		dl_selftests_put(nlh, opts);
 	if (opts->present & DL_OPT_HEALTH_REPORTER_NAME)
 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME,
 				  opts->reporter_name);
@@ -2285,6 +2342,8 @@ static void cmd_dev_help(void)
 	pr_err("                              [ action { driver_reinit | fw_activate } ] [ limit no_reset ]\n");
 	pr_err("       devlink dev info [ DEV ]\n");
 	pr_err("       devlink dev flash DEV file PATH [ component NAME ] [ overwrite SECTION ]\n");
+	pr_err("       devlink dev selftests show [DEV]\n");
+	pr_err("       devlink dev selftests run DEV [test TESTNAME ]\n");
 }
 
 static bool cmp_arr_last_handle(struct dl *dl, const char *bus_name,
@@ -3904,6 +3963,236 @@ err_socket:
 	return err;
 }
 
+static const char *devlink_get_selftests_name(int test_id)
+{
+	switch (test_id) {
+	case DEVLINK_SELFTEST_ATTR_FLASH:
+		return "flash";
+	default:
+		return "unknown";
+	}
+}
+
+static const enum mnl_attr_data_type
+devlink_selftests_list_policy[DEVLINK_SELFTEST_ATTR_MAX + 1] = {
+	[DEVLINK_SELFTEST_ATTR_FLASH] = MNL_TYPE_FLAG,
+};
+
+static int selftests_list_attr_cb(const struct nlattr *attr, void *data)
+{
+	const struct nlattr **tb = data;
+	int type;
+
+	if (mnl_attr_type_valid(attr, DEVLINK_SELFTEST_ATTR_MAX) < 0)
+		return MNL_CB_OK;
+
+	type = mnl_attr_get_type(attr);
+	if (mnl_attr_validate(attr, devlink_selftests_list_policy[type]) < 0)
+		return MNL_CB_ERROR;
+
+	tb[type] = attr;
+	return MNL_CB_OK;
+}
+
+static int cmd_dev_selftests_show_tests(const struct nlmsghdr *nlh, void *data)
+{
+	struct nlattr *nla_value[DEVLINK_SELFTEST_ATTR_MAX + 1] = {};
+	struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
+	struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {};
+	struct dl *dl = data;
+	int avail = 0;
+	int err;
+	int i;
+
+	mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb);
+
+	if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] ||
+	    !tb[DEVLINK_ATTR_SELFTESTS_INFO])
+		return MNL_CB_ERROR;
+
+	err = mnl_attr_parse_nested(tb[DEVLINK_ATTR_SELFTESTS_INFO],
+				    selftests_list_attr_cb, nla_value);
+	if (err != MNL_CB_OK)
+		return MNL_CB_ERROR;
+
+	for (i = 1; i < DEVLINK_SELFTEST_ATTR_MAX + 1; i++) {
+		if (!(nla_value[i]))
+			continue;
+
+		if (!avail) {
+			__pr_out_handle_start(dl, tb, true, false);
+			__pr_out_indent_inc();
+			if (!dl->json_output)
+				__pr_out_newline();
+			avail = 1;
+		}
+
+		check_indent_newline(dl);
+		print_string(PRINT_ANY, NULL, "%s", devlink_get_selftests_name(i));
+		if (!dl->json_output)
+			__pr_out_newline();
+	}
+
+	if (avail) {
+		__pr_out_indent_dec();
+		pr_out_handle_end(dl);
+	}
+
+	return MNL_CB_OK;
+}
+
+static const char *selftest_result_to_str(uint8_t res)
+{
+	switch (res) {
+	case DEVLINK_SELFTEST_SKIP:
+		return "skipped";
+	case DEVLINK_SELFTEST_PASS:
+		return "passed";
+	case DEVLINK_SELFTEST_FAIL:
+		return "failed";
+	default:
+		return "unknown";
+	}
+}
+
+static const enum mnl_attr_data_type
+devlink_selftests_result_policy[DEVLINK_SELFTEST_ATTR_RES_MAX + 1] = {
+	[DEVLINK_SELFTEST_ATTR_RESULT] = MNL_TYPE_NESTED,
+	[DEVLINK_SELFTEST_ATTR_TEST_ID] = MNL_TYPE_U32,
+	[DEVLINK_SELFTEST_ATTR_TEST_STATUS] = MNL_TYPE_U8,
+};
+
+static int selftests_result_attr_cb(const struct nlattr *attr, void *data)
+{
+	const struct nlattr **tb = data;
+	int type;
+
+	if (mnl_attr_type_valid(attr, DEVLINK_SELFTEST_ATTR_RES_MAX) < 0)
+		return MNL_CB_OK;
+
+	type = mnl_attr_get_type(attr);
+	if (mnl_attr_validate(attr, devlink_selftests_result_policy[type]) < 0)
+		return MNL_CB_ERROR;
+
+	tb[type] = attr;
+	return MNL_CB_OK;
+}
+
+static int cmd_dev_selftests_result_show(const struct nlmsghdr *nlh, void *data)
+{
+	struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
+	struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {};
+	struct nlattr *test_attr;
+	struct dl *dl = data;
+	int avail = 0;
+
+	mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb);
+
+	if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] ||
+	    !tb[DEVLINK_ATTR_SELFTESTS_INFO])
+		return MNL_CB_ERROR;
+
+	mnl_attr_for_each_nested(test_attr,
+				 tb[DEVLINK_ATTR_SELFTESTS_INFO]) {
+		struct nlattr *nla_value[DEVLINK_ATTR_MAX + 1] = {};
+		uint8_t test_res;
+		int test_id;
+		int err;
+
+		err = mnl_attr_parse_nested(test_attr,
+					    selftests_result_attr_cb, nla_value);
+		if (err != MNL_CB_OK)
+			return MNL_CB_ERROR;
+
+		if (!nla_value[DEVLINK_SELFTEST_ATTR_TEST_ID] ||
+		    !nla_value[DEVLINK_SELFTEST_ATTR_TEST_STATUS])
+			return MNL_CB_ERROR;
+
+		if (!avail) {
+			__pr_out_handle_start(dl, tb, true, false);
+			__pr_out_indent_inc();
+			avail = 1;
+			if (!dl->json_output)
+				__pr_out_newline();
+		}
+
+		test_id = mnl_attr_get_u32(nla_value[DEVLINK_SELFTEST_ATTR_TEST_ID]);
+		test_res = mnl_attr_get_u8(nla_value[DEVLINK_SELFTEST_ATTR_TEST_STATUS]);
+
+		check_indent_newline(dl);
+		print_string_name_value(devlink_get_selftests_name(test_id),
+					selftest_result_to_str(test_res));
+		if (!dl->json_output)
+			__pr_out_newline();
+	}
+
+	if (avail) {
+		__pr_out_indent_dec();
+		pr_out_handle_end(dl);
+	}
+
+	return MNL_CB_OK;
+}
+
+static int cmd_dev_selftests_run(struct dl *dl)
+{
+	struct nlmsghdr *nlh;
+	uint16_t flags = NLM_F_REQUEST | NLM_F_ACK;
+	int err;
+
+	nlh = mnlu_gen_socket_cmd_prepare(&dl->nlg, DEVLINK_CMD_SELFTESTS_RUN, flags);
+
+	err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE, DL_OPT_SELFTESTS);
+	if (err)
+		return err;
+
+	if (!(dl->opts.present & DL_OPT_SELFTESTS))
+		dl_selftests_put(nlh, &dl->opts);
+
+	err = mnlu_gen_socket_sndrcv(&dl->nlg, nlh, cmd_dev_selftests_result_show, dl);
+	return err;
+}
+
+static int cmd_dev_selftests_show(struct dl *dl)
+{
+	uint16_t flags = NLM_F_REQUEST | NLM_F_ACK;
+	struct nlmsghdr *nlh;
+	int err;
+
+	if (dl_argc(dl) == 0)
+		flags |= NLM_F_DUMP;
+
+	nlh = mnlu_gen_socket_cmd_prepare(&dl->nlg, DEVLINK_CMD_SELFTESTS_LIST, flags);
+
+	if (dl_argc(dl) > 0) {
+		err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE, 0);
+		if (err)
+			return err;
+	}
+
+	pr_out_section_start(dl, "selftests");
+	err = mnlu_gen_socket_sndrcv(&dl->nlg, nlh, cmd_dev_selftests_show_tests, dl);
+	pr_out_section_end(dl);
+	return err;
+}
+
+static int cmd_dev_selftests(struct dl *dl)
+{
+	if (dl_argv_match(dl, "help")) {
+		cmd_dev_help();
+		return 0;
+	} else if (dl_argv_match(dl, "show") ||
+		   dl_argv_match(dl, "list") || dl_no_arg(dl)) {
+		dl_arg_inc(dl);
+		return cmd_dev_selftests_show(dl);
+	} else if (dl_argv_match(dl, "run")) {
+		dl_arg_inc(dl);
+		return cmd_dev_selftests_run(dl);
+	}
+	pr_err("Command \"%s\" not found\n", dl_argv(dl));
+	return -ENOENT;
+}
+
 static int cmd_dev(struct dl *dl)
 {
 	if (dl_argv_match(dl, "help")) {
@@ -3928,6 +4217,9 @@ static int cmd_dev(struct dl *dl)
 	} else if (dl_argv_match(dl, "flash")) {
 		dl_arg_inc(dl);
 		return cmd_dev_flash(dl);
+	} else if (dl_argv_match(dl, "selftests")) {
+		dl_arg_inc(dl);
+		return cmd_dev_selftests(dl);
 	}
 	pr_err("Command \"%s\" not found\n", dl_argv(dl));
 	return -ENOENT;
-- 
2.31.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4206 bytes --]

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH iproute2-next v3 3/3] devlink : update man page and bash-completion for new commands
  2022-07-18  6:22   ` [PATCH iproute2-next v3 0/3] devlink: add support to run selftest Vikas Gupta
  2022-07-18  6:22     ` [PATCH iproute2-next v3 1/3] devlink: update the devlink.h Vikas Gupta
  2022-07-18  6:22     ` [PATCH iproute2-next v3 2/3] devlink: add support for running selftests Vikas Gupta
@ 2022-07-18  6:22     ` Vikas Gupta
  2 siblings, 0 replies; 13+ messages in thread
From: Vikas Gupta @ 2022-07-18  6:22 UTC (permalink / raw)
  To: jiri, dsahern, stephen
  Cc: kuba, netdev, edumazet, michael.chan, andrew.gospodarek, Vikas Gupta

[-- Attachment #1: Type: text/plain, Size: 2883 bytes --]

Update the man page for newly added selftests commands.
Examples:
 devlink dev selftests run pci/0000:03:00.0 test flash
 devlink dev selftests show pci/0000:03:00.0

Signed-off-by: Vikas Gupta <vikas.gupta@broadcom.com>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
---
 bash-completion/devlink | 21 +++++++++++++++++-
 man/man8/devlink-dev.8  | 47 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+), 1 deletion(-)

diff --git a/bash-completion/devlink b/bash-completion/devlink
index 361be9fe..d0d13fdf 100644
--- a/bash-completion/devlink
+++ b/bash-completion/devlink
@@ -262,6 +262,25 @@ _devlink_dev_flash()
      esac
 }
 
+# Completion for devlink dev selftests
+_devlink_dev_selftests()
+{
+    case "$cword" in
+        3)
+            COMPREPLY=( $( compgen -W "show run" -- "$cur" ) )
+            return
+            ;;
+        4)
+            _devlink_direct_complete "dev"
+            return
+            ;;
+        5)
+            COMPREPLY=( $( compgen -W "test" -- "$cur" ) )
+            return
+            ;;
+    esac
+}
+
 # Completion for devlink dev
 _devlink_dev()
 {
@@ -274,7 +293,7 @@ _devlink_dev()
             fi
             return
             ;;
-        eswitch|param)
+        eswitch|param|selftests)
             _devlink_dev_$command
             return
             ;;
diff --git a/man/man8/devlink-dev.8 b/man/man8/devlink-dev.8
index 6906e509..71a1ef18 100644
--- a/man/man8/devlink-dev.8
+++ b/man/man8/devlink-dev.8
@@ -85,6 +85,20 @@ devlink-dev \- devlink device configuration
 .I ID
 ]
 
+.ti -8
+.B devlink dev selftests show
+[
+.I DEV
+]
+
+.ti -8
+.B devlink dev selftests run
+.I DEV
+[
+.B test
+.RI "{ " TESTNAME " }"
+]
+
 .SH "DESCRIPTION"
 .SS devlink dev show - display devlink device attributes
 
@@ -249,6 +263,29 @@ should match the component names from
 .B "devlink dev info"
 and may be driver-dependent.
 
+.SS devlink dev selftests show - shows supported selftests on devlink device.
+
+.PP
+.I "DEV"
+- specifies the devlink device.
+If this argument is omitted selftests for all devlink devices are listed.
+
+.SS devlink dev selftests run - runs selftests on devlink device.
+
+.PP
+.I "DEV"
+- specifies the devlink device to execute selftests.
+
+.B test
+{
+.RI { " TESTNAME " }
+}
+- The value of
+.I TESTNAME
+should match the test names from
+.B "devlink dev selftests show".
+to execute all the selftests on the devlink device.
+
 .SH "EXAMPLES"
 .PP
 devlink dev show
@@ -296,6 +333,16 @@ Flashing 100%
 .br
 Flashing done
 .RE
+.PP
+devlink dev selftests show pci/0000:01:00.0
+.RS 4
+Shows the supported selftests by the devlink device.
+.RE
+.PP
+devlink dev selftests run pci/0000:01:00.0 test flash
+.RS 4
+Perform a flash test on the devlink device.
+.RE
 
 .SH SEE ALSO
 .BR devlink (8),
-- 
2.31.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4206 bytes --]

^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2022-07-18  6:23 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-28 16:44 [PATCH iproute2-next v1 0/2] devlink: add support to run selftests Vikas Gupta
2022-06-28 16:44 ` [PATCH iproute2-next v1 1/2] Update kernel header Vikas Gupta
2022-06-28 16:44 ` [PATCH iproute2-next v1 2/2] devlink: add support for running selftests Vikas Gupta
2022-06-29 11:37 ` [PATCH iproute2-next v1 0/2] devlink: add support to run selftests Ido Schimmel
2022-07-07 18:31 ` [PATCH iproute2-next v2 0/3] " Vikas Gupta
2022-07-07 18:31   ` [PATCH iproute2-next v2 1/3] devlink: update the devlink.h Vikas Gupta
2022-07-07 18:31   ` [PATCH iproute2-next v2 2/3] devlink: add support for running selftests Vikas Gupta
2022-07-07 18:31   ` [PATCH iproute2-next v2 3/3] devlink : update man page for new commands Vikas Gupta
2022-07-10  8:56   ` [PATCH iproute2-next v2 0/3] devlink: add support to run selftests Ido Schimmel
2022-07-18  6:22   ` [PATCH iproute2-next v3 0/3] devlink: add support to run selftest Vikas Gupta
2022-07-18  6:22     ` [PATCH iproute2-next v3 1/3] devlink: update the devlink.h Vikas Gupta
2022-07-18  6:22     ` [PATCH iproute2-next v3 2/3] devlink: add support for running selftests Vikas Gupta
2022-07-18  6:22     ` [PATCH iproute2-next v3 3/3] devlink : update man page and bash-completion for new commands Vikas Gupta

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.