Skip to content

Commit eb0e9fa

Browse files
Jiri Pirkokuba-moo
authored andcommitted
net: devlink: add unlocked variants of devlink_region_create/destroy() functions
Add unlocked variants of devlink_region_create/destroy() functions to be used in drivers called-in with devlink->lock held. Signed-off-by: Jiri Pirko <[email protected]> Reviewed-by: Moshe Shemesh <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 72a4c8c commit eb0e9fa

File tree

2 files changed

+66
-28
lines changed

2 files changed

+66
-28
lines changed

include/net/devlink.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1676,6 +1676,10 @@ int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
16761676
int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
16771677
union devlink_param_value init_val);
16781678
void devlink_param_value_changed(struct devlink *devlink, u32 param_id);
1679+
struct devlink_region *devl_region_create(struct devlink *devlink,
1680+
const struct devlink_region_ops *ops,
1681+
u32 region_max_snapshots,
1682+
u64 region_size);
16791683
struct devlink_region *
16801684
devlink_region_create(struct devlink *devlink,
16811685
const struct devlink_region_ops *ops,
@@ -1684,6 +1688,7 @@ struct devlink_region *
16841688
devlink_port_region_create(struct devlink_port *port,
16851689
const struct devlink_port_region_ops *ops,
16861690
u32 region_max_snapshots, u64 region_size);
1691+
void devl_region_destroy(struct devlink_region *region);
16871692
void devlink_region_destroy(struct devlink_region *region);
16881693
void devlink_port_region_destroy(struct devlink_region *region);
16891694

net/core/devlink.c

Lines changed: 61 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11192,36 +11192,31 @@ void devlink_param_value_changed(struct devlink *devlink, u32 param_id)
1119211192
EXPORT_SYMBOL_GPL(devlink_param_value_changed);
1119311193

1119411194
/**
11195-
* devlink_region_create - create a new address region
11195+
* devl_region_create - create a new address region
1119611196
*
11197-
* @devlink: devlink
11198-
* @ops: region operations and name
11199-
* @region_max_snapshots: Maximum supported number of snapshots for region
11200-
* @region_size: size of region
11197+
* @devlink: devlink
11198+
* @ops: region operations and name
11199+
* @region_max_snapshots: Maximum supported number of snapshots for region
11200+
* @region_size: size of region
1120111201
*/
11202-
struct devlink_region *
11203-
devlink_region_create(struct devlink *devlink,
11204-
const struct devlink_region_ops *ops,
11205-
u32 region_max_snapshots, u64 region_size)
11202+
struct devlink_region *devl_region_create(struct devlink *devlink,
11203+
const struct devlink_region_ops *ops,
11204+
u32 region_max_snapshots,
11205+
u64 region_size)
1120611206
{
1120711207
struct devlink_region *region;
11208-
int err = 0;
11208+
11209+
devl_assert_locked(devlink);
1120911210

1121011211
if (WARN_ON(!ops) || WARN_ON(!ops->destructor))
1121111212
return ERR_PTR(-EINVAL);
1121211213

11213-
devl_lock(devlink);
11214-
11215-
if (devlink_region_get_by_name(devlink, ops->name)) {
11216-
err = -EEXIST;
11217-
goto unlock;
11218-
}
11214+
if (devlink_region_get_by_name(devlink, ops->name))
11215+
return ERR_PTR(-EEXIST);
1121911216

1122011217
region = kzalloc(sizeof(*region), GFP_KERNEL);
11221-
if (!region) {
11222-
err = -ENOMEM;
11223-
goto unlock;
11224-
}
11218+
if (!region)
11219+
return ERR_PTR(-ENOMEM);
1122511220

1122611221
region->devlink = devlink;
1122711222
region->max_snapshots = region_max_snapshots;
@@ -11231,12 +11226,32 @@ devlink_region_create(struct devlink *devlink,
1123111226
list_add_tail(&region->list, &devlink->region_list);
1123211227
devlink_nl_region_notify(region, NULL, DEVLINK_CMD_REGION_NEW);
1123311228

11234-
devl_unlock(devlink);
1123511229
return region;
11230+
}
11231+
EXPORT_SYMBOL_GPL(devl_region_create);
1123611232

11237-
unlock:
11233+
/**
11234+
* devlink_region_create - create a new address region
11235+
*
11236+
* @devlink: devlink
11237+
* @ops: region operations and name
11238+
* @region_max_snapshots: Maximum supported number of snapshots for region
11239+
* @region_size: size of region
11240+
*
11241+
* Context: Takes and release devlink->lock <mutex>.
11242+
*/
11243+
struct devlink_region *
11244+
devlink_region_create(struct devlink *devlink,
11245+
const struct devlink_region_ops *ops,
11246+
u32 region_max_snapshots, u64 region_size)
11247+
{
11248+
struct devlink_region *region;
11249+
11250+
devl_lock(devlink);
11251+
region = devl_region_create(devlink, ops, region_max_snapshots,
11252+
region_size);
1123811253
devl_unlock(devlink);
11239-
return ERR_PTR(err);
11254+
return region;
1124011255
}
1124111256
EXPORT_SYMBOL_GPL(devlink_region_create);
1124211257

@@ -11247,6 +11262,8 @@ EXPORT_SYMBOL_GPL(devlink_region_create);
1124711262
* @ops: region operations and name
1124811263
* @region_max_snapshots: Maximum supported number of snapshots for region
1124911264
* @region_size: size of region
11265+
*
11266+
* Context: Takes and release devlink->lock <mutex>.
1125011267
*/
1125111268
struct devlink_region *
1125211269
devlink_port_region_create(struct devlink_port *port,
@@ -11292,16 +11309,16 @@ devlink_port_region_create(struct devlink_port *port,
1129211309
EXPORT_SYMBOL_GPL(devlink_port_region_create);
1129311310

1129411311
/**
11295-
* devlink_region_destroy - destroy address region
11312+
* devl_region_destroy - destroy address region
1129611313
*
11297-
* @region: devlink region to destroy
11314+
* @region: devlink region to destroy
1129811315
*/
11299-
void devlink_region_destroy(struct devlink_region *region)
11316+
void devl_region_destroy(struct devlink_region *region)
1130011317
{
1130111318
struct devlink *devlink = region->devlink;
1130211319
struct devlink_snapshot *snapshot, *ts;
1130311320

11304-
devl_lock(devlink);
11321+
devl_assert_locked(devlink);
1130511322

1130611323
/* Free all snapshots of region */
1130711324
list_for_each_entry_safe(snapshot, ts, &region->snapshot_list, list)
@@ -11310,9 +11327,25 @@ void devlink_region_destroy(struct devlink_region *region)
1131011327
list_del(&region->list);
1131111328

1131211329
devlink_nl_region_notify(region, NULL, DEVLINK_CMD_REGION_DEL);
11313-
devl_unlock(devlink);
1131411330
kfree(region);
1131511331
}
11332+
EXPORT_SYMBOL_GPL(devl_region_destroy);
11333+
11334+
/**
11335+
* devlink_region_destroy - destroy address region
11336+
*
11337+
* @region: devlink region to destroy
11338+
*
11339+
* Context: Takes and release devlink->lock <mutex>.
11340+
*/
11341+
void devlink_region_destroy(struct devlink_region *region)
11342+
{
11343+
struct devlink *devlink = region->devlink;
11344+
11345+
devl_lock(devlink);
11346+
devl_region_destroy(region);
11347+
devl_unlock(devlink);
11348+
}
1131611349
EXPORT_SYMBOL_GPL(devlink_region_destroy);
1131711350

1131811351
/**

0 commit comments

Comments
 (0)