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 <jiri@nvidia.com> Reviewed-by: Moshe Shemesh <moshe@nvidia.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
72a4c8c94e
commit
eb0e9fa2c6
@ -1676,6 +1676,10 @@ int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
|
||||
int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
|
||||
union devlink_param_value init_val);
|
||||
void devlink_param_value_changed(struct devlink *devlink, u32 param_id);
|
||||
struct devlink_region *devl_region_create(struct devlink *devlink,
|
||||
const struct devlink_region_ops *ops,
|
||||
u32 region_max_snapshots,
|
||||
u64 region_size);
|
||||
struct devlink_region *
|
||||
devlink_region_create(struct devlink *devlink,
|
||||
const struct devlink_region_ops *ops,
|
||||
@ -1684,6 +1688,7 @@ struct devlink_region *
|
||||
devlink_port_region_create(struct devlink_port *port,
|
||||
const struct devlink_port_region_ops *ops,
|
||||
u32 region_max_snapshots, u64 region_size);
|
||||
void devl_region_destroy(struct devlink_region *region);
|
||||
void devlink_region_destroy(struct devlink_region *region);
|
||||
void devlink_port_region_destroy(struct devlink_region *region);
|
||||
|
||||
|
@ -11192,36 +11192,31 @@ void devlink_param_value_changed(struct devlink *devlink, u32 param_id)
|
||||
EXPORT_SYMBOL_GPL(devlink_param_value_changed);
|
||||
|
||||
/**
|
||||
* devlink_region_create - create a new address region
|
||||
* devl_region_create - create a new address region
|
||||
*
|
||||
* @devlink: devlink
|
||||
* @ops: region operations and name
|
||||
* @region_max_snapshots: Maximum supported number of snapshots for region
|
||||
* @region_size: size of region
|
||||
* @devlink: devlink
|
||||
* @ops: region operations and name
|
||||
* @region_max_snapshots: Maximum supported number of snapshots for region
|
||||
* @region_size: size of region
|
||||
*/
|
||||
struct devlink_region *
|
||||
devlink_region_create(struct devlink *devlink,
|
||||
const struct devlink_region_ops *ops,
|
||||
u32 region_max_snapshots, u64 region_size)
|
||||
struct devlink_region *devl_region_create(struct devlink *devlink,
|
||||
const struct devlink_region_ops *ops,
|
||||
u32 region_max_snapshots,
|
||||
u64 region_size)
|
||||
{
|
||||
struct devlink_region *region;
|
||||
int err = 0;
|
||||
|
||||
devl_assert_locked(devlink);
|
||||
|
||||
if (WARN_ON(!ops) || WARN_ON(!ops->destructor))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
devl_lock(devlink);
|
||||
|
||||
if (devlink_region_get_by_name(devlink, ops->name)) {
|
||||
err = -EEXIST;
|
||||
goto unlock;
|
||||
}
|
||||
if (devlink_region_get_by_name(devlink, ops->name))
|
||||
return ERR_PTR(-EEXIST);
|
||||
|
||||
region = kzalloc(sizeof(*region), GFP_KERNEL);
|
||||
if (!region) {
|
||||
err = -ENOMEM;
|
||||
goto unlock;
|
||||
}
|
||||
if (!region)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
region->devlink = devlink;
|
||||
region->max_snapshots = region_max_snapshots;
|
||||
@ -11231,12 +11226,32 @@ devlink_region_create(struct devlink *devlink,
|
||||
list_add_tail(®ion->list, &devlink->region_list);
|
||||
devlink_nl_region_notify(region, NULL, DEVLINK_CMD_REGION_NEW);
|
||||
|
||||
return region;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devl_region_create);
|
||||
|
||||
/**
|
||||
* devlink_region_create - create a new address region
|
||||
*
|
||||
* @devlink: devlink
|
||||
* @ops: region operations and name
|
||||
* @region_max_snapshots: Maximum supported number of snapshots for region
|
||||
* @region_size: size of region
|
||||
*
|
||||
* Context: Takes and release devlink->lock <mutex>.
|
||||
*/
|
||||
struct devlink_region *
|
||||
devlink_region_create(struct devlink *devlink,
|
||||
const struct devlink_region_ops *ops,
|
||||
u32 region_max_snapshots, u64 region_size)
|
||||
{
|
||||
struct devlink_region *region;
|
||||
|
||||
devl_lock(devlink);
|
||||
region = devl_region_create(devlink, ops, region_max_snapshots,
|
||||
region_size);
|
||||
devl_unlock(devlink);
|
||||
return region;
|
||||
|
||||
unlock:
|
||||
devl_unlock(devlink);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_region_create);
|
||||
|
||||
@ -11247,6 +11262,8 @@ EXPORT_SYMBOL_GPL(devlink_region_create);
|
||||
* @ops: region operations and name
|
||||
* @region_max_snapshots: Maximum supported number of snapshots for region
|
||||
* @region_size: size of region
|
||||
*
|
||||
* Context: Takes and release devlink->lock <mutex>.
|
||||
*/
|
||||
struct devlink_region *
|
||||
devlink_port_region_create(struct devlink_port *port,
|
||||
@ -11292,16 +11309,16 @@ unlock:
|
||||
EXPORT_SYMBOL_GPL(devlink_port_region_create);
|
||||
|
||||
/**
|
||||
* devlink_region_destroy - destroy address region
|
||||
* devl_region_destroy - destroy address region
|
||||
*
|
||||
* @region: devlink region to destroy
|
||||
* @region: devlink region to destroy
|
||||
*/
|
||||
void devlink_region_destroy(struct devlink_region *region)
|
||||
void devl_region_destroy(struct devlink_region *region)
|
||||
{
|
||||
struct devlink *devlink = region->devlink;
|
||||
struct devlink_snapshot *snapshot, *ts;
|
||||
|
||||
devl_lock(devlink);
|
||||
devl_assert_locked(devlink);
|
||||
|
||||
/* Free all snapshots of region */
|
||||
list_for_each_entry_safe(snapshot, ts, ®ion->snapshot_list, list)
|
||||
@ -11310,9 +11327,25 @@ void devlink_region_destroy(struct devlink_region *region)
|
||||
list_del(®ion->list);
|
||||
|
||||
devlink_nl_region_notify(region, NULL, DEVLINK_CMD_REGION_DEL);
|
||||
devl_unlock(devlink);
|
||||
kfree(region);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devl_region_destroy);
|
||||
|
||||
/**
|
||||
* devlink_region_destroy - destroy address region
|
||||
*
|
||||
* @region: devlink region to destroy
|
||||
*
|
||||
* Context: Takes and release devlink->lock <mutex>.
|
||||
*/
|
||||
void devlink_region_destroy(struct devlink_region *region)
|
||||
{
|
||||
struct devlink *devlink = region->devlink;
|
||||
|
||||
devl_lock(devlink);
|
||||
devl_region_destroy(region);
|
||||
devl_unlock(devlink);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_region_destroy);
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user