2022-11-29 00:11:40

by Vincent MAILHOL

[permalink] [raw]
Subject: [PATCH net-next v5 0/4] net: devlink: return the driver name in devlink_nl_info_fill

The driver name is available in device_driver::name. Right now,
drivers still have to report this piece of information themselves in
their devlink_ops::info_get callback function.

The goal of this series is to have the devlink core to report this
information instead of the drivers.

The first patch fulfills the actual goal of this series: modify
devlink core to report the driver name and clean-up all drivers. Both
have to be done in an atomic change to avoid attribute duplication.

The second patch removes the devlink_info_driver_name_put() function
to prevent future drivers from reporting the driver name themselves.

The third patch allows the core to call devlink_nl_info_fill() even if
the devlink_ops::info_get() callback is NULL. This leads to the fourth
and final patch which cleans up the drivers which have an empty
info_get().
---
* Changelog *

v4 -> v5

* [PATCH 1/4] add Tested-by: Ido Schimmel tag.

* split patch 3/3 in two patches.

v3 -> v4

* Ido pointed out that the mlxsw did not need to be fixed:
https://lore.kernel.org/netdev/Y4ONgD4dAj8yU2%2F+@shredder/
Remove the first two patches from the series.

v2 -> v3

* [PATCH 3/5] remove the call to devlink_info_driver_name_put() in
mlxsw driver as well (this was missing in v2, making the build
fail... sorry for the noise).

* add additional people in CC as pointed by netdev patchwork CI:
https://patchwork.kernel.org/project/netdevbpf/list/?series=699451

* use the "Link:" prefix before URL to silence checkpatch's line
length warning.


RFC v1 -> v2

* drop the RFC tag

* big rework following the discussion on RFC:
https://lore.kernel.org/netdev/[email protected]/
Went from one patch to a series of five patches:

* drop the idea to report the USB serial number following Greg's
comment:
https://lore.kernel.org/linux-usb/Y3+VfNdt%[email protected]/

Vincent Mailhol (4):
net: devlink: let the core report the driver name instead of the
drivers
net: devlink: remove devlink_info_driver_name_put()
net: devlink: make the devlink_ops::info_get() callback optional
net: devlink: clean-up empty devlink_ops::info_get()

.../marvell/octeontx2/otx2_cpt_devlink.c | 4 ---
drivers/net/dsa/hirschmann/hellcreek.c | 5 ---
drivers/net/dsa/mv88e6xxx/devlink.c | 5 ---
drivers/net/dsa/sja1105/sja1105_devlink.c | 12 ++-----
.../net/ethernet/broadcom/bnxt/bnxt_devlink.c | 4 ---
.../freescale/dpaa2/dpaa2-eth-devlink.c | 11 +-----
.../ethernet/fungible/funeth/funeth_devlink.c | 7 ----
.../hisilicon/hns3/hns3pf/hclge_devlink.c | 5 ---
.../hisilicon/hns3/hns3vf/hclgevf_devlink.c | 5 ---
drivers/net/ethernet/intel/ice/ice_devlink.c | 6 ----
.../marvell/octeontx2/af/rvu_devlink.c | 7 ----
.../marvell/octeontx2/nic/otx2_devlink.c | 15 --------
.../marvell/prestera/prestera_devlink.c | 5 ---
.../net/ethernet/mellanox/mlx5/core/devlink.c | 4 ---
drivers/net/ethernet/mellanox/mlxsw/core.c | 5 ---
.../net/ethernet/netronome/nfp/nfp_devlink.c | 4 ---
.../ethernet/pensando/ionic/ionic_devlink.c | 4 ---
drivers/net/ethernet/qlogic/qed/qed_devlink.c | 4 ---
drivers/net/netdevsim/dev.c | 3 --
drivers/ptp/ptp_ocp.c | 4 ---
include/net/devlink.h | 2 --
net/core/devlink.c | 35 ++++++++++++-------
22 files changed, 26 insertions(+), 130 deletions(-)

--
2.25.1


2022-11-29 00:11:58

by Vincent MAILHOL

[permalink] [raw]
Subject: [PATCH net-next v5 1/4] net: devlink: let the core report the driver name instead of the drivers

The driver name is available in device_driver::name. Right now,
drivers still have to report this piece of information themselves in
their devlink_ops::info_get callback function.

In order to factorize code, make devlink_nl_info_fill() add the driver
name attribute.

nla_put() does not check if an attribute already exists and
unconditionally reserves new space [1]. To avoid attribute
duplication, clean-up all the drivers which are currently reporting
the driver name in their callback.

[1] __nla_put from lib/nlattr.c
Link: https://elixir.bootlin.com/linux/v6.0/source/lib/nlattr.c#L993

Signed-off-by: Vincent Mailhol <[email protected]>
Tested-by: Ido Schimmel <[email protected]> # mlxsw
---
.../crypto/marvell/octeontx2/otx2_cpt_devlink.c | 4 ----
drivers/net/dsa/hirschmann/hellcreek.c | 5 -----
drivers/net/dsa/mv88e6xxx/devlink.c | 5 -----
drivers/net/dsa/sja1105/sja1105_devlink.c | 12 +++---------
.../net/ethernet/broadcom/bnxt/bnxt_devlink.c | 4 ----
.../freescale/dpaa2/dpaa2-eth-devlink.c | 11 +----------
.../ethernet/fungible/funeth/funeth_devlink.c | 2 +-
.../hisilicon/hns3/hns3pf/hclge_devlink.c | 5 -----
.../hisilicon/hns3/hns3vf/hclgevf_devlink.c | 5 -----
drivers/net/ethernet/intel/ice/ice_devlink.c | 6 ------
.../ethernet/marvell/octeontx2/af/rvu_devlink.c | 2 +-
.../marvell/octeontx2/nic/otx2_devlink.c | 9 +--------
.../marvell/prestera/prestera_devlink.c | 5 -----
.../net/ethernet/mellanox/mlx5/core/devlink.c | 4 ----
drivers/net/ethernet/mellanox/mlxsw/core.c | 5 -----
.../net/ethernet/netronome/nfp/nfp_devlink.c | 4 ----
.../net/ethernet/pensando/ionic/ionic_devlink.c | 4 ----
drivers/net/ethernet/qlogic/qed/qed_devlink.c | 4 ----
drivers/net/netdevsim/dev.c | 3 ---
drivers/ptp/ptp_ocp.c | 4 ----
net/core/devlink.c | 17 +++++++++++++++++
21 files changed, 24 insertions(+), 96 deletions(-)

