Skip to content

Commit 238052e

Browse files
committed
Merge branch 'devlink-params-cleanup'
Jiri Pirko says: ==================== devlink: params cleanups and devl_param_driverinit_value_get() fix The primary motivation of this patchset is the patch #6, which fixes an issue introduced by 075935f ("devlink: protect devlink param list by instance lock") and reported by Kim Phillips <[email protected]> (https://lore.kernel.org/netdev/[email protected]/) and my colleagues doing mlx5 driver regression testing. The basis idea is that devl_param_driverinit_value_get() could be possible to the called without holding devlink intance lock in most of the cases (all existing ones in the current codebase), which would fix some mlx5 flows where the lock is not held. To achieve that, make sure that the param value does not change between reloads with patch #2. Also, convert the param list to xarray which removes the worry about list_head consistency when doing lockless lookup. The rest of the patches are doing some small related cleanup of things that poke me in the eye during the work. --- v1->v2: - a small bug was fixed in patch #2, the rest of the code stays the same so I left review/ack tags attached to them ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 170677f + 6b4bfa4 commit 238052e

File tree

5 files changed

+91
-66
lines changed

5 files changed

+91
-66
lines changed

include/net/devlink.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,10 @@ struct devlink_param_item {
489489
const struct devlink_param *param;
490490
union devlink_param_value driverinit_value;
491491
bool driverinit_value_valid;
492+
union devlink_param_value driverinit_value_new; /* Not reachable
493+
* until reload.
494+
*/
495+
bool driverinit_value_new_valid;
492496
};
493497

494498
enum devlink_param_generic_id {
@@ -1780,7 +1784,7 @@ void devlink_params_unregister(struct devlink *devlink,
17801784
const struct devlink_param *params,
17811785
size_t params_count);
17821786
int devl_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
1783-
union devlink_param_value *init_val);
1787+
union devlink_param_value *val);
17841788
void devl_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
17851789
union devlink_param_value init_val);
17861790
void devl_param_value_changed(struct devlink *devlink, u32 param_id);

net/devlink/core.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,14 +212,14 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
212212
devlink->dev = dev;
213213
devlink->ops = ops;
214214
xa_init_flags(&devlink->ports, XA_FLAGS_ALLOC);
215+
xa_init_flags(&devlink->params, XA_FLAGS_ALLOC);
215216
xa_init_flags(&devlink->snapshot_ids, XA_FLAGS_ALLOC);
216217
write_pnet(&devlink->_net, net);
217218
INIT_LIST_HEAD(&devlink->rate_list);
218219
INIT_LIST_HEAD(&devlink->linecard_list);
219220
INIT_LIST_HEAD(&devlink->sb_list);
220221
INIT_LIST_HEAD_RCU(&devlink->dpipe_table_list);
221222
INIT_LIST_HEAD(&devlink->resource_list);
222-
INIT_LIST_HEAD(&devlink->param_list);
223223
INIT_LIST_HEAD(&devlink->region_list);
224224
INIT_LIST_HEAD(&devlink->reporter_list);
225225
INIT_LIST_HEAD(&devlink->trap_list);
@@ -255,7 +255,6 @@ void devlink_free(struct devlink *devlink)
255255
WARN_ON(!list_empty(&devlink->trap_list));
256256
WARN_ON(!list_empty(&devlink->reporter_list));
257257
WARN_ON(!list_empty(&devlink->region_list));
258-
WARN_ON(!list_empty(&devlink->param_list));
259258
WARN_ON(!list_empty(&devlink->resource_list));
260259
WARN_ON(!list_empty(&devlink->dpipe_table_list));
261260
WARN_ON(!list_empty(&devlink->sb_list));
@@ -264,6 +263,7 @@ void devlink_free(struct devlink *devlink)
264263
WARN_ON(!xa_empty(&devlink->ports));
265264

266265
xa_destroy(&devlink->snapshot_ids);
266+
xa_destroy(&devlink->params);
267267
xa_destroy(&devlink->ports);
268268

269269
WARN_ON_ONCE(unregister_netdevice_notifier(&devlink->netdevice_nb));

net/devlink/dev.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,9 @@ int devlink_reload(struct devlink *devlink, struct net *dest_net,
369369
if (dest_net && !net_eq(dest_net, curr_net))
370370
devlink_reload_netns_change(devlink, curr_net, dest_net);
371371

372+
if (action == DEVLINK_RELOAD_ACTION_DRIVER_REINIT)
373+
devlink_params_driverinit_load_new(devlink);
374+
372375
err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack);
373376
devlink_reload_failed_set(devlink, !!err);
374377
if (err)

net/devlink/devl_internal.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ struct devlink {
2929
struct list_head sb_list;
3030
struct list_head dpipe_table_list;
3131
struct list_head resource_list;
32-
struct list_head param_list;
32+
struct xarray params;
3333
struct list_head region_list;
3434
struct list_head reporter_list;
3535
struct devlink_dpipe_headers *dpipe_headers;
@@ -189,6 +189,9 @@ static inline bool devlink_reload_supported(const struct devlink_ops *ops)
189189
return ops->reload_down && ops->reload_up;
190190
}
191191

192+
/* Params */
193+
void devlink_params_driverinit_load_new(struct devlink *devlink);
194+
192195
/* Resources */
193196
struct devlink_resource;
194197
int devlink_resources_validate(struct devlink *devlink,

0 commit comments

Comments
 (0)