Skip to content

Commit 012ec02

Browse files
Jiri Pirkokuba-moo
authored andcommitted
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: Jiri Pirko <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent eb0e9fa commit 012ec02

File tree

6 files changed

+102
-123
lines changed

6 files changed

+102
-123
lines changed

drivers/net/netdevsim/bus.c

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,7 @@ new_port_store(struct device *dev, struct device_attribute *attr,
7272
if (ret)
7373
return ret;
7474

75-
if (!mutex_trylock(&nsim_bus_dev->nsim_bus_reload_lock))
76-
return -EBUSY;
77-
78-
if (nsim_bus_dev->in_reload) {
79-
mutex_unlock(&nsim_bus_dev->nsim_bus_reload_lock);
80-
return -EBUSY;
81-
}
82-
8375
ret = nsim_drv_port_add(nsim_bus_dev, NSIM_DEV_PORT_TYPE_PF, port_index);
84-
mutex_unlock(&nsim_bus_dev->nsim_bus_reload_lock);
8576
return ret ? ret : count;
8677
}
8778

@@ -102,16 +93,7 @@ del_port_store(struct device *dev, struct device_attribute *attr,
10293
if (ret)
10394
return ret;
10495

105-
if (!mutex_trylock(&nsim_bus_dev->nsim_bus_reload_lock))
106-
return -EBUSY;
107-
108-
if (nsim_bus_dev->in_reload) {
109-
mutex_unlock(&nsim_bus_dev->nsim_bus_reload_lock);
110-
return -EBUSY;
111-
}
112-
11396
ret = nsim_drv_port_del(nsim_bus_dev, NSIM_DEV_PORT_TYPE_PF, port_index);
114-
mutex_unlock(&nsim_bus_dev->nsim_bus_reload_lock);
11597
return ret ? ret : count;
11698
}
11799