diff --git a/drivers/crypto/marvell/octeontx2/otx2_cpt_devlink.c b/drivers/crypto/marvell/octeontx2/otx2_cpt_devlink.c
index 7503f6b18ac5..a2aba0b0d68a 100644
--- a/drivers/crypto/marvell/octeontx2/otx2_cpt_devlink.c
+++ b/drivers/crypto/marvell/octeontx2/otx2_cpt_devlink.c
@@ -76,10 +76,6 @@ static int otx2_cpt_devlink_info_get(struct devlink *dl,
struct otx2_cptpf_dev *cptpf = cpt_dl->cptpf;
int err;

- err = devlink_info_driver_name_put(req, "rvu_cptpf");
- if (err)
- return err;
-
err = otx2_cpt_dl_info_firmware_version_put(req, cptpf->eng_grps.grp,
"fw.ae", OTX2_CPT_AE_TYPES);
if (err)
diff --git a/drivers/net/dsa/hirschmann/hellcreek.c b/drivers/net/dsa/hirschmann/hellcreek.c
index 951f7935c872..595a548bb0a8 100644
--- a/drivers/net/dsa/hirschmann/hellcreek.c
+++ b/drivers/net/dsa/hirschmann/hellcreek.c
@@ -1176,11 +1176,6 @@ static int hellcreek_devlink_info_get(struct dsa_switch *ds,
struct netlink_ext_ack *extack)
{
struct hellcreek *hellcreek = ds->priv;
- int ret;
-
- ret = devlink_info_driver_name_put(req, "hellcreek");
- if (ret)
- return ret;

return devlink_info_version_fixed_put(req,
DEVLINK_INFO_VERSION_GENERIC_ASIC_ID,
diff --git a/drivers/net/dsa/mv88e6xxx/devlink.c b/drivers/net/dsa/mv88e6xxx/devlink.c
index 1266eabee086..a08dab75e0c0 100644
--- a/drivers/net/dsa/mv88e6xxx/devlink.c
+++ b/drivers/net/dsa/mv88e6xxx/devlink.c
@@ -821,11 +821,6 @@ int mv88e6xxx_devlink_info_get(struct dsa_switch *ds,
struct netlink_ext_ack *extack)
{
struct mv88e6xxx_chip *chip = ds->priv;
- int err;
-
- err = devlink_info_driver_name_put(req, "mv88e6xxx");
- if (err)
- return err;

return devlink_info_version_fixed_put(req,
DEVLINK_INFO_VERSION_GENERIC_ASIC_ID,
diff --git a/drivers/net/dsa/sja1105/sja1105_devlink.c b/drivers/net/dsa/sja1105/sja1105_devlink.c
index 10c6fea1227f..da532614f34a 100644
--- a/drivers/net/dsa/sja1105/sja1105_devlink.c
+++ b/drivers/net/dsa/sja1105/sja1105_devlink.c
@@ -120,16 +120,10 @@ int sja1105_devlink_info_get(struct dsa_switch *ds,
struct netlink_ext_ack *extack)
{
struct sja1105_private *priv = ds->priv;
- int rc;
-
- rc = devlink_info_driver_name_put(req, "sja1105");
- if (rc)
- return rc;

- rc = devlink_info_version_fixed_put(req,
- DEVLINK_INFO_VERSION_GENERIC_ASIC_ID,
- priv->info->name);
- return rc;
+ return devlink_info_version_fixed_put(req,
+ DEVLINK_INFO_VERSION_GENERIC_ASIC_ID,
+ priv->info->name);
}

int sja1105_devlink_setup(struct dsa_switch *ds)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
index 8a6f788f6294..26913dc816d3 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
@@ -892,10 +892,6 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
u32 ver = 0;
int rc;

- rc = devlink_info_driver_name_put(req, DRV_MODULE_NAME);
- if (rc)
- return rc;
-
if (BNXT_PF(bp) && (bp->flags & BNXT_FLAG_DSN_VALID)) {
sprintf(buf, "%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X",
bp->dsn[7], bp->dsn[6], bp->dsn[5], bp->dsn[4],
diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth-devlink.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth-devlink.c
index 5c6dd3029e2f..76f808d38066 100644
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth-devlink.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth-devlink.c
@@ -37,18 +37,9 @@ static int dpaa2_eth_dl_info_get(struct devlink *devlink,
struct dpaa2_eth_devlink_priv *dl_priv = devlink_priv(devlink);
struct dpaa2_eth_priv *priv = dl_priv->dpaa2_priv;
char buf[10];
- int err;
-
- err = devlink_info_driver_name_put(req, KBUILD_MODNAME);
- if (err)
- return err;

scnprintf(buf, 10, "%d.%d", priv->dpni_ver_major, priv->dpni_ver_minor);
- err = devlink_info_version_running_put(req, "dpni", buf);
- if (err)
- return err;
-
- return 0;
+ return devlink_info_version_running_put(req, "dpni", buf);
}

static struct dpaa2_eth_trap_item *
diff --git a/drivers/net/ethernet/fungible/funeth/funeth_devlink.c b/drivers/net/ethernet/fungible/funeth/funeth_devlink.c
index d50c222948b4..6668375edff6 100644
--- a/drivers/net/ethernet/fungible/funeth/funeth_devlink.c
+++ b/drivers/net/ethernet/fungible/funeth/funeth_devlink.c
@@ -6,7 +6,7 @@
static int fun_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
struct netlink_ext_ack *extack)
{
- return devlink_info_driver_name_put(req, KBUILD_MODNAME);
+ return 0;
}

static const struct devlink_ops fun_dl_ops = {
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c
index 4c441e6a5082..3d3b69605423 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c
@@ -13,11 +13,6 @@ static int hclge_devlink_info_get(struct devlink *devlink,
struct hclge_devlink_priv *priv = devlink_priv(devlink);
char version_str[HCLGE_DEVLINK_FW_STRING_LEN];
struct hclge_dev *hdev = priv->hdev;
- int ret;
-
- ret = devlink_info_driver_name_put(req, KBUILD_MODNAME);
- if (ret)
- return ret;

snprintf(version_str, sizeof(version_str), "%lu.%lu.%lu.%lu",
hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE3_MASK,
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.c
index fdc19868b818..a6c3c5e8f0ab 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.c
@@ -13,11 +13,6 @@ static int hclgevf_devlink_info_get(struct devlink *devlink,
struct hclgevf_devlink_priv *priv = devlink_priv(devlink);
char version_str[HCLGEVF_DEVLINK_FW_STRING_LEN];
struct hclgevf_dev *hdev = priv->hdev;
- int ret;
-
- ret = devlink_info_driver_name_put(req, KBUILD_MODNAME);
- if (ret)
- return ret;

snprintf(version_str, sizeof(version_str), "%lu.%lu.%lu.%lu",
hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE3_MASK,
diff --git a/drivers/net/ethernet/intel/ice/ice_devlink.c b/drivers/net/ethernet/intel/ice/ice_devlink.c
index 1d638216484d..ba74977e75dc 100644
--- a/drivers/net/ethernet/intel/ice/ice_devlink.c
+++ b/drivers/net/ethernet/intel/ice/ice_devlink.c
@@ -311,12 +311,6 @@ static int ice_devlink_info_get(struct devlink *devlink,
}
}

- err = devlink_info_driver_name_put(req, KBUILD_MODNAME);
- if (err) {
- NL_SET_ERR_MSG_MOD(extack, "Unable to set driver name");
- goto out_free_ctx;
- }
-
ice_info_get_dsn(pf, ctx);

err = devlink_info_serial_number_put(req, ctx->buf);
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c
index 88dee589cb21..f15439d26d21 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c
@@ -1550,7 +1550,7 @@ static int rvu_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
static int rvu_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
struct netlink_ext_ack *extack)
{
- return devlink_info_driver_name_put(req, DRV_NAME);
+ return 0;
}

static const struct devlink_ops rvu_devlink_ops = {
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c
index 777a27047c8e..5cc6416cf1a6 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c
@@ -77,18 +77,11 @@ static const struct devlink_param otx2_dl_params[] = {
otx2_dl_mcam_count_validate),
};

-/* Devlink OPs */
static int otx2_devlink_info_get(struct devlink *devlink,
struct devlink_info_req *req,
struct netlink_ext_ack *extack)
{
- struct otx2_devlink *otx2_dl = devlink_priv(devlink);
- struct otx2_nic *pfvf = otx2_dl->pfvf;
-
- if (is_otx2_vf(pfvf->pcifunc))
- return devlink_info_driver_name_put(req, "rvu_nicvf");
-
- return devlink_info_driver_name_put(req, "rvu_nicpf");
+ return 0;
}

static const struct devlink_ops otx2_devlink_ops = {
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_devlink.c b/drivers/net/ethernet/marvell/prestera/prestera_devlink.c
index 84ad05c9f12d..2a4c9df4eb79 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_devlink.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_devlink.c
@@ -355,11 +355,6 @@ static int prestera_dl_info_get(struct devlink *dl,
{
struct prestera_switch *sw = devlink_priv(dl);
char buf[16];
- int err;
-
- err = devlink_info_driver_name_put(req, PRESTERA_DRV_NAME);
- if (err)
- return err;

snprintf(buf, sizeof(buf), "%d.%d.%d",
sw->dev->fw_rev.maj,
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
index cc2ae427dcb0..751bc4a9edcf 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
@@ -46,10 +46,6 @@ mlx5_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
u32 running_fw, stored_fw;
int err;

- err = devlink_info_driver_name_put(req, KBUILD_MODNAME);
- if (err)
- return err;
-
err = devlink_info_version_fixed_put(req, "fw.psid", dev->board_id);
if (err)
return err;
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c
index a83f6bc30072..a0a06e2eff82 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
@@ -1459,11 +1459,6 @@ mlxsw_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
char buf[32];
int err;

- err = devlink_info_driver_name_put(req,
- mlxsw_core->bus_info->device_kind);
- if (err)
- return err;
-
mlxsw_reg_mgir_pack(mgir_pl);
err = mlxsw_reg_query(mlxsw_core, MLXSW_REG(mgir), mgir_pl);
if (err)
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
index 8bfd48d50ef0..4c601ff09cd3 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
@@ -239,10 +239,6 @@ nfp_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
char *buf = NULL;
int err;

- err = devlink_info_driver_name_put(req, "nfp");
- if (err)
- return err;
-
vendor = nfp_hwinfo_lookup(pf->hwinfo, "assembly.vendor");
part = nfp_hwinfo_lookup(pf->hwinfo, "assembly.partno");
sn = nfp_hwinfo_lookup(pf->hwinfo, "assembly.serial");
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_devlink.c b/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
index 567f778433e2..e6ff757895ab 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
@@ -26,10 +26,6 @@ static int ionic_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
char buf[16];
int err = 0;

- err = devlink_info_driver_name_put(req, IONIC_DRV_NAME);
- if (err)
- return err;
-
err = devlink_info_version_running_put(req,
DEVLINK_INFO_VERSION_GENERIC_FW,
idev->dev_info.fw_version);
diff --git a/drivers/net/ethernet/qlogic/qed/qed_devlink.c b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
index 6bb4e165b592..922c47797af6 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_devlink.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
@@ -162,10 +162,6 @@ static int qed_devlink_info_get(struct devlink *devlink,

dev_info = &cdev->common_dev_info;

- err = devlink_info_driver_name_put(req, KBUILD_MODNAME);
- if (err)
- return err;
-
memcpy(buf, cdev->hwfns[0].hw_info.part_num, sizeof(cdev->hwfns[0].hw_info.part_num));
buf[sizeof(cdev->hwfns[0].hw_info.part_num)] = 0;

diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c
index e14686594a71..b962fc8e1397 100644
--- a/drivers/net/netdevsim/dev.c
+++ b/drivers/net/netdevsim/dev.c
@@ -994,9 +994,6 @@ static int nsim_dev_info_get(struct devlink *devlink,
{
int err;

- err = devlink_info_driver_name_put(req, DRV_NAME);
- if (err)
- return err;
err = devlink_info_version_stored_put_ext(req, "fw.mgmt", "10.20.30",
DEVLINK_INFO_VERSION_TYPE_COMPONENT);
if (err)
diff --git a/drivers/ptp/ptp_ocp.c b/drivers/ptp/ptp_ocp.c
index 154d58cbd9ce..4bbaccd543ad 100644
--- a/drivers/ptp/ptp_ocp.c
+++ b/drivers/ptp/ptp_ocp.c
@@ -1647,10 +1647,6 @@ ptp_ocp_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
char buf[32];
int err;

- err = devlink_info_driver_name_put(req, KBUILD_MODNAME);
- if (err)
- return err;
-
fw_image = bp->fw_loader ? "loader" : "fw";
sprintf(buf, "%d.%d", bp->fw_tag, bp->fw_version);
err = devlink_info_version_running_put(req, fw_image, buf);
diff --git a/net/core/devlink.c b/net/core/devlink.c
index cea154ddce7a..6478135d9ba1 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -6749,11 +6749,24 @@ int devlink_info_version_running_put_ext(struct devlink_info_req *req,
}
EXPORT_SYMBOL_GPL(devlink_info_version_running_put_ext);

+static int devlink_nl_driver_info_get(struct device_driver *drv,
+ struct devlink_info_req *req)
+{
+ if (!drv)
+ return 0;
+
+ if (drv->name[0])
+ return devlink_info_driver_name_put(req, drv->name);
+
+ return 0;
+}
+
static int
devlink_nl_info_fill(struct sk_buff *msg, struct devlink *devlink,
enum devlink_command cmd, u32 portid,
u32 seq, int flags, struct netlink_ext_ack *extack)
{
+ struct device *dev = devlink_to_dev(devlink);
struct devlink_info_req req = {};
void *hdr;
int err;
@@ -6771,6 +6784,10 @@ devlink_nl_info_fill(struct sk_buff *msg, struct devlink *devlink,
if (err)
goto err_cancel_msg;

+ err = devlink_nl_driver_info_get(dev->driver, &req);
+ if (err)
+ goto err_cancel_msg;
+
genlmsg_end(msg, hdr);
return 0;

--
2.25.1

2022-11-29 00:12:22

by Vincent MAILHOL

[permalink] [raw]
Subject: [PATCH net-next v5 2/4] net: devlink: remove devlink_info_driver_name_put()

Now that the core sets the driver name attribute, drivers are not
supposed to call devlink_info_driver_name_put() anymore. Remove it.

Signed-off-by: Vincent Mailhol <[email protected]>
---
include/net/devlink.h | 2 --
net/core/devlink.c | 11 ++---------
2 files changed, 2 insertions(+), 11 deletions(-)

diff --git a/include/net/devlink.h b/include/net/devlink.h
index 074a79b8933f..52d5fb67e9b8 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -1746,8 +1746,6 @@ int devlink_region_snapshot_create(struct devlink_region *region,
u8 *data, u32 snapshot_id);
int devlink_info_serial_number_put(struct devlink_info_req *req,
const char *sn);
-int devlink_info_driver_name_put(struct devlink_info_req *req,
- const char *name);
int devlink_info_board_serial_number_put(struct devlink_info_req *req,
const char *bsn);

diff --git a/net/core/devlink.c b/net/core/devlink.c
index 6478135d9ba1..3babc16eeb6b 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -6633,14 +6633,6 @@ static int devlink_nl_cmd_region_read_dumpit(struct sk_buff *skb,
return err;
}

-int devlink_info_driver_name_put(struct devlink_info_req *req, const char *name)
-{
- if (!req->msg)
- return 0;
- return nla_put_string(req->msg, DEVLINK_ATTR_INFO_DRIVER_NAME, name);
-}
-EXPORT_SYMBOL_GPL(devlink_info_driver_name_put);
-
int devlink_info_serial_number_put(struct devlink_info_req *req, const char *sn)
{
if (!req->msg)
@@ -6756,7 +6748,8 @@ static int devlink_nl_driver_info_get(struct device_driver *drv,
return 0;

if (drv->name[0])
- return devlink_info_driver_name_put(req, drv->name);
+ return nla_put_string(req->msg, DEVLINK_ATTR_INFO_DRIVER_NAME,
+ drv->name);

return 0;
}
--
2.25.1

2022-11-29 00:13:26

by Vincent MAILHOL

[permalink] [raw]
Subject: [PATCH net-next v5 3/4] net: devlink: make the devlink_ops::info_get() callback optional

Some drivers only reported the driver name in their
devlink_ops::info_get() callback. Now that the core provides this
information, the callback became empty. For such drivers, just
removing the callback would prevent the core from executing
devlink_nl_info_fill() meaning that "devlink dev info" would not
return anything.

Make the callback function optional by executing
devlink_nl_info_fill() even if devlink_ops::info_get() is NULL.

N.B.: the drivers with devlink support which previously did not
implement devlink_ops::info_get() will now also be able to report
the driver name.

Signed-off-by: Vincent Mailhol <[email protected]>
---
net/core/devlink.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/net/core/devlink.c b/net/core/devlink.c
index 3babc16eeb6b..817d978bb729 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -6773,9 +6773,11 @@ devlink_nl_info_fill(struct sk_buff *msg, struct devlink *devlink,
goto err_cancel_msg;

req.msg = msg;
- err = devlink->ops->info_get(devlink, &req, extack);
- if (err)
- goto err_cancel_msg;
+ if (devlink->ops->info_get) {
+ err = devlink->ops->info_get(devlink, &req, extack);
+ if (err)
+ goto err_cancel_msg;
+ }

err = devlink_nl_driver_info_get(dev->driver, &req);
if (err)
@@ -6796,9 +6798,6 @@ static int devlink_nl_cmd_info_get_doit(struct sk_buff *skb,
struct sk_buff *msg;
int err;

- if (!devlink->ops->info_get)
- return -EOPNOTSUPP;
-
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
if (!msg)
return -ENOMEM;
@@ -6824,7 +6823,7 @@ static int devlink_nl_cmd_info_get_dumpit(struct sk_buff *msg,
int err = 0;

devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) {
- if (idx < start || !devlink->ops->info_get)
+ if (idx < start)
goto inc;

devl_lock(devlink);
--
2.25.1

2022-11-29 00:14:06

by Vincent MAILHOL

[permalink] [raw]
Subject: [PATCH net-next v5 4/4] net: devlink: clean-up empty devlink_ops::info_get()

devlink_ops::info_get() is now optional and devlink will continue to
report information even if that callback gets removed.

Remove all the empty devlink_ops::info_get() callbacks from the
drivers.

Signed-off-by: Vincent Mailhol <[email protected]>
---
drivers/net/ethernet/fungible/funeth/funeth_devlink.c | 7 -------
drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c | 7 -------
drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c | 8 --------
3 files changed, 22 deletions(-)

diff --git a/drivers/net/ethernet/fungible/funeth/funeth_devlink.c b/drivers/net/ethernet/fungible/funeth/funeth_devlink.c
index 6668375edff6..4fbeb3fd71a8 100644
--- a/drivers/net/ethernet/fungible/funeth/funeth_devlink.c
+++ b/drivers/net/ethernet/fungible/funeth/funeth_devlink.c
@@ -3,14 +3,7 @@
#include "funeth.h"
#include "funeth_devlink.h"

-static int fun_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
- struct netlink_ext_ack *extack)
-{
- return 0;
-}
-
static const struct devlink_ops fun_dl_ops = {
- .info_get = fun_dl_info_get,
};

struct devlink *fun_devlink_alloc(struct device *dev)
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c
index f15439d26d21..bda1a6fa2ec4 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c
@@ -1547,14 +1547,7 @@ static int rvu_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
return 0;
}

-static int rvu_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
- struct netlink_ext_ack *extack)
-{
- return 0;
-}
-
static const struct devlink_ops rvu_devlink_ops = {
- .info_get = rvu_devlink_info_get,
.eswitch_mode_get = rvu_devlink_eswitch_mode_get,
.eswitch_mode_set = rvu_devlink_eswitch_mode_set,
};
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c
index 5cc6416cf1a6..63ef7c41d18d 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c
@@ -77,15 +77,7 @@ static const struct devlink_param otx2_dl_params[] = {
otx2_dl_mcam_count_validate),
};

-static int otx2_devlink_info_get(struct devlink *devlink,
- struct devlink_info_req *req,
- struct netlink_ext_ack *extack)
-{
- return 0;
-}
-
static const struct devlink_ops otx2_devlink_ops = {
- .info_get = otx2_devlink_info_get,
};

int otx2_register_dl(struct otx2_nic *pfvf)
--
2.25.1

2022-11-29 00:36:04

by Jacob Keller

[permalink] [raw]
Subject: RE: [PATCH net-next v5 2/4] net: devlink: remove devlink_info_driver_name_put()



> -----Original Message-----
> From: Vincent Mailhol <[email protected]> On Behalf Of Vincent
> Mailhol
> Sent: Monday, November 28, 2022 4:06 PM
> To: Jiri Pirko <[email protected]>; [email protected]; Jakub Kicinski
> <[email protected]>
> Cc: David S . Miller <[email protected]>; Eric Dumazet
> <[email protected]>; Paolo Abeni <[email protected]>; linux-
> [email protected]; Boris Brezillon <[email protected]>; Arnaud Ebalard
> <[email protected]>; Srujana Challa <[email protected]>; Kurt Kanzenbach
> <[email protected]>; Andrew Lunn <[email protected]>; Florian Fainelli
> <[email protected]>; Vladimir Oltean <[email protected]>; Michael Chan
> <[email protected]>; Ioana Ciornei <[email protected]>;
> Dimitris Michailidis <[email protected]>; Yisen Zhuang
> <[email protected]>; Salil Mehta <[email protected]>;
> Brandeburg, Jesse <[email protected]>; Nguyen, Anthony L
> <[email protected]>; Sunil Goutham <[email protected]>; Linu
> Cherian <[email protected]>; Geetha sowjanya <[email protected]>;
> Jerin Jacob <[email protected]>; hariprasad <[email protected]>;
> Subbaraya Sundeep <[email protected]>; Taras Chornyi
> <[email protected]>; Saeed Mahameed <[email protected]>; Leon
> Romanovsky <[email protected]>; Ido Schimmel <[email protected]>; Petr
> Machata <[email protected]>; Simon Horman <[email protected]>;
> Shannon Nelson <[email protected]>; [email protected]; Ariel Elior
> <[email protected]>; Manish Chopra <[email protected]>; Jonathan
> Lemon <[email protected]>; Vadim Fedorenko <[email protected]>;
> Richard Cochran <[email protected]>; Vadim Pasternak
> <[email protected]>; Shalom Toledo <[email protected]>; linux-
> [email protected]; [email protected]; linux-
> [email protected]; [email protected]; Jiri Pirko
> <[email protected]>; Herbert Xu <[email protected]>; Hao Chen
> <[email protected]>; Guangbin Huang
> <[email protected]>; Minghao Chi <[email protected]>;
> Shijith Thotton <[email protected]>; Vincent Mailhol
> <[email protected]>
> Subject: [PATCH net-next v5 2/4] net: devlink: remove
> devlink_info_driver_name_put()
>
> Now that the core sets the driver name attribute, drivers are not
> supposed to call devlink_info_driver_name_put() anymore. Remove it.
>

You could combine this patch with the previous one so that in the event of a cherry-pick its not possible to have this function while the core inserts the driver name automatically.

I think that also makes it very clear that there are no remaining in-tree drivers still calling the function.

I don't have a strong preference if we prefer it being separated.

Thanks,
Jake

2022-11-29 00:37:05

by Jacob Keller

[permalink] [raw]
Subject: RE: [Intel-wired-lan] [PATCH net-next v5 3/4] net: devlink: make the devlink_ops::info_get() callback optional



> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On Behalf Of
> Vincent Mailhol
> Sent: Monday, November 28, 2022 4:06 PM
> To: Jiri Pirko <[email protected]>; [email protected]; Jakub Kicinski
> <[email protected]>
> Cc: Andrew Lunn <[email protected]>; Shijith Thotton <[email protected]>;
> Simon Horman <[email protected]>; Kurt Kanzenbach
> <[email protected]>; Eric Dumazet <[email protected]>; Jerin Jacob
> <[email protected]>; Subbaraya Sundeep <[email protected]>; Ioana
> Ciornei <[email protected]>; [email protected]; Linu Cherian
> <[email protected]>; Florian Fainelli <[email protected]>; Herbert Xu
> <[email protected]>; Leon Romanovsky <[email protected]>; linux-
> [email protected]; Shalom Toledo <[email protected]>; Srujana
> Challa <[email protected]>; Minghao Chi <[email protected]>; Hao
> Chen <[email protected]>; Guangbin Huang
> <[email protected]>; Shannon Nelson <[email protected]>;
> [email protected]; Vadim Fedorenko <[email protected]>; Paolo
> Abeni <[email protected]>; Yisen Zhuang <[email protected]>; Sunil
> Goutham <[email protected]>; Ariel Elior <[email protected]>; Ido
> Schimmel <[email protected]>; Richard Cochran <[email protected]>;
> Arnaud Ebalard <[email protected]>; Jiri Pirko <[email protected]>; Michael
> Chan <[email protected]>; Vincent Mailhol
> <[email protected]>; Petr Machata <[email protected]>; Salil Mehta
> <[email protected]>; Dimitris Michailidis <[email protected]>;
> Manish Chopra <[email protected]>; Boris Brezillon
> <[email protected]>; [email protected]; Vadim Pasternak
> <[email protected]>; [email protected]; David S . Miller
> <[email protected]>; Taras Chornyi <[email protected]>; hariprasad
> <[email protected]>; [email protected]; Jonathan Lemon
> <[email protected]>; Vladimir Oltean <[email protected]>; Saeed
> Mahameed <[email protected]>; Geetha sowjanya <[email protected]>
> Subject: [Intel-wired-lan] [PATCH net-next v5 3/4] net: devlink: make the
> devlink_ops::info_get() callback optional
>
> Some drivers only reported the driver name in their
> devlink_ops::info_get() callback. Now that the core provides this
> information, the callback became empty. For such drivers, just
> removing the callback would prevent the core from executing
> devlink_nl_info_fill() meaning that "devlink dev info" would not
> return anything.
>
> Make the callback function optional by executing
> devlink_nl_info_fill() even if devlink_ops::info_get() is NULL.
>
> N.B.: the drivers with devlink support which previously did not
> implement devlink_ops::info_get() will now also be able to report
> the driver name.
>

Makes sense to me.

Thanks,
Jake

2022-11-29 00:38:23

by Jacob Keller

[permalink] [raw]
Subject: RE: [PATCH net-next v5 0/4] net: devlink: return the driver name in devlink_nl_info_fill



> -----Original Message-----
> From: Vincent Mailhol <[email protected]> On Behalf Of Vincent
> Mailhol
> Sent: Monday, November 28, 2022 4:06 PM
> To: Jiri Pirko <[email protected]>; [email protected]; Jakub Kicinski
> <[email protected]>
> Cc: David S . Miller <[email protected]>; Eric Dumazet
> <[email protected]>; Paolo Abeni <[email protected]>; linux-
> [email protected]; Boris Brezillon <[email protected]>; Arnaud Ebalard
> <[email protected]>; Srujana Challa <[email protected]>; Kurt Kanzenbach
> <[email protected]>; Andrew Lunn <[email protected]>; Florian Fainelli
> <[email protected]>; Vladimir Oltean <[email protected]>; Michael Chan
> <[email protected]>; Ioana Ciornei <[email protected]>;
> Dimitris Michailidis <[email protected]>; Yisen Zhuang
> <[email protected]>; Salil Mehta <[email protected]>;
> Brandeburg, Jesse <[email protected]>; Nguyen, Anthony L
> <[email protected]>; Sunil Goutham <[email protected]>; Linu
> Cherian <[email protected]>; Geetha sowjanya <[email protected]>;
> Jerin Jacob <[email protected]>; hariprasad <[email protected]>;
> Subbaraya Sundeep <[email protected]>; Taras Chornyi
> <[email protected]>; Saeed Mahameed <[email protected]>; Leon
> Romanovsky <[email protected]>; Ido Schimmel <[email protected]>; Petr
> Machata <[email protected]>; Simon Horman <[email protected]>;
> Shannon Nelson <[email protected]>; [email protected]; Ariel Elior
> <[email protected]>; Manish Chopra <[email protected]>; Jonathan
> Lemon <[email protected]>; Vadim Fedorenko <[email protected]>;
> Richard Cochran <[email protected]>; Vadim Pasternak
> <[email protected]>; Shalom Toledo <[email protected]>; linux-
> [email protected]; [email protected]; linux-
> [email protected]; [email protected]; Jiri Pirko
> <[email protected]>; Herbert Xu <[email protected]>; Hao Chen
> <[email protected]>; Guangbin Huang
> <[email protected]>; Minghao Chi <[email protected]>;
> Shijith Thotton <[email protected]>; Vincent Mailhol
> <[email protected]>
> Subject: [PATCH net-next v5 0/4] net: devlink: return the driver name in
> devlink_nl_info_fill
>
> The driver name is available in device_driver::name. Right now,
> drivers still have to report this piece of information themselves in
> their devlink_ops::info_get callback function.
>
> The goal of this series is to have the devlink core to report this
> information instead of the drivers.
>
> The first patch fulfills the actual goal of this series: modify
> devlink core to report the driver name and clean-up all drivers. Both
> have to be done in an atomic change to avoid attribute duplication.
>
> The second patch removes the devlink_info_driver_name_put() function
> to prevent future drivers from reporting the driver name themselves.
>
> The third patch allows the core to call devlink_nl_info_fill() even if
> the devlink_ops::info_get() callback is NULL. This leads to the fourth
> and final patch which cleans up the drivers which have an empty
> info_get().
> ---

Reviewed-by: Jacob Keller <[email protected]>

I'm fine with keeping it 4 patches as-is. Thanks!

> * Changelog *
>
> v4 -> v5
>
> * [PATCH 1/4] add Tested-by: Ido Schimmel tag.
>
> * split patch 3/3 in two patches.
>
> v3 -> v4
>
> * Ido pointed out that the mlxsw did not need to be fixed:
> https://lore.kernel.org/netdev/Y4ONgD4dAj8yU2%2F+@shredder/
> Remove the first two patches from the series.
>
> v2 -> v3
>
> * [PATCH 3/5] remove the call to devlink_info_driver_name_put() in
> mlxsw driver as well (this was missing in v2, making the build
> fail... sorry for the noise).
>
> * add additional people in CC as pointed by netdev patchwork CI:
> https://patchwork.kernel.org/project/netdevbpf/list/?series=699451
>
> * use the "Link:" prefix before URL to silence checkpatch's line
> length warning.
>
>
> RFC v1 -> v2
>
> * drop the RFC tag
>
> * big rework following the discussion on RFC:
> https://lore.kernel.org/netdev/20221122154934.13937-1-
> [email protected]/
> Went from one patch to a series of five patches:
>
> * drop the idea to report the USB serial number following Greg's
> comment:
> https://lore.kernel.org/linux-usb/Y3+VfNdt%[email protected]/
>
> Vincent Mailhol (4):
> net: devlink: let the core report the driver name instead of the
> drivers
> net: devlink: remove devlink_info_driver_name_put()
> net: devlink: make the devlink_ops::info_get() callback optional
> net: devlink: clean-up empty devlink_ops::info_get()
>
> .../marvell/octeontx2/otx2_cpt_devlink.c | 4 ---
> drivers/net/dsa/hirschmann/hellcreek.c | 5 ---
> drivers/net/dsa/mv88e6xxx/devlink.c | 5 ---
> drivers/net/dsa/sja1105/sja1105_devlink.c | 12 ++-----
> .../net/ethernet/broadcom/bnxt/bnxt_devlink.c | 4 ---
> .../freescale/dpaa2/dpaa2-eth-devlink.c | 11 +-----
> .../ethernet/fungible/funeth/funeth_devlink.c | 7 ----
> .../hisilicon/hns3/hns3pf/hclge_devlink.c | 5 ---
> .../hisilicon/hns3/hns3vf/hclgevf_devlink.c | 5 ---
> drivers/net/ethernet/intel/ice/ice_devlink.c | 6 ----
> .../marvell/octeontx2/af/rvu_devlink.c | 7 ----
> .../marvell/octeontx2/nic/otx2_devlink.c | 15 --------
> .../marvell/prestera/prestera_devlink.c | 5 ---
> .../net/ethernet/mellanox/mlx5/core/devlink.c | 4 ---
> drivers/net/ethernet/mellanox/mlxsw/core.c | 5 ---
> .../net/ethernet/netronome/nfp/nfp_devlink.c | 4 ---
> .../ethernet/pensando/ionic/ionic_devlink.c | 4 ---
> drivers/net/ethernet/qlogic/qed/qed_devlink.c | 4 ---
> drivers/net/netdevsim/dev.c | 3 --
> drivers/ptp/ptp_ocp.c | 4 ---
> include/net/devlink.h | 2 --
> net/core/devlink.c | 35 ++++++++++++-------
> 22 files changed, 26 insertions(+), 130 deletions(-)
>
> --
> 2.25.1

2022-11-29 01:12:11

by Vincent MAILHOL

[permalink] [raw]
Subject: Re: [PATCH net-next v5 2/4] net: devlink: remove devlink_info_driver_name_put()

Hi Jacob,

Thanks for the review!

On Tue. 29 Nov. 2022 at 09:23, Keller, Jacob E <[email protected]> wrote:
> > -----Original Message-----
> > From: Vincent Mailhol <[email protected]> On Behalf Of Vincent
> > Mailhol
> > Sent: Monday, November 28, 2022 4:06 PM
> > To: Jiri Pirko <[email protected]>; [email protected]; Jakub Kicinski
> > <[email protected]>
> > Cc: David S . Miller <[email protected]>; Eric Dumazet
> > <[email protected]>; Paolo Abeni <[email protected]>; linux-
> > [email protected]; Boris Brezillon <[email protected]>; Arnaud Ebalard
> > <[email protected]>; Srujana Challa <[email protected]>; Kurt Kanzenbach
> > <[email protected]>; Andrew Lunn <[email protected]>; Florian Fainelli
> > <[email protected]>; Vladimir Oltean <[email protected]>; Michael Chan
> > <[email protected]>; Ioana Ciornei <[email protected]>;
> > Dimitris Michailidis <[email protected]>; Yisen Zhuang
> > <[email protected]>; Salil Mehta <[email protected]>;
> > Brandeburg, Jesse <[email protected]>; Nguyen, Anthony L
> > <[email protected]>; Sunil Goutham <[email protected]>; Linu
> > Cherian <[email protected]>; Geetha sowjanya <[email protected]>;
> > Jerin Jacob <[email protected]>; hariprasad <[email protected]>;
> > Subbaraya Sundeep <[email protected]>; Taras Chornyi
> > <[email protected]>; Saeed Mahameed <[email protected]>; Leon
> > Romanovsky <[email protected]>; Ido Schimmel <[email protected]>; Petr
> > Machata <[email protected]>; Simon Horman <[email protected]>;
> > Shannon Nelson <[email protected]>; [email protected]; Ariel Elior
> > <[email protected]>; Manish Chopra <[email protected]>; Jonathan
> > Lemon <[email protected]>; Vadim Fedorenko <[email protected]>;
> > Richard Cochran <[email protected]>; Vadim Pasternak
> > <[email protected]>; Shalom Toledo <[email protected]>; linux-
> > [email protected]; [email protected]; linux-
> > [email protected]; [email protected]; Jiri Pirko
> > <[email protected]>; Herbert Xu <[email protected]>; Hao Chen
> > <[email protected]>; Guangbin Huang
> > <[email protected]>; Minghao Chi <[email protected]>;
> > Shijith Thotton <[email protected]>; Vincent Mailhol
> > <[email protected]>
> > Subject: [PATCH net-next v5 2/4] net: devlink: remove
> > devlink_info_driver_name_put()
> >
> > Now that the core sets the driver name attribute, drivers are not
> > supposed to call devlink_info_driver_name_put() anymore. Remove it.
> >
>
> You could combine this patch with the previous one so that in the event of a cherry-pick its not possible to have this function while the core inserts the driver name automatically.
>
> I think that also makes it very clear that there are no remaining in-tree drivers still calling the function.
>
> I don't have a strong preference if we prefer it being separated.

The first patch is already pretty long. I do not expect this to be
cherry-picked because it does not fix any existing bug (and if people
really want to cherry pick, then they just have to cherry pick both).
On the contrary, splitting makes it easier to review, I think.

Unless the maintainers as me to squash, I want to keep it as-is.


Yours sincerely,
Vincent Mailhol

2022-11-29 01:23:50

by Jacob Keller

[permalink] [raw]
Subject: RE: [PATCH net-next v5 2/4] net: devlink: remove devlink_info_driver_name_put()



> -----Original Message-----
> From: Vincent MAILHOL <[email protected]>
> Sent: Monday, November 28, 2022 5:11 PM
> To: Keller, Jacob E <[email protected]>
> Cc: Jiri Pirko <[email protected]>; [email protected]; Jakub Kicinski
> <[email protected]>; David S . Miller <[email protected]>; Eric Dumazet
> <[email protected]>; Paolo Abeni <[email protected]>; linux-
> [email protected]; Boris Brezillon <[email protected]>; Arnaud Ebalard
> <[email protected]>; Srujana Challa <[email protected]>; Kurt Kanzenbach
> <[email protected]>; Andrew Lunn <[email protected]>; Florian Fainelli
> <[email protected]>; Vladimir Oltean <[email protected]>; Michael Chan
> <[email protected]>; Ioana Ciornei <[email protected]>;
> Dimitris Michailidis <[email protected]>; Yisen Zhuang
> <[email protected]>; Salil Mehta <[email protected]>;
> Brandeburg, Jesse <[email protected]>; Nguyen, Anthony L
> <[email protected]>; Sunil Goutham <[email protected]>; Linu
> Cherian <[email protected]>; Geetha sowjanya <[email protected]>;
> Jerin Jacob <[email protected]>; hariprasad <[email protected]>;
> Subbaraya Sundeep <[email protected]>; Taras Chornyi
> <[email protected]>; Saeed Mahameed <[email protected]>; Leon
> Romanovsky <[email protected]>; Ido Schimmel <[email protected]>; Petr
> Machata <[email protected]>; Simon Horman <[email protected]>;
> Shannon Nelson <[email protected]>; [email protected]; Ariel Elior
> <[email protected]>; Manish Chopra <[email protected]>; Jonathan
> Lemon <[email protected]>; Vadim Fedorenko <[email protected]>;
> Richard Cochran <[email protected]>; Vadim Pasternak
> <[email protected]>; [email protected]; intel-wired-
> [email protected]; [email protected]; [email protected]; Jiri
> Pirko <[email protected]>; Herbert Xu <[email protected]>;
> Guangbin Huang <[email protected]>; Minghao Chi
> <[email protected]>; Shijith Thotton <[email protected]>
> Subject: Re: [PATCH net-next v5 2/4] net: devlink: remove
> devlink_info_driver_name_put()
>
> Hi Jacob,
>
> Thanks for the review!
>
> On Tue. 29 Nov. 2022 at 09:23, Keller, Jacob E <[email protected]> wrote:
> > > -----Original Message-----
> > > From: Vincent Mailhol <[email protected]> On Behalf Of Vincent
> > > Mailhol
> > > Sent: Monday, November 28, 2022 4:06 PM
> > > To: Jiri Pirko <[email protected]>; [email protected]; Jakub Kicinski
> > > <[email protected]>
> > > Cc: David S . Miller <[email protected]>; Eric Dumazet
> > > <[email protected]>; Paolo Abeni <[email protected]>; linux-
> > > [email protected]; Boris Brezillon <[email protected]>; Arnaud
> Ebalard
> > > <[email protected]>; Srujana Challa <[email protected]>; Kurt
> Kanzenbach
> > > <[email protected]>; Andrew Lunn <[email protected]>; Florian Fainelli
> > > <[email protected]>; Vladimir Oltean <[email protected]>; Michael Chan
> > > <[email protected]>; Ioana Ciornei <[email protected]>;
> > > Dimitris Michailidis <[email protected]>; Yisen Zhuang
> > > <[email protected]>; Salil Mehta <[email protected]>;
> > > Brandeburg, Jesse <[email protected]>; Nguyen, Anthony L
> > > <[email protected]>; Sunil Goutham <[email protected]>;
> Linu
> > > Cherian <[email protected]>; Geetha sowjanya <[email protected]>;
> > > Jerin Jacob <[email protected]>; hariprasad <[email protected]>;
> > > Subbaraya Sundeep <[email protected]>; Taras Chornyi
> > > <[email protected]>; Saeed Mahameed <[email protected]>; Leon
> > > Romanovsky <[email protected]>; Ido Schimmel <[email protected]>; Petr
> > > Machata <[email protected]>; Simon Horman
> <[email protected]>;
> > > Shannon Nelson <[email protected]>; [email protected]; Ariel Elior
> > > <[email protected]>; Manish Chopra <[email protected]>; Jonathan
> > > Lemon <[email protected]>; Vadim Fedorenko <[email protected]>;
> > > Richard Cochran <[email protected]>; Vadim Pasternak
> > > <[email protected]>; Shalom Toledo <[email protected]>; linux-
> > > [email protected]; [email protected]; linux-
> > > [email protected]; [email protected]; Jiri Pirko
> > > <[email protected]>; Herbert Xu <[email protected]>; Hao
> Chen
> > > <[email protected]>; Guangbin Huang
> > > <[email protected]>; Minghao Chi <[email protected]>;
> > > Shijith Thotton <[email protected]>; Vincent Mailhol
> > > <[email protected]>
> > > Subject: [PATCH net-next v5 2/4] net: devlink: remove
> > > devlink_info_driver_name_put()
> > >
> > > Now that the core sets the driver name attribute, drivers are not
> > > supposed to call devlink_info_driver_name_put() anymore. Remove it.
> > >
> >
> > You could combine this patch with the previous one so that in the event of a
> cherry-pick its not possible to have this function while the core inserts the driver
> name automatically.
> >
> > I think that also makes it very clear that there are no remaining in-tree drivers
> still calling the function.
> >
> > I don't have a strong preference if we prefer it being separated.
>
> The first patch is already pretty long. I do not expect this to be
> cherry-picked because it does not fix any existing bug (and if people
> really want to cherry pick, then they just have to cherry pick both).
> On the contrary, splitting makes it easier to review, I think.
>
> Unless the maintainers as me to squash, I want to keep it as-is.
>

That works for me!

Thanks,
Jake

>
> Yours sincerely,
> Vincent Mailhol

2022-11-29 08:31:02

by Jiri Pirko

[permalink] [raw]
Subject: Re: [PATCH net-next v5 1/4] net: devlink: let the core report the driver name instead of the drivers

Tue, Nov 29, 2022 at 01:05:47AM CET, [email protected] wrote:
>The driver name is available in device_driver::name. Right now,
>drivers still have to report this piece of information themselves in
>their devlink_ops::info_get callback function.
>
>In order to factorize code, make devlink_nl_info_fill() add the driver
>name attribute.
>
>nla_put() does not check if an attribute already exists and
>unconditionally reserves new space [1]. To avoid attribute
>duplication, clean-up all the drivers which are currently reporting
>the driver name in their callback.

This para with the link below should be removed, no need for it.

Otherwise, code looks fine.

Reviewed-by: Jiri Pirko <[email protected]>

2022-11-29 08:31:33

by Jiri Pirko

[permalink] [raw]
Subject: Re: [PATCH net-next v5 2/4] net: devlink: remove devlink_info_driver_name_put()

Tue, Nov 29, 2022 at 01:05:48AM CET, [email protected] wrote:
>Now that the core sets the driver name attribute, drivers are not
>supposed to call devlink_info_driver_name_put() anymore. Remove it.
>
>Signed-off-by: Vincent Mailhol <[email protected]>

I agree with Jacob that this could be easily squashed to the previous
patch. One way or another:

Reviewed-by: Jiri Pirko <[email protected]>

2022-11-29 08:31:54

by Jiri Pirko

[permalink] [raw]
Subject: Re: [PATCH net-next v5 3/4] net: devlink: make the devlink_ops::info_get() callback optional

Tue, Nov 29, 2022 at 01:05:49AM CET, [email protected] wrote:
>Some drivers only reported the driver name in their
>devlink_ops::info_get() callback. Now that the core provides this
>information, the callback became empty. For such drivers, just
>removing the callback would prevent the core from executing
>devlink_nl_info_fill() meaning that "devlink dev info" would not
>return anything.
>
>Make the callback function optional by executing
>devlink_nl_info_fill() even if devlink_ops::info_get() is NULL.
>
>N.B.: the drivers with devlink support which previously did not
>implement devlink_ops::info_get() will now also be able to report
>the driver name.
>
>Signed-off-by: Vincent Mailhol <[email protected]>

Reviewed-by: Jiri Pirko <[email protected]>

2022-11-29 08:33:31

by Jiri Pirko

[permalink] [raw]
Subject: Re: [PATCH net-next v5 4/4] net: devlink: clean-up empty devlink_ops::info_get()

Tue, Nov 29, 2022 at 01:05:50AM CET, [email protected] wrote:
>devlink_ops::info_get() is now optional and devlink will continue to
>report information even if that callback gets removed.
>
>Remove all the empty devlink_ops::info_get() callbacks from the
>drivers.
>
>Signed-off-by: Vincent Mailhol <[email protected]>

Reviewed-by: Jiri Pirko <[email protected]>

2022-11-29 09:51:12

by Vincent MAILHOL

[permalink] [raw]
Subject: Re: [PATCH net-next v5 2/4] net: devlink: remove devlink_info_driver_name_put()

On Tue. 29 Nov. 2022 at 17:25, Jiri Pirko <[email protected]> wrote:
> Tue, Nov 29, 2022 at 01:05:48AM CET, [email protected] wrote:
> >Now that the core sets the driver name attribute, drivers are not
> >supposed to call devlink_info_driver_name_put() anymore. Remove it.
> >
> >Signed-off-by: Vincent Mailhol <[email protected]>
>
> I agree with Jacob that this could be easily squashed to the previous
> patch. One way or another:

OK. Let's have the majority decide: I will squash patches 1 and 2 and send a v6.

> Reviewed-by: Jiri Pirko <[email protected]>

Thank you for the review.

2022-11-29 16:28:41

by Jakub Kicinski

[permalink] [raw]
Subject: Re: [PATCH net-next v5 2/4] net: devlink: remove devlink_info_driver_name_put()

On Tue, 29 Nov 2022 18:37:41 +0900 Vincent MAILHOL wrote:
> > I agree with Jacob that this could be easily squashed to the previous
> > patch. One way or another:
>
> OK. Let's have the majority decide: I will squash patches 1 and 2 and send a v6.

FTR I prefer v5, much easier to review the code when driver changes are
separated from core changes. But doesn't matter.

2022-11-30 00:47:55

by Vadim Fedorenko

[permalink] [raw]
Subject: Re: [PATCH net-next v5 1/4] net: devlink: let the core report the driver name instead of the drivers

On 29.11.2022 00:05, Vincent Mailhol wrote:
> The driver name is available in device_driver::name. Right now,
> drivers still have to report this piece of information themselves in
> their devlink_ops::info_get callback function.
>
> In order to factorize code, make devlink_nl_info_fill() add the driver
> name attribute.
>
> nla_put() does not check if an attribute already exists and
> unconditionally reserves new space [1]. To avoid attribute
> duplication, clean-up all the drivers which are currently reporting
> the driver name in their callback.
>
> [1] __nla_put from lib/nlattr.c
> Link: https://elixir.bootlin.com/linux/v6.0/source/lib/nlattr.c#L993
>
> Signed-off-by: Vincent Mailhol <[email protected]>
> Tested-by: Ido Schimmel <[email protected]> # mlxsw

For ptp_ocp driver:
Acked-by: Vadim Fedorenko <[email protected]>

> ---
> .../crypto/marvell/octeontx2/otx2_cpt_devlink.c | 4 ----
> drivers/net/dsa/hirschmann/hellcreek.c | 5 -----
> drivers/net/dsa/mv88e6xxx/devlink.c | 5 -----
> drivers/net/dsa/sja1105/sja1105_devlink.c | 12 +++---------
> .../net/ethernet/broadcom/bnxt/bnxt_devlink.c | 4 ----
> .../freescale/dpaa2/dpaa2-eth-devlink.c | 11 +----------
> .../ethernet/fungible/funeth/funeth_devlink.c | 2 +-
> .../hisilicon/hns3/hns3pf/hclge_devlink.c | 5 -----
> .../hisilicon/hns3/hns3vf/hclgevf_devlink.c | 5 -----
> drivers/net/ethernet/intel/ice/ice_devlink.c | 6 ------
> .../ethernet/marvell/octeontx2/af/rvu_devlink.c | 2 +-
> .../marvell/octeontx2/nic/otx2_devlink.c | 9 +--------
> .../marvell/prestera/prestera_devlink.c | 5 -----
> .../net/ethernet/mellanox/mlx5/core/devlink.c | 4 ----
> drivers/net/ethernet/mellanox/mlxsw/core.c | 5 -----
> .../net/ethernet/netronome/nfp/nfp_devlink.c | 4 ----
> .../net/ethernet/pensando/ionic/ionic_devlink.c | 4 ----
> drivers/net/ethernet/qlogic/qed/qed_devlink.c | 4 ----
> drivers/net/netdevsim/dev.c | 3 ---
> drivers/ptp/ptp_ocp.c | 4 ----
> net/core/devlink.c | 17 +++++++++++++++++
> 21 files changed, 24 insertions(+), 96 deletions(-)
>
> diff --git a/drivers/crypto/marvell/octeontx2/otx2_cpt_devlink.c b/drivers/crypto/marvell/octeontx2/otx2_cpt_devlink.c
> index 7503f6b18ac5..a2aba0b0d68a 100644
> --- a/drivers/crypto/marvell/octeontx2/otx2_cpt_devlink.c
> +++ b/drivers/crypto/marvell/octeontx2/otx2_cpt_devlink.c
> @@ -76,10 +76,6 @@ static int otx2_cpt_devlink_info_get(struct devlink *dl,
> struct otx2_cptpf_dev *cptpf = cpt_dl->cptpf;
> int err;
>
> - err = devlink_info_driver_name_put(req, "rvu_cptpf");
> - if (err)
> - return err;
> -
> err = otx2_cpt_dl_info_firmware_version_put(req, cptpf->eng_grps.grp,
> "fw.ae", OTX2_CPT_AE_TYPES);
> if (err)
> diff --git a/drivers/net/dsa/hirschmann/hellcreek.c b/drivers/net/dsa/hirschmann/hellcreek.c
> index 951f7935c872..595a548bb0a8 100644
> --- a/drivers/net/dsa/hirschmann/hellcreek.c
> +++ b/drivers/net/dsa/hirschmann/hellcreek.c
> @@ -1176,11 +1176,6 @@ static int hellcreek_devlink_info_get(struct dsa_switch *ds,
> struct netlink_ext_ack *extack)
> {
> struct hellcreek *hellcreek = ds->priv;
> - int ret;
> -
> - ret = devlink_info_driver_name_put(req, "hellcreek");
> - if (ret)
> - return ret;
>
> return devlink_info_version_fixed_put(req,
> DEVLINK_INFO_VERSION_GENERIC_ASIC_ID,
> diff --git a/drivers/net/dsa/mv88e6xxx/devlink.c b/drivers/net/dsa/mv88e6xxx/devlink.c
> index 1266eabee086..a08dab75e0c0 100644
> --- a/drivers/net/dsa/mv88e6xxx/devlink.c
> +++ b/drivers/net/dsa/mv88e6xxx/devlink.c
> @@ -821,11 +821,6 @@ int mv88e6xxx_devlink_info_get(struct dsa_switch *ds,
> struct netlink_ext_ack *extack)
> {
> struct mv88e6xxx_chip *chip = ds->priv;
> - int err;
> -
> - err = devlink_info_driver_name_put(req, "mv88e6xxx");
> - if (err)
> - return err;
>
> return devlink_info_version_fixed_put(req,
> DEVLINK_INFO_VERSION_GENERIC_ASIC_ID,
> diff --git a/drivers/net/dsa/sja1105/sja1105_devlink.c b/drivers/net/dsa/sja1105/sja1105_devlink.c
> index 10c6fea1227f..da532614f34a 100644
> --- a/drivers/net/dsa/sja1105/sja1105_devlink.c
> +++ b/drivers/net/dsa/sja1105/sja1105_devlink.c
> @@ -120,16 +120,10 @@ int sja1105_devlink_info_get(struct dsa_switch *ds,
> struct netlink_ext_ack *extack)
> {
> struct sja1105_private *priv = ds->priv;
> - int rc;
> -
> - rc = devlink_info_driver_name_put(req, "sja1105");
> - if (rc)
> - return rc;
>
> - rc = devlink_info_version_fixed_put(req,
> - DEVLINK_INFO_VERSION_GENERIC_ASIC_ID,
> - priv->info->name);
> - return rc;
> + return devlink_info_version_fixed_put(req,
> + DEVLINK_INFO_VERSION_GENERIC_ASIC_ID,
> + priv->info->name);
> }
>
> int sja1105_devlink_setup(struct dsa_switch *ds)
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
> index 8a6f788f6294..26913dc816d3 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
> @@ -892,10 +892,6 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
> u32 ver = 0;
> int rc;
>
> - rc = devlink_info_driver_name_put(req, DRV_MODULE_NAME);
> - if (rc)
> - return rc;
> -
> if (BNXT_PF(bp) && (bp->flags & BNXT_FLAG_DSN_VALID)) {
> sprintf(buf, "%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X",
> bp->dsn[7], bp->dsn[6], bp->dsn[5], bp->dsn[4],
> diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth-devlink.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth-devlink.c
> index 5c6dd3029e2f..76f808d38066 100644
> --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth-devlink.c
> +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth-devlink.c
> @@ -37,18 +37,9 @@ static int dpaa2_eth_dl_info_get(struct devlink *devlink,
> struct dpaa2_eth_devlink_priv *dl_priv = devlink_priv(devlink);
> struct dpaa2_eth_priv *priv = dl_priv->dpaa2_priv;
> char buf[10];
> - int err;
> -
> - err = devlink_info_driver_name_put(req, KBUILD_MODNAME);
> - if (err)
> - return err;
>
> scnprintf(buf, 10, "%d.%d", priv->dpni_ver_major, priv->dpni_ver_minor);
> - err = devlink_info_version_running_put(req, "dpni", buf);
> - if (err)
> - return err;
> -
> - return 0;
> + return devlink_info_version_running_put(req, "dpni", buf);
> }
>
> static struct dpaa2_eth_trap_item *
> diff --git a/drivers/net/ethernet/fungible/funeth/funeth_devlink.c b/drivers/net/ethernet/fungible/funeth/funeth_devlink.c
> index d50c222948b4..6668375edff6 100644
> --- a/drivers/net/ethernet/fungible/funeth/funeth_devlink.c
> +++ b/drivers/net/ethernet/fungible/funeth/funeth_devlink.c
> @@ -6,7 +6,7 @@
> static int fun_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
> struct netlink_ext_ack *extack)
> {
> - return devlink_info_driver_name_put(req, KBUILD_MODNAME);
> + return 0;
> }
>
> static const struct devlink_ops fun_dl_ops = {
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c
> index 4c441e6a5082..3d3b69605423 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c
> @@ -13,11 +13,6 @@ static int hclge_devlink_info_get(struct devlink *devlink,
> struct hclge_devlink_priv *priv = devlink_priv(devlink);
> char version_str[HCLGE_DEVLINK_FW_STRING_LEN];
> struct hclge_dev *hdev = priv->hdev;
> - int ret;
> -
> - ret = devlink_info_driver_name_put(req, KBUILD_MODNAME);
> - if (ret)
> - return ret;
>
> snprintf(version_str, sizeof(version_str), "%lu.%lu.%lu.%lu",
> hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE3_MASK,
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.c
> index fdc19868b818..a6c3c5e8f0ab 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.c
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.c
> @@ -13,11 +13,6 @@ static int hclgevf_devlink_info_get(struct devlink *devlink,
> struct hclgevf_devlink_priv *priv = devlink_priv(devlink);
> char version_str[HCLGEVF_DEVLINK_FW_STRING_LEN];
> struct hclgevf_dev *hdev = priv->hdev;
> - int ret;
> -
> - ret = devlink_info_driver_name_put(req, KBUILD_MODNAME);
> - if (ret)
> - return ret;
>
> snprintf(version_str, sizeof(version_str), "%lu.%lu.%lu.%lu",
> hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE3_MASK,
> diff --git a/drivers/net/ethernet/intel/ice/ice_devlink.c b/drivers/net/ethernet/intel/ice/ice_devlink.c
> index 1d638216484d..ba74977e75dc 100644
> --- a/drivers/net/ethernet/intel/ice/ice_devlink.c
> +++ b/drivers/net/ethernet/intel/ice/ice_devlink.c
> @@ -311,12 +311,6 @@ static int ice_devlink_info_get(struct devlink *devlink,
> }
> }
>
> - err = devlink_info_driver_name_put(req, KBUILD_MODNAME);
> - if (err) {
> - NL_SET_ERR_MSG_MOD(extack, "Unable to set driver name");
> - goto out_free_ctx;
> - }
> -
> ice_info_get_dsn(pf, ctx);
>
> err = devlink_info_serial_number_put(req, ctx->buf);
> diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c
> index 88dee589cb21..f15439d26d21 100644
> --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c
> +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c
> @@ -1550,7 +1550,7 @@ static int rvu_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
> static int rvu_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
> struct netlink_ext_ack *extack)
> {
> - return devlink_info_driver_name_put(req, DRV_NAME);
> + return 0;
> }
>
> static const struct devlink_ops rvu_devlink_ops = {
> diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c
> index 777a27047c8e..5cc6416cf1a6 100644
> --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c
> +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c
> @@ -77,18 +77,11 @@ static const struct devlink_param otx2_dl_params[] = {
> otx2_dl_mcam_count_validate),
> };
>
> -/* Devlink OPs */
> static int otx2_devlink_info_get(struct devlink *devlink,
> struct devlink_info_req *req,
> struct netlink_ext_ack *extack)
> {
> - struct otx2_devlink *otx2_dl = devlink_priv(devlink);
> - struct otx2_nic *pfvf = otx2_dl->pfvf;
> -
> - if (is_otx2_vf(pfvf->pcifunc))
> - return devlink_info_driver_name_put(req, "rvu_nicvf");
> -
> - return devlink_info_driver_name_put(req, "rvu_nicpf");
> + return 0;
> }
>
> static const struct devlink_ops otx2_devlink_ops = {
> diff --git a/drivers/net/ethernet/marvell/prestera/prestera_devlink.c b/drivers/net/ethernet/marvell/prestera/prestera_devlink.c
> index 84ad05c9f12d..2a4c9df4eb79 100644
> --- a/drivers/net/ethernet/marvell/prestera/prestera_devlink.c
> +++ b/drivers/net/ethernet/marvell/prestera/prestera_devlink.c
> @@ -355,11 +355,6 @@ static int prestera_dl_info_get(struct devlink *dl,
> {
> struct prestera_switch *sw = devlink_priv(dl);
> char buf[16];
> - int err;
> -
> - err = devlink_info_driver_name_put(req, PRESTERA_DRV_NAME);
> - if (err)
> - return err;
>
> snprintf(buf, sizeof(buf), "%d.%d.%d",
> sw->dev->fw_rev.maj,
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
> index cc2ae427dcb0..751bc4a9edcf 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
> @@ -46,10 +46,6 @@ mlx5_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
> u32 running_fw, stored_fw;
> int err;
>
> - err = devlink_info_driver_name_put(req, KBUILD_MODNAME);
> - if (err)
> - return err;
> -
> err = devlink_info_version_fixed_put(req, "fw.psid", dev->board_id);
> if (err)
> return err;
> diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c
> index a83f6bc30072..a0a06e2eff82 100644
> --- a/drivers/net/ethernet/mellanox/mlxsw/core.c
> +++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
> @@ -1459,11 +1459,6 @@ mlxsw_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
> char buf[32];
> int err;
>
> - err = devlink_info_driver_name_put(req,
> - mlxsw_core->bus_info->device_kind);
> - if (err)
> - return err;
> -
> mlxsw_reg_mgir_pack(mgir_pl);
> err = mlxsw_reg_query(mlxsw_core, MLXSW_REG(mgir), mgir_pl);
> if (err)
> diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
> index 8bfd48d50ef0..4c601ff09cd3 100644
> --- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
> +++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
> @@ -239,10 +239,6 @@ nfp_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
> char *buf = NULL;
> int err;
>
> - err = devlink_info_driver_name_put(req, "nfp");
> - if (err)
> - return err;
> -
> vendor = nfp_hwinfo_lookup(pf->hwinfo, "assembly.vendor");
> part = nfp_hwinfo_lookup(pf->hwinfo, "assembly.partno");
> sn = nfp_hwinfo_lookup(pf->hwinfo, "assembly.serial");
> diff --git a/drivers/net/ethernet/pensando/ionic/ionic_devlink.c b/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
> index 567f778433e2..e6ff757895ab 100644
> --- a/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
> +++ b/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
> @@ -26,10 +26,6 @@ static int ionic_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
> char buf[16];
> int err = 0;
>
> - err = devlink_info_driver_name_put(req, IONIC_DRV_NAME);
> - if (err)
> - return err;
> -
> err = devlink_info_version_running_put(req,
> DEVLINK_INFO_VERSION_GENERIC_FW,
> idev->dev_info.fw_version);
> diff --git a/drivers/net/ethernet/qlogic/qed/qed_devlink.c b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
> index 6bb4e165b592..922c47797af6 100644
> --- a/drivers/net/ethernet/qlogic/qed/qed_devlink.c
> +++ b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
> @@ -162,10 +162,6 @@ static int qed_devlink_info_get(struct devlink *devlink,
>
> dev_info = &cdev->common_dev_info;
>
> - err = devlink_info_driver_name_put(req, KBUILD_MODNAME);
> - if (err)
> - return err;
> -
> memcpy(buf, cdev->hwfns[0].hw_info.part_num, sizeof(cdev->hwfns[0].hw_info.part_num));
> buf[sizeof(cdev->hwfns[0].hw_info.part_num)] = 0;
>
> diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c
> index e14686594a71..b962fc8e1397 100644
> --- a/drivers/net/netdevsim/dev.c
> +++ b/drivers/net/netdevsim/dev.c
> @@ -994,9 +994,6 @@ static int nsim_dev_info_get(struct devlink *devlink,
> {
> int err;
>
> - err = devlink_info_driver_name_put(req, DRV_NAME);
> - if (err)
> - return err;
> err = devlink_info_version_stored_put_ext(req, "fw.mgmt", "10.20.30",
> DEVLINK_INFO_VERSION_TYPE_COMPONENT);
> if (err)
> diff --git a/drivers/ptp/ptp_ocp.c b/drivers/ptp/ptp_ocp.c
> index 154d58cbd9ce..4bbaccd543ad 100644
> --- a/drivers/ptp/ptp_ocp.c
> +++ b/drivers/ptp/ptp_ocp.c
> @@ -1647,10 +1647,6 @@ ptp_ocp_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
> char buf[32];
> int err;
>
> - err = devlink_info_driver_name_put(req, KBUILD_MODNAME);
> - if (err)
> - return err;
> -
> fw_image = bp->fw_loader ? "loader" : "fw";
> sprintf(buf, "%d.%d", bp->fw_tag, bp->fw_version);
> err = devlink_info_version_running_put(req, fw_image, buf);
> diff --git a/net/core/devlink.c b/net/core/devlink.c
> index cea154ddce7a..6478135d9ba1 100644
> --- a/net/core/devlink.c
> +++ b/net/core/devlink.c
> @@ -6749,11 +6749,24 @@ int devlink_info_version_running_put_ext(struct devlink_info_req *req,
> }
> EXPORT_SYMBOL_GPL(devlink_info_version_running_put_ext);
>
> +static int devlink_nl_driver_info_get(struct device_driver *drv,
> + struct devlink_info_req *req)
> +{
> + if (!drv)
> + return 0;
> +
> + if (drv->name[0])
> + return devlink_info_driver_name_put(req, drv->name);
> +
> + return 0;
> +}
> +
> static int
> devlink_nl_info_fill(struct sk_buff *msg, struct devlink *devlink,
> enum devlink_command cmd, u32 portid,
> u32 seq, int flags, struct netlink_ext_ack *extack)
> {
> + struct device *dev = devlink_to_dev(devlink);
> struct devlink_info_req req = {};
> void *hdr;
> int err;
> @@ -6771,6 +6784,10 @@ devlink_nl_info_fill(struct sk_buff *msg, struct devlink *devlink,
> if (err)
> goto err_cancel_msg;
>
> + err = devlink_nl_driver_info_get(dev->driver, &req);
> + if (err)
> + goto err_cancel_msg;
> +
> genlmsg_end(msg, hdr);
> return 0;
>