Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

devlink: pass extack through to devlink_param::get()

Allow devlink_param::get() handlers to report error messages via
extack. This function is called in a few different contexts, but not
all of them will have an valid extack to use.

When devlink_param::get() is called from param_get_doit or
param_get_dumpit contexts, pass the extack through so that drivers can
report errors when retrieving param values. devlink_param::get() is
called from the context of devlink_param_notify(), pass NULL in for
the extack.

Reviewed-by: Saeed Mahameed <saeedm@nvidia.com>
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Signed-off-by: Daniel Zahka <daniel.zahka@gmail.com>
Link: https://patch.msgid.link/20251119025038.651131-2-daniel.zahka@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Daniel Zahka and committed by
Jakub Kicinski
011d133b b8f2b678

+89 -46
+4 -2
drivers/crypto/marvell/octeontx2/otx2_cpt_devlink.c
··· 24 24 } 25 25 26 26 static int otx2_cpt_dl_uc_info(struct devlink *dl, u32 id, 27 - struct devlink_param_gset_ctx *ctx) 27 + struct devlink_param_gset_ctx *ctx, 28 + struct netlink_ext_ack *extack) 28 29 { 29 30 ctx->val.vstr[0] = '\0'; 30 31 ··· 33 32 } 34 33 35 34 static int otx2_cpt_dl_t106_mode_get(struct devlink *dl, u32 id, 36 - struct devlink_param_gset_ctx *ctx) 35 + struct devlink_param_gset_ctx *ctx, 36 + struct netlink_ext_ack *extack) 37 37 { 38 38 struct otx2_cpt_devlink *cpt_dl = devlink_priv(dl); 39 39 struct otx2_cptpf_dev *cptpf = cpt_dl->cptpf;
+2 -1
drivers/net/ethernet/amd/pds_core/core.h
··· 255 255 struct devlink_flash_update_params *params, 256 256 struct netlink_ext_ack *extack); 257 257 int pdsc_dl_enable_get(struct devlink *dl, u32 id, 258 - struct devlink_param_gset_ctx *ctx); 258 + struct devlink_param_gset_ctx *ctx, 259 + struct netlink_ext_ack *extack); 259 260 int pdsc_dl_enable_set(struct devlink *dl, u32 id, 260 261 struct devlink_param_gset_ctx *ctx, 261 262 struct netlink_ext_ack *extack);
+2 -1
drivers/net/ethernet/amd/pds_core/devlink.c
··· 22 22 } 23 23 24 24 int pdsc_dl_enable_get(struct devlink *dl, u32 id, 25 - struct devlink_param_gset_ctx *ctx) 25 + struct devlink_param_gset_ctx *ctx, 26 + struct netlink_ext_ack *extack) 26 27 { 27 28 struct pdsc *pdsc = devlink_priv(dl); 28 29 struct pdsc_viftype *vt_entry;
+4 -2
drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
··· 1086 1086 } 1087 1087 1088 1088 static int bnxt_dl_nvm_param_get(struct devlink *dl, u32 id, 1089 - struct devlink_param_gset_ctx *ctx) 1089 + struct devlink_param_gset_ctx *ctx, 1090 + struct netlink_ext_ack *extack) 1090 1091 { 1091 1092 struct bnxt *bp = bnxt_get_bp_from_dl(dl); 1092 1093 struct hwrm_nvm_get_variable_input *req; ··· 1169 1168 } 1170 1169 1171 1170 static int bnxt_remote_dev_reset_get(struct devlink *dl, u32 id, 1172 - struct devlink_param_gset_ctx *ctx) 1171 + struct devlink_param_gset_ctx *ctx, 1172 + struct netlink_ext_ack *extack) 1173 1173 { 1174 1174 struct bnxt *bp = bnxt_get_bp_from_dl(dl); 1175 1175
+2 -1
drivers/net/ethernet/intel/i40e/i40e_devlink.c
··· 24 24 25 25 static int i40e_max_mac_per_vf_get(struct devlink *devlink, 26 26 u32 id, 27 - struct devlink_param_gset_ctx *ctx) 27 + struct devlink_param_gset_ctx *ctx, 28 + struct netlink_ext_ack *extack) 28 29 { 29 30 struct i40e_pf *pf = devlink_priv(devlink); 30 31
+10 -4
drivers/net/ethernet/intel/ice/devlink/devlink.c
··· 610 610 * @devlink: pointer to the devlink instance 611 611 * @id: the parameter ID to set 612 612 * @ctx: context to store the parameter value 613 + * @extack: netlink extended ACK structure 613 614 * 614 615 * Return: zero on success and negative value on failure. 615 616 */ 616 617 static int ice_devlink_tx_sched_layers_get(struct devlink *devlink, u32 id, 617 - struct devlink_param_gset_ctx *ctx) 618 + struct devlink_param_gset_ctx *ctx, 619 + struct netlink_ext_ack *extack) 618 620 { 619 621 struct ice_pf *pf = devlink_priv(devlink); 620 622 int err; ··· 1351 1349 1352 1350 static int 1353 1351 ice_devlink_enable_roce_get(struct devlink *devlink, u32 id, 1354 - struct devlink_param_gset_ctx *ctx) 1352 + struct devlink_param_gset_ctx *ctx, 1353 + struct netlink_ext_ack *extack) 1355 1354 { 1356 1355 struct ice_pf *pf = devlink_priv(devlink); 1357 1356 struct iidc_rdma_core_dev_info *cdev; ··· 1418 1415 1419 1416 static int 1420 1417 ice_devlink_enable_iw_get(struct devlink *devlink, u32 id, 1421 - struct devlink_param_gset_ctx *ctx) 1418 + struct devlink_param_gset_ctx *ctx, 1419 + struct netlink_ext_ack *extack) 1422 1420 { 1423 1421 struct ice_pf *pf = devlink_priv(devlink); 1424 1422 struct iidc_rdma_core_dev_info *cdev; ··· 1526 1522 * @devlink: Pointer to the devlink instance. 1527 1523 * @id: The parameter ID to set. 1528 1524 * @ctx: Context to store the parameter value. 1525 + * @extack: netlink extended ACK structure 1529 1526 * 1530 1527 * Return: Zero. 1531 1528 */ 1532 1529 static int ice_devlink_local_fwd_get(struct devlink *devlink, u32 id, 1533 - struct devlink_param_gset_ctx *ctx) 1530 + struct devlink_param_gset_ctx *ctx, 1531 + struct netlink_ext_ack *extack) 1534 1532 { 1535 1533 struct ice_pf *pf = devlink_priv(devlink); 1536 1534 struct ice_port_info *pi;
+10 -5
drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c
··· 1233 1233 } 1234 1234 1235 1235 static int rvu_af_dl_dwrr_mtu_get(struct devlink *devlink, u32 id, 1236 - struct devlink_param_gset_ctx *ctx) 1236 + struct devlink_param_gset_ctx *ctx, 1237 + struct netlink_ext_ack *extack) 1237 1238 { 1238 1239 struct rvu_devlink *rvu_dl = devlink_priv(devlink); 1239 1240 struct rvu *rvu = rvu_dl->rvu; ··· 1260 1259 }; 1261 1260 1262 1261 static int rvu_af_npc_exact_feature_get(struct devlink *devlink, u32 id, 1263 - struct devlink_param_gset_ctx *ctx) 1262 + struct devlink_param_gset_ctx *ctx, 1263 + struct netlink_ext_ack *extack) 1264 1264 { 1265 1265 struct rvu_devlink *rvu_dl = devlink_priv(devlink); 1266 1266 struct rvu *rvu = rvu_dl->rvu; ··· 1316 1314 } 1317 1315 1318 1316 static int rvu_af_dl_npc_mcam_high_zone_percent_get(struct devlink *devlink, u32 id, 1319 - struct devlink_param_gset_ctx *ctx) 1317 + struct devlink_param_gset_ctx *ctx, 1318 + struct netlink_ext_ack *extack) 1320 1319 { 1321 1320 struct rvu_devlink *rvu_dl = devlink_priv(devlink); 1322 1321 struct rvu *rvu = rvu_dl->rvu; ··· 1379 1376 } 1380 1377 1381 1378 static int rvu_af_dl_npc_def_rule_cntr_get(struct devlink *devlink, u32 id, 1382 - struct devlink_param_gset_ctx *ctx) 1379 + struct devlink_param_gset_ctx *ctx, 1380 + struct netlink_ext_ack *extack) 1383 1381 { 1384 1382 struct rvu_devlink *rvu_dl = devlink_priv(devlink); 1385 1383 struct rvu *rvu = rvu_dl->rvu; ··· 1406 1402 } 1407 1403 1408 1404 static int rvu_af_dl_nix_maxlf_get(struct devlink *devlink, u32 id, 1409 - struct devlink_param_gset_ctx *ctx) 1405 + struct devlink_param_gset_ctx *ctx, 1406 + struct netlink_ext_ack *extack) 1410 1407 { 1411 1408 struct rvu_devlink *rvu_dl = devlink_priv(devlink); 1412 1409 struct rvu *rvu = rvu_dl->rvu;
+4 -2
drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c
··· 48 48 } 49 49 50 50 static int otx2_dl_mcam_count_get(struct devlink *devlink, u32 id, 51 - struct devlink_param_gset_ctx *ctx) 51 + struct devlink_param_gset_ctx *ctx, 52 + struct netlink_ext_ack *extack) 52 53 { 53 54 struct otx2_devlink *otx2_dl = devlink_priv(devlink); 54 55 struct otx2_nic *pfvf = otx2_dl->pfvf; ··· 85 84 } 86 85 87 86 static int otx2_dl_ucast_flt_cnt_get(struct devlink *devlink, u32 id, 88 - struct devlink_param_gset_ctx *ctx) 87 + struct devlink_param_gset_ctx *ctx, 88 + struct netlink_ext_ack *extack) 89 89 { 90 90 struct otx2_devlink *otx2_dl = devlink_priv(devlink); 91 91 struct otx2_nic *pfvf = otx2_dl->pfvf;
+4 -2
drivers/net/ethernet/mellanox/mlx4/main.c
··· 174 174 static atomic_t pf_loading = ATOMIC_INIT(0); 175 175 176 176 static int mlx4_devlink_ierr_reset_get(struct devlink *devlink, u32 id, 177 - struct devlink_param_gset_ctx *ctx) 177 + struct devlink_param_gset_ctx *ctx, 178 + struct netlink_ext_ack *extack) 178 179 { 179 180 ctx->val.vbool = !!mlx4_internal_err_reset; 180 181 return 0; ··· 190 189 } 191 190 192 191 static int mlx4_devlink_crdump_snapshot_get(struct devlink *devlink, u32 id, 193 - struct devlink_param_gset_ctx *ctx) 192 + struct devlink_param_gset_ctx *ctx, 193 + struct netlink_ext_ack *extack) 194 194 { 195 195 struct mlx4_priv *priv = devlink_priv(devlink); 196 196 struct mlx4_dev *dev = &priv->dev;
+2 -1
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
··· 1969 1969 } 1970 1970 1971 1971 static int mlx5_devlink_esw_multiport_get(struct devlink *devlink, u32 id, 1972 - struct devlink_param_gset_ctx *ctx) 1972 + struct devlink_param_gset_ctx *ctx, 1973 + struct netlink_ext_ack *extack) 1973 1974 { 1974 1975 struct mlx5_core_dev *dev = devlink_priv(devlink); 1975 1976
+2 -1
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
··· 2618 2618 } 2619 2619 2620 2620 static int esw_port_metadata_get(struct devlink *devlink, u32 id, 2621 - struct devlink_param_gset_ctx *ctx) 2621 + struct devlink_param_gset_ctx *ctx, 2622 + struct netlink_ext_ack *extack) 2622 2623 { 2623 2624 struct mlx5_core_dev *dev = devlink_priv(devlink); 2624 2625
+2 -1
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
··· 3833 3833 } 3834 3834 3835 3835 static int mlx5_fs_mode_get(struct devlink *devlink, u32 id, 3836 - struct devlink_param_gset_ctx *ctx) 3836 + struct devlink_param_gset_ctx *ctx, 3837 + struct netlink_ext_ack *extack) 3837 3838 { 3838 3839 struct mlx5_core_dev *dev = devlink_priv(devlink); 3839 3840
+2 -1
drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c
··· 73 73 } 74 74 75 75 static int mlx5_fw_reset_enable_remote_dev_reset_get(struct devlink *devlink, u32 id, 76 - struct devlink_param_gset_ctx *ctx) 76 + struct devlink_param_gset_ctx *ctx, 77 + struct netlink_ext_ack *extack) 77 78 { 78 79 struct mlx5_core_dev *dev = devlink_priv(devlink); 79 80 struct mlx5_fw_reset *fw_reset;
+6 -3
drivers/net/ethernet/mellanox/mlx5/core/lib/nv_param.c
··· 200 200 201 201 static int 202 202 mlx5_nv_param_devlink_cqe_compress_get(struct devlink *devlink, u32 id, 203 - struct devlink_param_gset_ctx *ctx) 203 + struct devlink_param_gset_ctx *ctx, 204 + struct netlink_ext_ack *extack) 204 205 { 205 206 struct mlx5_core_dev *dev = devlink_priv(devlink); 206 207 u32 mnvda[MLX5_ST_SZ_DW(mnvda_reg)] = {}; ··· 303 302 } 304 303 305 304 static int mlx5_devlink_enable_sriov_get(struct devlink *devlink, u32 id, 306 - struct devlink_param_gset_ctx *ctx) 305 + struct devlink_param_gset_ctx *ctx, 306 + struct netlink_ext_ack *extack) 307 307 { 308 308 struct mlx5_core_dev *dev = devlink_priv(devlink); 309 309 u32 mnvda[MLX5_ST_SZ_DW(mnvda_reg)] = {}; ··· 415 413 } 416 414 417 415 static int mlx5_devlink_total_vfs_get(struct devlink *devlink, u32 id, 418 - struct devlink_param_gset_ctx *ctx) 416 + struct devlink_param_gset_ctx *ctx, 417 + struct netlink_ext_ack *extack) 419 418 { 420 419 struct mlx5_core_dev *dev = devlink_priv(devlink); 421 420 u32 mnvda[MLX5_ST_SZ_DW(mnvda_reg)] = {};
+2 -1
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c
··· 1489 1489 1490 1490 static int 1491 1491 mlxsw_sp_acl_tcam_region_rehash_intrvl_get(struct devlink *devlink, u32 id, 1492 - struct devlink_param_gset_ctx *ctx) 1492 + struct devlink_param_gset_ctx *ctx, 1493 + struct netlink_ext_ack *extack) 1493 1494 { 1494 1495 struct mlxsw_core *mlxsw_core = devlink_priv(devlink); 1495 1496 struct mlxsw_sp_acl_tcam *tcam;
+2 -1
drivers/net/ethernet/qlogic/qed/qed_devlink.c
··· 121 121 } 122 122 123 123 static int qed_dl_param_get(struct devlink *dl, u32 id, 124 - struct devlink_param_gset_ctx *ctx) 124 + struct devlink_param_gset_ctx *ctx, 125 + struct netlink_ext_ack *extack) 125 126 { 126 127 struct qed_devlink *qed_dl = devlink_priv(dl); 127 128 struct qed_dev *cdev;
+2 -1
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
··· 7531 7531 } 7532 7532 7533 7533 static int stmmac_dl_ts_coarse_get(struct devlink *dl, u32 id, 7534 - struct devlink_param_gset_ctx *ctx) 7534 + struct devlink_param_gset_ctx *ctx, 7535 + struct netlink_ext_ack *extack) 7535 7536 { 7536 7537 struct stmmac_devlink_priv *dl_priv = devlink_priv(dl); 7537 7538 struct stmmac_priv *priv = dl_priv->stmmac_priv;
+2 -1
drivers/net/ethernet/ti/am65-cpsw-nuss.c
··· 3068 3068 } 3069 3069 3070 3070 static int am65_cpsw_dl_switch_mode_get(struct devlink *dl, u32 id, 3071 - struct devlink_param_gset_ctx *ctx) 3071 + struct devlink_param_gset_ctx *ctx, 3072 + struct netlink_ext_ack *extack) 3072 3073 { 3073 3074 struct am65_cpsw_devlink *dl_priv = devlink_priv(dl); 3074 3075 struct am65_cpsw_common *common = dl_priv->common;
+4 -2
drivers/net/ethernet/ti/cpsw_new.c
··· 1618 1618 }; 1619 1619 1620 1620 static int cpsw_dl_switch_mode_get(struct devlink *dl, u32 id, 1621 - struct devlink_param_gset_ctx *ctx) 1621 + struct devlink_param_gset_ctx *ctx, 1622 + struct netlink_ext_ack *extack) 1622 1623 { 1623 1624 struct cpsw_devlink *dl_priv = devlink_priv(dl); 1624 1625 struct cpsw_common *cpsw = dl_priv->cpsw; ··· 1754 1753 } 1755 1754 1756 1755 static int cpsw_dl_ale_ctrl_get(struct devlink *dl, u32 id, 1757 - struct devlink_param_gset_ctx *ctx) 1756 + struct devlink_param_gset_ctx *ctx, 1757 + struct netlink_ext_ack *extack) 1758 1758 { 1759 1759 struct cpsw_devlink *dl_priv = devlink_priv(dl); 1760 1760 struct cpsw_common *cpsw = dl_priv->cpsw;
+2 -1
drivers/net/wwan/iosm/iosm_ipc_devlink.c
··· 21 21 22 22 /* Get the param values for the specific param ID's */ 23 23 static int ipc_devlink_get_param(struct devlink *dl, u32 id, 24 - struct devlink_param_gset_ctx *ctx) 24 + struct devlink_param_gset_ctx *ctx, 25 + struct netlink_ext_ack *extack) 25 26 { 26 27 struct iosm_devlink *ipc_devlink = devlink_priv(dl); 27 28
+2 -1
include/net/devlink.h
··· 490 490 enum devlink_param_type type; 491 491 unsigned long supported_cmodes; 492 492 int (*get)(struct devlink *devlink, u32 id, 493 - struct devlink_param_gset_ctx *ctx); 493 + struct devlink_param_gset_ctx *ctx, 494 + struct netlink_ext_ack *extack); 494 495 int (*set)(struct devlink *devlink, u32 id, 495 496 struct devlink_param_gset_ctx *ctx, 496 497 struct netlink_ext_ack *extack);
+2 -1
include/net/dsa.h
··· 1251 1251 dsa_devlink_param_get, dsa_devlink_param_set, NULL) 1252 1252 1253 1253 int dsa_devlink_param_get(struct devlink *dl, u32 id, 1254 - struct devlink_param_gset_ctx *ctx); 1254 + struct devlink_param_gset_ctx *ctx, 1255 + struct netlink_ext_ack *extack); 1255 1256 int dsa_devlink_param_set(struct devlink *dl, u32 id, 1256 1257 struct devlink_param_gset_ctx *ctx, 1257 1258 struct netlink_ext_ack *extack);
+11 -8
net/devlink/param.c
··· 174 174 175 175 static int devlink_param_get(struct devlink *devlink, 176 176 const struct devlink_param *param, 177 - struct devlink_param_gset_ctx *ctx) 177 + struct devlink_param_gset_ctx *ctx, 178 + struct netlink_ext_ack *extack) 178 179 { 179 180 if (!param->get) 180 181 return -EOPNOTSUPP; 181 - return param->get(devlink, param->id, ctx); 182 + return param->get(devlink, param->id, ctx, extack); 182 183 } 183 184 184 185 static int devlink_param_set(struct devlink *devlink, ··· 251 250 unsigned int port_index, 252 251 struct devlink_param_item *param_item, 253 252 enum devlink_command cmd, 254 - u32 portid, u32 seq, int flags) 253 + u32 portid, u32 seq, int flags, 254 + struct netlink_ext_ack *extack) 255 255 { 256 256 union devlink_param_value param_value[DEVLINK_PARAM_CMODE_MAX + 1]; 257 257 bool param_value_set[DEVLINK_PARAM_CMODE_MAX + 1] = {}; ··· 277 275 return -EOPNOTSUPP; 278 276 } else { 279 277 ctx.cmode = i; 280 - err = devlink_param_get(devlink, param, &ctx); 278 + err = devlink_param_get(devlink, param, &ctx, extack); 281 279 if (err) 282 280 return err; 283 281 param_value[i] = ctx.val; ··· 359 357 if (!msg) 360 358 return; 361 359 err = devlink_nl_param_fill(msg, devlink, port_index, param_item, cmd, 362 - 0, 0, 0); 360 + 0, 0, 0, NULL); 363 361 if (err) { 364 362 nlmsg_free(msg); 365 363 return; ··· 402 400 err = devlink_nl_param_fill(msg, devlink, 0, param_item, 403 401 DEVLINK_CMD_PARAM_GET, 404 402 NETLINK_CB(cb->skb).portid, 405 - cb->nlh->nlmsg_seq, flags); 403 + cb->nlh->nlmsg_seq, flags, 404 + cb->extack); 406 405 if (err == -EOPNOTSUPP) { 407 406 err = 0; 408 407 } else if (err) { ··· 512 509 return -ENOMEM; 513 510 514 511 err = devlink_nl_param_fill(msg, devlink, 0, param_item, 515 - DEVLINK_CMD_PARAM_GET, 516 - info->snd_portid, info->snd_seq, 0); 512 + DEVLINK_CMD_PARAM_GET, info->snd_portid, 513 + info->snd_seq, 0, info->extack); 517 514 if (err) { 518 515 nlmsg_free(msg); 519 516 return err;
+2 -1
net/dsa/devlink.c
··· 182 182 }; 183 183 184 184 int dsa_devlink_param_get(struct devlink *dl, u32 id, 185 - struct devlink_param_gset_ctx *ctx) 185 + struct devlink_param_gset_ctx *ctx, 186 + struct netlink_ext_ack *extack) 186 187 { 187 188 struct dsa_switch *ds = dsa_devlink_to_ds(dl); 188 189