@@ -298,7 +280,6 @@ nsim_bus_dev_new(unsigned int id, unsigned int port_count, unsigned int num_queu
298280
nsim_bus_dev->num_queues = num_queues;
299281
nsim_bus_dev->initial_net = current->nsproxy->net_ns;
300282
nsim_bus_dev->max_vfs = NSIM_BUS_DEV_MAX_VFS;
301-
mutex_init(&nsim_bus_dev->nsim_bus_reload_lock);
302283
/* Disallow using nsim_bus_dev */
303284
smp_store_release(&nsim_bus_dev->init, false);
304285

drivers/net/netdevsim/dev.c

Lines changed: 64 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -436,62 +436,62 @@ static int nsim_dev_resources_register(struct devlink *devlink)
436436
int err;
437437

438438
/* Resources for IPv4 */
439-
err = devlink_resource_register(devlink, "IPv4", (u64)-1,
440-
NSIM_RESOURCE_IPV4,
441-
DEVLINK_RESOURCE_ID_PARENT_TOP,
442-
&params);
439+
err = devl_resource_register(devlink, "IPv4", (u64)-1,
440+
NSIM_RESOURCE_IPV4,
441+
DEVLINK_RESOURCE_ID_PARENT_TOP,
442+
&params);
443443
if (err) {
444444
pr_err("Failed to register IPv4 top resource\n");
445445
goto out;
446446
}
447447

448-
err = devlink_resource_register(devlink, "fib", (u64)-1,
449-
NSIM_RESOURCE_IPV4_FIB,
450-
NSIM_RESOURCE_IPV4, &params);
448+
err = devl_resource_register(devlink, "fib", (u64)-1,
449+
NSIM_RESOURCE_IPV4_FIB,
450+
NSIM_RESOURCE_IPV4, &params);
451451
if (err) {
452452
pr_err("Failed to register IPv4 FIB resource\n");
453453
return err;
454454
}
455455

456-
err = devlink_resource_register(devlink, "fib-rules", (u64)-1,
457-
NSIM_RESOURCE_IPV4_FIB_RULES,
458-
NSIM_RESOURCE_IPV4, &params);
456+
err = devl_resource_register(devlink, "fib-rules", (u64)-1,
457+
NSIM_RESOURCE_IPV4_FIB_RULES,
458+
NSIM_RESOURCE_IPV4, &params);
459459
if (err) {
460460
pr_err("Failed to register IPv4 FIB rules resource\n");
461461
return err;
462462
}
463463

464464
/* Resources for IPv6 */
465-
err = devlink_resource_register(devlink, "IPv6", (u64)-1,
466-
NSIM_RESOURCE_IPV6,
467-
DEVLINK_RESOURCE_ID_PARENT_TOP,
468-
&params);
465+
err = devl_resource_register(devlink, "IPv6", (u64)-1,
466+
NSIM_RESOURCE_IPV6,
467+
DEVLINK_RESOURCE_ID_PARENT_TOP,
468+
&params);
469469
if (err) {
470470
pr_err("Failed to register IPv6 top resource\n");
471471
goto out;
472472
}
473473

474-
err = devlink_resource_register(devlink, "fib", (u64)-1,
475-
NSIM_RESOURCE_IPV6_FIB,
476-
NSIM_RESOURCE_IPV6, &params);
474+
err = devl_resource_register(devlink, "fib", (u64)-1,
475+
NSIM_RESOURCE_IPV6_FIB,
476+
NSIM_RESOURCE_IPV6, &params);
477477
if (err) {
478478
pr_err("Failed to register IPv6 FIB resource\n");
479479
return err;
480480
}
481481

482-
err = devlink_resource_register(devlink, "fib-rules", (u64)-1,
483-
NSIM_RESOURCE_IPV6_FIB_RULES,
484-
NSIM_RESOURCE_IPV6, &params);
482+
err = devl_resource_register(devlink, "fib-rules", (u64)-1,
483+
NSIM_RESOURCE_IPV6_FIB_RULES,
484+
NSIM_RESOURCE_IPV6, &params);
485485
if (err) {
486486
pr_err("Failed to register IPv6 FIB rules resource\n");
487487
return err;
488488
}
489489

490490
/* Resources for nexthops */
491-
err = devlink_resource_register(devlink, "nexthops", (u64)-1,
492-
NSIM_RESOURCE_NEXTHOPS,
493-
DEVLINK_RESOURCE_ID_PARENT_TOP,
494-
&params);
491+
err = devl_resource_register(devlink, "nexthops", (u64)-1,
492+
NSIM_RESOURCE_NEXTHOPS,
493+
DEVLINK_RESOURCE_ID_PARENT_TOP,
494+
&params);
495495

496496
out:
497497
return err;
@@ -557,15 +557,15 @@ static int nsim_dev_dummy_region_init(struct nsim_dev *nsim_dev,
557557
struct devlink *devlink)
558558
{
559559
nsim_dev->dummy_region =
560-
devlink_region_create(devlink, &dummy_region_ops,
561-
NSIM_DEV_DUMMY_REGION_SNAPSHOT_MAX,
562-
NSIM_DEV_DUMMY_REGION_SIZE);
560+
devl_region_create(devlink, &dummy_region_ops,
561+
NSIM_DEV_DUMMY_REGION_SNAPSHOT_MAX,
562+
NSIM_DEV_DUMMY_REGION_SIZE);
563563
return PTR_ERR_OR_ZERO(nsim_dev->dummy_region);
564564
}
565565

566566
static void nsim_dev_dummy_region_exit(struct nsim_dev *nsim_dev)
567567
{
568-
devlink_region_destroy(nsim_dev->dummy_region);
568+
devl_region_destroy(nsim_dev->dummy_region);
569569
}
570570

571571
static int
@@ -832,7 +832,11 @@ static void nsim_dev_trap_report_work(struct work_struct *work)
832832
/* For each running port and enabled packet trap, generate a UDP
833833
* packet with a random 5-tuple and report it.
834834
*/
835-
devl_lock(priv_to_devlink(nsim_dev));
835+
if (!devl_trylock(priv_to_devlink(nsim_dev))) {
836+
schedule_delayed_work(&nsim_dev->trap_data->trap_report_dw, 0);
837+
return;
838+
}
839+
836840
list_for_each_entry(nsim_dev_port, &nsim_dev->port_list, list) {
837841
if (!netif_running(nsim_dev_port->ns->netdev))
838842
continue;
@@ -880,18 +884,18 @@ static int nsim_dev_traps_init(struct devlink *devlink)
880884
nsim_trap_data->nsim_dev = nsim_dev;
881885
nsim_dev->trap_data = nsim_trap_data;
882886

883-
err = devlink_trap_policers_register(devlink, nsim_trap_policers_arr,
884-
policers_count);
887+
err = devl_trap_policers_register(devlink, nsim_trap_policers_arr,
888+
policers_count);
885889
if (err)
886890
goto err_trap_policers_cnt_free;
887891

888-
err = devlink_trap_groups_register(devlink, nsim_trap_groups_arr,
889-
ARRAY_SIZE(nsim_trap_groups_arr));
892+
err = devl_trap_groups_register(devlink, nsim_trap_groups_arr,
893+
ARRAY_SIZE(nsim_trap_groups_arr));
890894
if (err)
891895
goto err_trap_policers_unregister;
892896

893-
err = devlink_traps_register(devlink, nsim_traps_arr,
894-
ARRAY_SIZE(nsim_traps_arr), NULL);
897+
err = devl_traps_register(devlink, nsim_traps_arr,
898+
ARRAY_SIZE(nsim_traps_arr), NULL);
895899
if (err)
896900
goto err_trap_groups_unregister;
897901

@@ -903,11 +907,11 @@ static int nsim_dev_traps_init(struct devlink *devlink)
903907
return 0;
904908

905909
err_trap_groups_unregister:
906-
devlink_trap_groups_unregister(devlink, nsim_trap_groups_arr,
907-
ARRAY_SIZE(nsim_trap_groups_arr));
910+
devl_trap_groups_unregister(devlink, nsim_trap_groups_arr,
911+
ARRAY_SIZE(nsim_trap_groups_arr));
908912
err_trap_policers_unregister:
909-
devlink_trap_policers_unregister(devlink, nsim_trap_policers_arr,
910-
ARRAY_SIZE(nsim_trap_policers_arr));
913+
devl_trap_policers_unregister(devlink, nsim_trap_policers_arr,
914+
ARRAY_SIZE(nsim_trap_policers_arr));
911915
err_trap_policers_cnt_free:
912916
kfree(nsim_trap_data->trap_policers_cnt_arr);
913917
err_trap_items_free:
@@ -923,12 +927,12 @@ static void nsim_dev_traps_exit(struct devlink *devlink)
923927

924928
/* caution, trap work takes devlink lock */
925929
cancel_delayed_work_sync(&nsim_dev->trap_data->trap_report_dw);
926-
devlink_traps_unregister(devlink, nsim_traps_arr,
927-
ARRAY_SIZE(nsim_traps_arr));
928-
devlink_trap_groups_unregister(devlink, nsim_trap_groups_arr,
929-
ARRAY_SIZE(nsim_trap_groups_arr));
930-
devlink_trap_policers_unregister(devlink, nsim_trap_policers_arr,
931-
ARRAY_SIZE(nsim_trap_policers_arr));
930+
devl_traps_unregister(devlink, nsim_traps_arr,
931+
ARRAY_SIZE(nsim_traps_arr));
932+
devl_trap_groups_unregister(devlink, nsim_trap_groups_arr,
933+
ARRAY_SIZE(nsim_trap_groups_arr));
934+
devl_trap_policers_unregister(devlink, nsim_trap_policers_arr,
935+
ARRAY_SIZE(nsim_trap_policers_arr));
932936
kfree(nsim_dev->trap_data->trap_policers_cnt_arr);
933937
kfree(nsim_dev->trap_data->trap_items_arr);
934938
kfree(nsim_dev->trap_data);
@@ -943,24 +947,19 @@ static int nsim_dev_reload_down(struct devlink *devlink, bool netns_change,
943947
struct netlink_ext_ack *extack)
944948
{
945949
struct nsim_dev *nsim_dev = devlink_priv(devlink);
946-
struct nsim_bus_dev *nsim_bus_dev;
947-
948-
nsim_bus_dev = nsim_dev->nsim_bus_dev;
949-
if (!mutex_trylock(&nsim_bus_dev->nsim_bus_reload_lock))
950-
return -EOPNOTSUPP;
951950

951+
devl_lock(devlink);
952952
if (nsim_dev->dont_allow_reload) {
953953
/* For testing purposes, user set debugfs dont_allow_reload
954954
* value to true. So forbid it.
955955
*/
956956
NL_SET_ERR_MSG_MOD(extack, "User forbid the reload for testing purposes");
957-
mutex_unlock(&nsim_bus_dev->nsim_bus_reload_lock);
957+
devl_unlock(devlink);
958958
return -EOPNOTSUPP;
959959
}
960-
nsim_bus_dev->in_reload = true;
961960

962961
nsim_dev_reload_destroy(nsim_dev);
963-
mutex_unlock(&nsim_bus_dev->nsim_bus_reload_lock);
962+
devl_unlock(devlink);
964963
return 0;
965964
}
966965

@@ -969,25 +968,21 @@ static int nsim_dev_reload_up(struct devlink *devlink, enum devlink_reload_actio
969968
struct netlink_ext_ack *extack)
970969
{
971970
struct nsim_dev *nsim_dev = devlink_priv(devlink);
972-
struct nsim_bus_dev *nsim_bus_dev;
973971
int ret;
974972

975-
nsim_bus_dev = nsim_dev->nsim_bus_dev;
976-
mutex_lock(&nsim_bus_dev->nsim_bus_reload_lock);
977-
nsim_bus_dev->in_reload = false;
978-
973+
devl_lock(devlink);
979974
if (nsim_dev->fail_reload) {
980975
/* For testing purposes, user set debugfs fail_reload
981976
* value to true. Fail right away.
982977
*/
983978
NL_SET_ERR_MSG_MOD(extack, "User setup the reload to fail for testing purposes");
984-
mutex_unlock(&nsim_bus_dev->nsim_bus_reload_lock);
979+
devl_unlock(devlink);
985980
return -EINVAL;
986981
}
987982

988983
*actions_performed = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT);
989984
ret = nsim_dev_reload_create(nsim_dev, extack);
990-
mutex_unlock(&nsim_bus_dev->nsim_bus_reload_lock);
985+
devl_unlock(devlink);
991986
return ret;
992987
}
993988

@@ -1434,11 +1429,9 @@ static void nsim_dev_port_del_all(struct nsim_dev *nsim_dev)
14341429
{
14351430
struct nsim_dev_port *nsim_dev_port, *tmp;
14361431

1437-
devl_lock(priv_to_devlink(nsim_dev));
14381432
list_for_each_entry_safe(nsim_dev_port, tmp,
14391433
&nsim_dev->port_list, list)
14401434
__nsim_dev_port_del(nsim_dev_port);
1441-
devl_unlock(priv_to_devlink(nsim_dev));
14421435
}
14431436

14441437
static int nsim_dev_port_add_all(struct nsim_dev *nsim_dev,
@@ -1447,9 +1440,7 @@ static int nsim_dev_port_add_all(struct nsim_dev *nsim_dev,
14471440
int i, err;
14481441

14491442
for (i = 0; i < port_count; i++) {
1450-
devl_lock(priv_to_devlink(nsim_dev));
14511443
err = __nsim_dev_port_add(nsim_dev, NSIM_DEV_PORT_TYPE_PF, i);
1452-
devl_unlock(priv_to_devlink(nsim_dev));
14531444
if (err)
14541445
goto err_port_del_all;
14551446
}
@@ -1537,6 +1528,7 @@ int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev)
15371528
nsim_bus_dev->initial_net, &nsim_bus_dev->dev);
15381529
if (!devlink)
15391530
return -ENOMEM;
1531+
devl_lock(devlink);
15401532
nsim_dev = devlink_priv(devlink);
15411533
nsim_dev->nsim_bus_dev = nsim_bus_dev;
15421534
nsim_dev->switch_id.id_len = sizeof(nsim_dev->switch_id.id);
@@ -1555,7 +1547,7 @@ int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev)
15551547
GFP_KERNEL | __GFP_NOWARN);
15561548
if (!nsim_dev->vfconfigs) {
15571549
err = -ENOMEM;
1558-
goto err_devlink_free;
1550+
goto err_devlink_unlock;
15591551
}
15601552

