Merge branch 'net-devlink-return-the-driver-name-in-devlink_nl_info_fill'
authorJakub Kicinski <kuba@kernel.org>
Thu, 1 Dec 2022 05:49:42 +0000 (21:49 -0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 1 Dec 2022 05:49:43 +0000 (21:49 -0800)
Vincent Mailhol says:

====================
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. This same patch also removes the
devlink_info_driver_name_put() function to prevent future drivers from
reporting the driver name themselves.

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

Link: https://lore.kernel.org/r/20221129095140.3913303-1-mailhol.vincent@wanadoo.fr
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
22 files changed:
drivers/crypto/marvell/octeontx2/otx2_cpt_devlink.c
drivers/net/dsa/hirschmann/hellcreek.c
drivers/net/dsa/mv88e6xxx/devlink.c
drivers/net/dsa/sja1105/sja1105_devlink.c
drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth-devlink.c
drivers/net/ethernet/fungible/funeth/funeth_devlink.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.c
drivers/net/ethernet/intel/ice/ice_devlink.c
drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c
drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c
drivers/net/ethernet/marvell/prestera/prestera_devlink.c
drivers/net/ethernet/mellanox/mlx5/core/devlink.c
drivers/net/ethernet/mellanox/mlxsw/core.c
drivers/net/ethernet/netronome/nfp/nfp_devlink.c
drivers/net/ethernet/pensando/ionic/ionic_devlink.c
drivers/net/ethernet/qlogic/qed/qed_devlink.c
drivers/net/netdevsim/dev.c
drivers/ptp/ptp_ocp.c
include/net/devlink.h
net/core/devlink.c

index 7503f6b..a2aba0b 100644 (file)
@@ -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)
index 951f793..595a548 100644 (file)
@@ -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,
index 1266eab..a08dab7 100644 (file)
@@ -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,
index 10c6fea..da53261 100644 (file)
@@ -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)
index 8a6f788..26913dc 100644 (file)
@@ -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],
index 5c6dd30..76f808d 100644 (file)
@@ -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 *
index d50c222..4fbeb3f 100644 (file)
@@ -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 devlink_info_driver_name_put(req, KBUILD_MODNAME);
-}
-
 static const struct devlink_ops fun_dl_ops = {
-       .info_get = fun_dl_info_get,
 };
 
 struct devlink *fun_devlink_alloc(struct device *dev)
index 4c441e6..3d3b696 100644 (file)
@@ -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,
index fdc1986..a6c3c5e 100644 (file)
@@ -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,
index 946d64e..8286e47 100644 (file)
@@ -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);
index 88dee58..bda1a6f 100644 (file)
@@ -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 devlink_info_driver_name_put(req, DRV_NAME);
-}
-
 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,
 };
index 777a270..63ef7c4 100644 (file)
@@ -77,22 +77,7 @@ 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");
-}
-
 static const struct devlink_ops otx2_devlink_ops = {
-       .info_get = otx2_devlink_info_get,
 };
 
 int otx2_register_dl(struct otx2_nic *pfvf)
index 84ad05c..2a4c9df 100644 (file)
@@ -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,
index cc2ae42..751bc4a 100644 (file)
@@ -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;
index a83f6bc..a0a06e2 100644 (file)
@@ -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)
index 784f236..bf6bae5 100644 (file)
@@ -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");
index 567f778..e6ff757 100644 (file)
@@ -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);
index 6bb4e16..922c477 100644 (file)
@@ -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;
 
index e146865..b962fc8 100644 (file)
@@ -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)
index 154d58c..4bbaccd 100644 (file)
@@ -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);
index 02528f7..5f6eca5 100644 (file)
@@ -1762,8 +1762,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);
 
index 298041a..fca3ebe 100644 (file)
@@ -6707,14 +6707,6 @@ out_unlock:
        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)
@@ -6823,11 +6815,25 @@ 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 nla_put_string(req->msg, DEVLINK_ATTR_INFO_DRIVER_NAME,
+                                     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;
@@ -6841,7 +6847,13 @@ 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 (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)
                goto err_cancel_msg;
 
@@ -6860,9 +6872,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;
@@ -6888,7 +6897,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);