Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp1271973pxb; Fri, 20 Nov 2020 05:44:11 -0800 (PST) X-Google-Smtp-Source: ABdhPJwHYTtjjb/GQnx+e7fhclxO6l604GbK7VNw+mg2HBGquJLJYMzPNK9RCpBygK6zwzqb1s35 X-Received: by 2002:a17:906:1e93:: with SMTP id e19mr11911864ejj.440.1605879851001; Fri, 20 Nov 2020 05:44:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1605879850; cv=none; d=google.com; s=arc-20160816; b=RkSiJZfDnQ6fppEK5G6P9HFcTYECWu7QdeCmC6LVMdt9j2PRs8s4NN6NRuj59Ft3Ou RLTzZjvZnsQ/pc/APX3ZwJU8aWYyMsUqzR/a6YTsgml5rtBgZ1144lgfKqb/M5Iwf5qc 6fOPEA8F441CvmUF75uxdCyLuLChIw36M5sofa8cGFX/ZVYC/uLxWA0CRnXTgxz5AnpD /PA0CBOezLXnHd8WpdYlYLbPUkW67icVldrq45+Sgaw5AdIDY1/2H81r8pFFyG9Za9si P3tB6JoRUeW16OLL0eOe7EAVAHI8QPoixvQGJ7+CDaLyuxmlbXsFqRtQGbbfMyUxaq5l jx/A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from; bh=kMADyJMfz4+CVr4Sr23z9ONfLckqGFkjRM9aWbW71e0=; b=yUbXzbHJtBQFuG/UBiCfPMg5QIOAWegjG/6/H2y2WboMa3NVtC/wte3JMZ+8RiMESn Dc9w5kUkt15tKFalmc6BQgLvOpf6WYoKjEx5+TpL0vtlU8ZrMxlcj7+zImMLfUdvEted 4v5WRcteVG4lFrlnjDIlcpvRL4dwRdkEjbdLAVhdm9j8RqYxxDxvSIRmtj+fyLiogVi6 SzOaXw59vcEJzFvVD5Ou8vEf1ESFF9LmxpEp/SrYJcWEKJAnFJQlVTroJvNAME3TA9K+ +CbtPiSx5n29qWLwq3eZGG8fXAX84qPBYDYhYJXHg3k57kQMihu9aAvvbVs+FKGtKrp+ xtOA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mellanox.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id gs24si1631214ejb.74.2020.11.20.05.43.46; Fri, 20 Nov 2020 05:44:10 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mellanox.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727983AbgKTNkx (ORCPT + 99 others); Fri, 20 Nov 2020 08:40:53 -0500 Received: from mail-il-dmz.mellanox.com ([193.47.165.129]:60956 "EHLO mellanox.co.il" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725789AbgKTNkw (ORCPT ); Fri, 20 Nov 2020 08:40:52 -0500 Received: from Internal Mail-Server by MTLPINE1 (envelope-from moshe@mellanox.com) with SMTP; 20 Nov 2020 15:40:46 +0200 Received: from vnc1.mtl.labs.mlnx (vnc1.mtl.labs.mlnx [10.7.2.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 0AKDekKo029539; Fri, 20 Nov 2020 15:40:46 +0200 Received: from vnc1.mtl.labs.mlnx (localhost [127.0.0.1]) by vnc1.mtl.labs.mlnx (8.14.4/8.14.4) with ESMTP id 0AKDejTi006178; Fri, 20 Nov 2020 15:40:45 +0200 Received: (from moshe@localhost) by vnc1.mtl.labs.mlnx (8.14.4/8.14.4/Submit) id 0AKDeh0O006172; Fri, 20 Nov 2020 15:40:43 +0200 From: Moshe Shemesh To: "David S. Miller" , Jakub Kicinski Cc: Jiri Pirko , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Moshe Shemesh Subject: [PATCH net] devlink: Fix reload stats structure Date: Fri, 20 Nov 2020 15:40:37 +0200 Message-Id: <1605879637-6114-1-git-send-email-moshe@mellanox.com> X-Mailer: git-send-email 1.8.4.3 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Fix reload stats structure exposed to the user. Change stats structure hierarchy to have the reload action as a parent of the stat entry and then stat entry includes value per limit. This will also help to avoid string concatenation on iproute2 output. Reload stats structure before this fix: "stats": { "reload": { "driver_reinit": 2, "fw_activate": 1, "fw_activate_no_reset": 0 } } After this fix: "stats": { "reload": { "driver_reinit": { "unspecified": 2 }, "fw_activate": { "unspecified": 1, "no_reset": 0 } } Fixes: a254c264267e ("devlink: Add reload stats") Signed-off-by: Moshe Shemesh Reviewed-by: Jiri Pirko --- include/uapi/linux/devlink.h | 2 ++ net/core/devlink.c | 48 +++++++++++++++++++++++------------- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index 0113bc4db9f5..5203f54a2be1 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -526,6 +526,8 @@ enum devlink_attr { DEVLINK_ATTR_RELOAD_STATS_LIMIT, /* u8 */ DEVLINK_ATTR_RELOAD_STATS_VALUE, /* u32 */ DEVLINK_ATTR_REMOTE_RELOAD_STATS, /* nested */ + DEVLINK_ATTR_RELOAD_ACTION_INFO, /* nested */ + DEVLINK_ATTR_RELOAD_ACTION_STATS, /* nested */ /* add new attributes above here, update the policy in devlink.c */ diff --git a/net/core/devlink.c b/net/core/devlink.c index ab4b1368904f..34d38abd74ee 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -517,8 +517,7 @@ devlink_reload_limit_is_supported(struct devlink *devlink, enum devlink_reload_l return test_bit(limit, &devlink->ops->reload_limits); } -static int devlink_reload_stat_put(struct sk_buff *msg, enum devlink_reload_action action, - enum devlink_reload_limit limit, u32 value) +static int devlink_reload_stat_put(struct sk_buff *msg, enum devlink_reload_limit limit, u32 value) { struct nlattr *reload_stats_entry; @@ -526,8 +525,7 @@ static int devlink_reload_stat_put(struct sk_buff *msg, enum devlink_reload_acti if (!reload_stats_entry) return -EMSGSIZE; - if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_ACTION, action) || - nla_put_u8(msg, DEVLINK_ATTR_RELOAD_STATS_LIMIT, limit) || + if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_STATS_LIMIT, limit) || nla_put_u32(msg, DEVLINK_ATTR_RELOAD_STATS_VALUE, value)) goto nla_put_failure; nla_nest_end(msg, reload_stats_entry); @@ -540,7 +538,7 @@ static int devlink_reload_stat_put(struct sk_buff *msg, enum devlink_reload_acti static int devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink, bool is_remote) { - struct nlattr *reload_stats_attr; + struct nlattr *reload_stats_attr, *action_info_attr, *action_stats_attr; int i, j, stat_idx; u32 value; @@ -552,17 +550,27 @@ static int devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink if (!reload_stats_attr) return -EMSGSIZE; - for (j = 0; j <= DEVLINK_RELOAD_LIMIT_MAX; j++) { - /* Remote stats are shown even if not locally supported. Stats - * of actions with unspecified limit are shown though drivers - * don't need to register unspecified limit. - */ - if (!is_remote && j != DEVLINK_RELOAD_LIMIT_UNSPEC && - !devlink_reload_limit_is_supported(devlink, j)) + for (i = 0; i <= DEVLINK_RELOAD_ACTION_MAX; i++) { + if ((!is_remote && !devlink_reload_action_is_supported(devlink, i)) || + i == DEVLINK_RELOAD_ACTION_UNSPEC) continue; - for (i = 0; i <= DEVLINK_RELOAD_ACTION_MAX; i++) { - if ((!is_remote && !devlink_reload_action_is_supported(devlink, i)) || - i == DEVLINK_RELOAD_ACTION_UNSPEC || + action_info_attr = nla_nest_start(msg, DEVLINK_ATTR_RELOAD_ACTION_INFO); + if (!action_info_attr) + goto nla_put_failure; + + if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_ACTION, i)) + goto action_info_nest_cancel; + action_stats_attr = nla_nest_start(msg, DEVLINK_ATTR_RELOAD_ACTION_STATS); + if (!action_stats_attr) + goto action_info_nest_cancel; + + for (j = 0; j <= DEVLINK_RELOAD_LIMIT_MAX; j++) { + /* Remote stats are shown even if not locally supported. Stats + * of actions with unspecified limit are shown though drivers + * don't need to register unspecified limit. + */ + if ((!is_remote && j != DEVLINK_RELOAD_LIMIT_UNSPEC && + !devlink_reload_limit_is_supported(devlink, j)) || devlink_reload_combination_is_invalid(i, j)) continue; @@ -571,13 +579,19 @@ static int devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink value = devlink->stats.reload_stats[stat_idx]; else value = devlink->stats.remote_reload_stats[stat_idx]; - if (devlink_reload_stat_put(msg, i, j, value)) - goto nla_put_failure; + if (devlink_reload_stat_put(msg, j, value)) + goto action_stats_nest_cancel; } + nla_nest_end(msg, action_stats_attr); + nla_nest_end(msg, action_info_attr); } nla_nest_end(msg, reload_stats_attr); return 0; +action_stats_nest_cancel: + nla_nest_cancel(msg, action_stats_attr); +action_info_nest_cancel: + nla_nest_cancel(msg, action_info_attr); nla_put_failure: nla_nest_cancel(msg, reload_stats_attr); return -EMSGSIZE; -- 2.18.2