15611553
err = nsim_dev_resources_register(devlink);
@@ -1608,6 +1600,7 @@ int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev)
16081600

16091601
nsim_dev->esw_mode = DEVLINK_ESWITCH_MODE_LEGACY;
16101602
devlink_set_features(devlink, DEVLINK_F_RELOAD);
1603+
devl_unlock(devlink);
16111604
devlink_register(devlink);
16121605
return 0;
16131606

@@ -1631,10 +1624,11 @@ int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev)
16311624
devlink_params_unregister(devlink, nsim_devlink_params,
16321625
ARRAY_SIZE(nsim_devlink_params));
16331626
err_dl_unregister:
1634-
devlink_resources_unregister(devlink);
1627+
devl_resources_unregister(devlink);
16351628
err_vfc_free:
16361629
kfree(nsim_dev->vfconfigs);
1637-
err_devlink_free:
1630+
err_devlink_unlock:
1631+
devl_unlock(devlink);
16381632
devlink_free(devlink);
16391633
dev_set_drvdata(&nsim_bus_dev->dev, NULL);
16401634
return err;
@@ -1648,13 +1642,11 @@ static void nsim_dev_reload_destroy(struct nsim_dev *nsim_dev)
16481642
return;
16491643
debugfs_remove(nsim_dev->take_snapshot);
16501644

