Commit 012ec02a authored by Jiri Pirko's avatar Jiri Pirko Committed by Jakub Kicinski

netdevsim: convert driver to use unlocked devlink API during init/fini

Prepare for devlink reload being called with devlink->lock held and
convert the netdevsim driver to use unlocked devlink API during init and
fini flows. Take devl_lock() in reload_down() and reload_up() ops in the
meantime before reload cmd is converted to take the lock itself.
Signed-off-by: default avatarJiri Pirko <jiri@nvidia.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent eb0e9fa2
...@@ -72,16 +72,7 @@ new_port_store(struct device *dev, struct device_attribute *attr, ...@@ -72,16 +72,7 @@ new_port_store(struct device *dev, struct device_attribute *attr,
if (ret) if (ret)
return ret; return ret;
if (!mutex_trylock(&nsim_bus_dev->nsim_bus_reload_lock))
return -EBUSY;
if (nsim_bus_dev->in_reload) {
mutex_unlock(&nsim_bus_dev->nsim_bus_reload_lock);
return -EBUSY;
}
ret = nsim_drv_port_add(nsim_bus_dev, NSIM_DEV_PORT_TYPE_PF, port_index); ret = nsim_drv_port_add(nsim_bus_dev, NSIM_DEV_PORT_TYPE_PF, port_index);
mutex_unlock(&nsim_bus_dev->nsim_bus_reload_lock);
return ret ? ret : count; return ret ? ret : count;
} }
...@@ -102,16 +93,7 @@ del_port_store(struct device *dev, struct device_attribute *attr, ...@@ -102,16 +93,7 @@ del_port_store(struct device *dev, struct device_attribute *attr,
if (ret) if (ret)
return ret; return ret;
if (!mutex_trylock(&nsim_bus_dev->nsim_bus_reload_lock))
return -EBUSY;
if (nsim_bus_dev->in_reload) {
mutex_unlock(&nsim_bus_dev->nsim_bus_reload_lock);
return -EBUSY;
}
ret = nsim_drv_port_del(nsim_bus_dev, NSIM_DEV_PORT_TYPE_PF, port_index); ret = nsim_drv_port_del(nsim_bus_dev, NSIM_DEV_PORT_TYPE_PF, port_index);
mutex_unlock(&nsim_bus_dev->nsim_bus_reload_lock);
return ret ? ret : count; return ret ? ret : count;
} }
...@@ -298,7 +280,6 @@ nsim_bus_dev_new(unsigned int id, unsigned int port_count, unsigned int num_queu ...@@ -298,7 +280,6 @@ nsim_bus_dev_new(unsigned int id, unsigned int port_count, unsigned int num_queu
nsim_bus_dev->num_queues = num_queues; nsim_bus_dev->num_queues = num_queues;
nsim_bus_dev->initial_net = current->nsproxy->net_ns; nsim_bus_dev->initial_net = current->nsproxy->net_ns;
nsim_bus_dev->max_vfs = NSIM_BUS_DEV_MAX_VFS; nsim_bus_dev->max_vfs = NSIM_BUS_DEV_MAX_VFS;
mutex_init(&nsim_bus_dev->nsim_bus_reload_lock);
/* Disallow using nsim_bus_dev */ /* Disallow using nsim_bus_dev */
smp_store_release(&nsim_bus_dev->init, false); smp_store_release(&nsim_bus_dev->init, false);
......
This diff is collapsed.
...@@ -1453,7 +1453,7 @@ static void nsim_fib_set_max_all(struct nsim_fib_data *data, ...@@ -1453,7 +1453,7 @@ static void nsim_fib_set_max_all(struct nsim_fib_data *data,
int err; int err;
u64 val; u64 val;
err = devlink_resource_size_get(devlink, res_ids[i], &val); err = devl_resource_size_get(devlink, res_ids[i], &val);
if (err) if (err)
val = (u64) -1; val = (u64) -1;
nsim_fib_set_max(data, res_ids[i], val); nsim_fib_set_max(data, res_ids[i], val);
...@@ -1562,26 +1562,26 @@ struct nsim_fib_data *nsim_fib_create(struct devlink *devlink, ...@@ -1562,26 +1562,26 @@ struct nsim_fib_data *nsim_fib_create(struct devlink *devlink,
goto err_nexthop_nb_unregister; goto err_nexthop_nb_unregister;
} }
devlink_resource_occ_get_register(devlink, devl_resource_occ_get_register(devlink,
NSIM_RESOURCE_IPV4_FIB, NSIM_RESOURCE_IPV4_FIB,
nsim_fib_ipv4_resource_occ_get, nsim_fib_ipv4_resource_occ_get,
data); data);
devlink_resource_occ_get_register(devlink, devl_resource_occ_get_register(devlink,
NSIM_RESOURCE_IPV4_FIB_RULES, NSIM_RESOURCE_IPV4_FIB_RULES,
nsim_fib_ipv4_rules_res_occ_get, nsim_fib_ipv4_rules_res_occ_get,
data); data);
devlink_resource_occ_get_register(devlink, devl_resource_occ_get_register(devlink,
NSIM_RESOURCE_IPV6_FIB, NSIM_RESOURCE_IPV6_FIB,
nsim_fib_ipv6_resource_occ_get, nsim_fib_ipv6_resource_occ_get,
data); data);
devlink_resource_occ_get_register(devlink, devl_resource_occ_get_register(devlink,
NSIM_RESOURCE_IPV6_FIB_RULES, NSIM_RESOURCE_IPV6_FIB_RULES,
nsim_fib_ipv6_rules_res_occ_get, nsim_fib_ipv6_rules_res_occ_get,
data); data);
devlink_resource_occ_get_register(devlink, devl_resource_occ_get_register(devlink,
NSIM_RESOURCE_NEXTHOPS, NSIM_RESOURCE_NEXTHOPS,
nsim_fib_nexthops_res_occ_get, nsim_fib_nexthops_res_occ_get,
data); data);
return data; return data;
err_nexthop_nb_unregister: err_nexthop_nb_unregister:
...@@ -1604,16 +1604,16 @@ struct nsim_fib_data *nsim_fib_create(struct devlink *devlink, ...@@ -1604,16 +1604,16 @@ struct nsim_fib_data *nsim_fib_create(struct devlink *devlink,
void nsim_fib_destroy(struct devlink *devlink, struct nsim_fib_data *data) void nsim_fib_destroy(struct devlink *devlink, struct nsim_fib_data *data)
{ {
devlink_resource_occ_get_unregister(devlink, devl_resource_occ_get_unregister(devlink,
NSIM_RESOURCE_NEXTHOPS); NSIM_RESOURCE_NEXTHOPS);
devlink_resource_occ_get_unregister(devlink, devl_resource_occ_get_unregister(devlink,
NSIM_RESOURCE_IPV6_FIB_RULES); NSIM_RESOURCE_IPV6_FIB_RULES);
devlink_resource_occ_get_unregister(devlink, devl_resource_occ_get_unregister(devlink,
NSIM_RESOURCE_IPV6_FIB); NSIM_RESOURCE_IPV6_FIB);
devlink_resource_occ_get_unregister(devlink, devl_resource_occ_get_unregister(devlink,
NSIM_RESOURCE_IPV4_FIB_RULES); NSIM_RESOURCE_IPV4_FIB_RULES);
devlink_resource_occ_get_unregister(devlink, devl_resource_occ_get_unregister(devlink,
NSIM_RESOURCE_IPV4_FIB); NSIM_RESOURCE_IPV4_FIB);
unregister_fib_notifier(devlink_net(devlink), &data->fib_nb); unregister_fib_notifier(devlink_net(devlink), &data->fib_nb);
unregister_nexthop_notifier(devlink_net(devlink), &data->nexthop_nb); unregister_nexthop_notifier(devlink_net(devlink), &data->nexthop_nb);
flush_work(&data->fib_event_work); flush_work(&data->fib_event_work);
......
...@@ -376,9 +376,6 @@ struct nsim_bus_dev { ...@@ -376,9 +376,6 @@ struct nsim_bus_dev {
*/ */
unsigned int max_vfs; unsigned int max_vfs;
unsigned int num_vfs; unsigned int num_vfs;
/* Lock for devlink->reload_enabled in netdevsim module */
struct mutex nsim_bus_reload_lock;
bool in_reload;
bool init; bool init;
}; };
......
...@@ -1517,6 +1517,7 @@ struct device *devlink_to_dev(const struct devlink *devlink); ...@@ -1517,6 +1517,7 @@ struct device *devlink_to_dev(const struct devlink *devlink);
/* Devlink instance explicit locking */ /* Devlink instance explicit locking */
void devl_lock(struct devlink *devlink); void devl_lock(struct devlink *devlink);
int devl_trylock(struct devlink *devlink);
void devl_unlock(struct devlink *devlink); void devl_unlock(struct devlink *devlink);
void devl_assert_locked(struct devlink *devlink); void devl_assert_locked(struct devlink *devlink);
bool devl_lock_is_held(struct devlink *devlink); bool devl_lock_is_held(struct devlink *devlink);
......
...@@ -266,6 +266,12 @@ void devl_lock(struct devlink *devlink) ...@@ -266,6 +266,12 @@ void devl_lock(struct devlink *devlink)
} }
EXPORT_SYMBOL_GPL(devl_lock); EXPORT_SYMBOL_GPL(devl_lock);
int devl_trylock(struct devlink *devlink)
{
return mutex_trylock(&devlink->lock);
}
EXPORT_SYMBOL_GPL(devl_trylock);
void devl_unlock(struct devlink *devlink) void devl_unlock(struct devlink *devlink)
{ {
mutex_unlock(&devlink->lock); mutex_unlock(&devlink->lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment