e286869b24
- Why I did it 1. Update Mellanox HW-MGMT package to newer version V.7.0030.1011 2. Replace the SONiC PMON Thermal control algorithm with the one inside the HW-MGMT package on all Nvidia platforms 3. Support Spectrum-4 systems - How I did it 1. Update the HW-MGMT package version number and submodule pointer 2. Remove the thermal control algorithm implementation from Mellanox platform API 3. Revise the patch to HW-MGMT package which will disable HW-MGMT from running on SIMX 4. Update the downstream kernel patch list Signed-off-by: Kebo Liu <kebol@nvidia.com>
247 lines
7.0 KiB
Diff
247 lines
7.0 KiB
Diff
From 13e29cf4f38755ae717615071b07cd438e8819e6 Mon Sep 17 00:00:00 2001
|
|
From: Jiri Pirko <jiri@nvidia.com>
|
|
Date: Fri, 19 Feb 2021 09:36:15 +0100
|
|
Subject: [PATCH backport 5.10 129/182] devlink: introduce linecard info get
|
|
message
|
|
|
|
Allow the driver to provide per line card info get op to fill-up info,
|
|
similar to the "devlink dev info".
|
|
|
|
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
|
|
---
|
|
include/net/devlink.h | 7 +-
|
|
include/uapi/linux/devlink.h | 3 +
|
|
net/core/devlink.c | 135 +++++++++++++++++++++++++++++++++--
|
|
3 files changed, 140 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/include/net/devlink.h b/include/net/devlink.h
|
|
index 3d4ceb2902b8..059bed6aef3c 100644
|
|
--- a/include/net/devlink.h
|
|
+++ b/include/net/devlink.h
|
|
@@ -162,6 +162,8 @@ struct devlink_linecard {
|
|
bool active;
|
|
};
|
|
|
|
+struct devlink_info_req;
|
|
+
|
|
/**
|
|
* struct devlink_linecard_ops - Linecard operations
|
|
* @provision: callback to provision the linecard slot with certain
|
|
@@ -170,6 +172,7 @@ struct devlink_linecard {
|
|
* @types_init: callback to initialize types list
|
|
* @types_fini: callback to finalize types list
|
|
* @types_get: callback to get next type in list
|
|
+ * @info_get: callback to get linecard info
|
|
*/
|
|
struct devlink_linecard_ops {
|
|
int (*provision)(struct devlink_linecard *linecard, void *priv,
|
|
@@ -182,6 +185,9 @@ struct devlink_linecard_ops {
|
|
void (*types_get)(struct devlink_linecard *linecard,
|
|
void *priv, unsigned int index, const char **type,
|
|
const void **type_priv);
|
|
+ int (*info_get)(struct devlink_linecard *linecard, void *priv,
|
|
+ struct devlink_info_req *req,
|
|
+ struct netlink_ext_ack *extack);
|
|
};
|
|
|
|
struct devlink_sb_pool_info {
|
|
@@ -630,7 +636,6 @@ struct devlink_flash_update_params {
|
|
#define DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK BIT(1)
|
|
|
|
struct devlink_region;
|
|
-struct devlink_info_req;
|
|
|
|
/**
|
|
* struct devlink_region_ops - Region operations
|
|
diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
|
|
index 5ace55666d27..2c9f7d584b48 100644
|
|
--- a/include/uapi/linux/devlink.h
|
|
+++ b/include/uapi/linux/devlink.h
|
|
@@ -136,6 +136,8 @@ enum devlink_command {
|
|
DEVLINK_CMD_LINECARD_NEW,
|
|
DEVLINK_CMD_LINECARD_DEL,
|
|
|
|
+ DEVLINK_CMD_LINECARD_INFO_GET, /* can dump */
|
|
+
|
|
/* add new commands above here */
|
|
__DEVLINK_CMD_MAX,
|
|
DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1
|
|
@@ -566,6 +568,7 @@ enum devlink_attr {
|
|
DEVLINK_ATTR_LINECARD_STATE, /* u8 */
|
|
DEVLINK_ATTR_LINECARD_TYPE, /* string */
|
|
DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES, /* nested */
|
|
+ DEVLINK_ATTR_LINECARD_INFO, /* 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 b43e93ccc672..04f8038f8e23 100644
|
|
--- a/net/core/devlink.c
|
|
+++ b/net/core/devlink.c
|
|
@@ -1245,6 +1245,10 @@ struct devlink_linecard_type {
|
|
const void *priv;
|
|
};
|
|
|
|
+struct devlink_info_req {
|
|
+ struct sk_buff *msg;
|
|
+};
|
|
+
|
|
static int devlink_nl_linecard_fill(struct sk_buff *msg,
|
|
struct devlink *devlink,
|
|
struct devlink_linecard *linecard,
|
|
@@ -1542,6 +1546,125 @@ static int devlink_nl_cmd_linecard_set_doit(struct sk_buff *skb,
|
|
return 0;
|
|
}
|
|
|
|
+static int
|
|
+devlink_nl_linecard_info_fill(struct sk_buff *msg, struct devlink *devlink,
|
|
+ struct devlink_linecard *linecard,
|
|
+ enum devlink_command cmd, u32 portid,
|
|
+ u32 seq, int flags, struct netlink_ext_ack *extack)
|
|
+{
|
|
+ struct devlink_info_req req;
|
|
+ struct nlattr *attr;
|
|
+ void *hdr;
|
|
+ int err;
|
|
+
|
|
+ hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd);
|
|
+ if (!hdr)
|
|
+ return -EMSGSIZE;
|
|
+
|
|
+ err = -EMSGSIZE;
|
|
+ if (devlink_nl_put_handle(msg, devlink))
|
|
+ goto nla_put_failure;
|
|
+ if (nla_put_u32(msg, DEVLINK_ATTR_LINECARD_INDEX, linecard->index))
|
|
+ goto nla_put_failure;
|
|
+
|
|
+ attr = nla_nest_start(msg, DEVLINK_ATTR_LINECARD_INFO);
|
|
+ if (!attr)
|
|
+ goto nla_put_failure;
|
|
+ req.msg = msg;
|
|
+ err = linecard->ops->info_get(linecard, linecard->priv, &req, extack);
|
|
+ if (err)
|
|
+ goto nla_put_failure;
|
|
+ nla_nest_end(msg, attr);
|
|
+
|
|
+ genlmsg_end(msg, hdr);
|
|
+ return 0;
|
|
+
|
|
+nla_put_failure:
|
|
+ genlmsg_cancel(msg, hdr);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+static int devlink_nl_cmd_linecard_info_get_doit(struct sk_buff *skb,
|
|
+ struct genl_info *info)
|
|
+{
|
|
+ struct devlink_linecard *linecard = info->user_ptr[1];
|
|
+ struct devlink *devlink = linecard->devlink;
|
|
+ struct sk_buff *msg;
|
|
+ int err;
|
|
+
|
|
+ if (!linecard->ops->info_get)
|
|
+ return -EOPNOTSUPP;
|
|
+
|
|
+ msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
|
+ if (!msg)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ err = devlink_nl_linecard_info_fill(msg, devlink, linecard,
|
|
+ DEVLINK_CMD_LINECARD_INFO_GET,
|
|
+ info->snd_portid, info->snd_seq, 0,
|
|
+ info->extack);
|
|
+ if (err) {
|
|
+ nlmsg_free(msg);
|
|
+ return err;
|
|
+ }
|
|
+
|
|
+ return genlmsg_reply(msg, info);
|
|
+}
|
|
+
|
|
+static int devlink_nl_cmd_linecard_info_get_dumpit(struct sk_buff *msg,
|
|
+ struct netlink_callback *cb)
|
|
+{
|
|
+ struct devlink_linecard *linecard;
|
|
+ struct devlink *devlink;
|
|
+ int start = cb->args[0];
|
|
+ unsigned long index;
|
|
+ int idx = 0;
|
|
+ int err = 0;
|
|
+
|
|
+ mutex_lock(&devlink_mutex);
|
|
+ xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) {
|
|
+ if (!devlink_try_get(devlink))
|
|
+ continue;
|
|
+
|
|
+ if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
|
|
+ goto retry;
|
|
+
|
|
+ mutex_lock(&devlink->linecards_lock);
|
|
+ list_for_each_entry(linecard, &devlink->linecard_list, list) {
|
|
+ if (idx < start || !linecard->ops->info_get) {
|
|
+ idx++;
|
|
+ continue;
|
|
+ }
|
|
+ mutex_lock(&linecard->state_lock);
|
|
+ err = devlink_nl_linecard_info_fill(msg, devlink, linecard,
|
|
+ DEVLINK_CMD_LINECARD_INFO_GET,
|
|
+ NETLINK_CB(cb->skb).portid,
|
|
+ cb->nlh->nlmsg_seq,
|
|
+ NLM_F_MULTI,
|
|
+ cb->extack);
|
|
+ mutex_unlock(&linecard->state_lock);
|
|
+ if (err) {
|
|
+ mutex_unlock(&devlink->linecards_lock);
|
|
+ devlink_put(devlink);
|
|
+ goto out;
|
|
+ }
|
|
+ idx++;
|
|
+ }
|
|
+ mutex_unlock(&devlink->linecards_lock);
|
|
+retry:
|
|
+ devlink_put(devlink);
|
|
+ }
|
|
+out:
|
|
+ mutex_unlock(&devlink_mutex);
|
|
+
|
|
+ if (err != -EMSGSIZE)
|
|
+ return err;
|
|
+
|
|
+ cb->args[0] = idx;
|
|
+ return msg->len;
|
|
+}
|
|
+
|
|
+
|
|
static int devlink_nl_sb_fill(struct sk_buff *msg, struct devlink *devlink,
|
|
struct devlink_sb *devlink_sb,
|
|
enum devlink_command cmd, u32 portid,
|
|
@@ -5455,10 +5578,6 @@ static int devlink_nl_cmd_region_read_dumpit(struct sk_buff *skb,
|
|
return err;
|
|
}
|
|
|
|
-struct devlink_info_req {
|
|
- struct sk_buff *msg;
|
|
-};
|
|
-
|
|
int devlink_info_driver_name_put(struct devlink_info_req *req, const char *name)
|
|
{
|
|
return nla_put_string(req->msg, DEVLINK_ATTR_INFO_DRIVER_NAME, name);
|
|
@@ -8057,6 +8176,14 @@ static const struct genl_small_ops devlink_nl_ops[] = {
|
|
.internal_flags = DEVLINK_NL_FLAG_NEED_LINECARD |
|
|
DEVLINK_NL_FLAG_NO_LOCK,
|
|
},
|
|
+ {
|
|
+ .cmd = DEVLINK_CMD_LINECARD_INFO_GET,
|
|
+ .doit = devlink_nl_cmd_linecard_info_get_doit,
|
|
+ .dumpit = devlink_nl_cmd_linecard_info_get_dumpit,
|
|
+ .internal_flags = DEVLINK_NL_FLAG_NEED_LINECARD |
|
|
+ DEVLINK_NL_FLAG_NO_LOCK,
|
|
+ /* can be retrieved by unprivileged users */
|
|
+ },
|
|
{
|
|
.cmd = DEVLINK_CMD_SB_GET,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
--
|
|
2.20.1
|
|
|