1651-
devl_lock(devlink);
16521645
if (nsim_dev_get_vfs(nsim_dev)) {
16531646
nsim_bus_dev_set_vfs(nsim_dev->nsim_bus_dev, 0);
16541647
if (nsim_esw_mode_is_switchdev(nsim_dev))
16551648
nsim_esw_legacy_enable(nsim_dev, NULL);
16561649
}
1657-
devl_unlock(devlink);
16581650

16591651
nsim_dev_port_del_all(nsim_dev);
16601652
nsim_dev_hwstats_exit(nsim_dev);
@@ -1671,14 +1663,16 @@ void nsim_drv_remove(struct nsim_bus_dev *nsim_bus_dev)
16711663
struct devlink *devlink = priv_to_devlink(nsim_dev);
16721664

16731665
devlink_unregister(devlink);
1666+
devl_lock(devlink);
16741667
nsim_dev_reload_destroy(nsim_dev);
16751668

16761669
nsim_bpf_dev_exit(nsim_dev);
16771670
nsim_dev_debugfs_exit(nsim_dev);
16781671
devlink_params_unregister(devlink, nsim_devlink_params,
16791672
ARRAY_SIZE(nsim_devlink_params));
1680-
devlink_resources_unregister(devlink);
1673+
devl_resources_unregister(devlink);
16811674
kfree(nsim_dev->vfconfigs);
1675+
devl_unlock(devlink);
16821676
devlink_free(devlink);
16831677
dev_set_drvdata(&nsim_bus_dev->dev, NULL);
16841678
}

0 commit comments

Comments
 (0)