Skip to content

Commit 55d7c91

Browse files
committed
Merge branch 'mlxsw-cleanups'
Petr Machata says: ==================== mlxsw: Cleanups in router code This patchset moves some router-related code from spectrum.c to spectrum_router.c where it should be. It also simplifies handlers of netevent notifications. - Patch #1 caches router pointer in a dedicated variable. This obviates the need to access the same as mlxsw_sp->router, making lines shorter, and permitting a future patch to add code that fits within 80 character limit. - Patch #2 moves IP / IPv6 validation notifier blocks from spectrum.c to spectrum_router, where the handlers are anyway. - In patch #3, pass router pointer to scheduler of deferred work directly, instead of having it deduce it on its own. - This makes the router pointer available in the handler function mlxsw_sp_router_netevent_event(), so in patch #4, use it directly, instead of finding it through mlxsw_sp_port. - In patch #5, extend mlxsw_sp_router_schedule_work() so that the NETEVENT_NEIGH_UPDATE handler can use it directly instead of inlining equivalent code. - In patches #6 and #7, add helpers for two common operations involving a backing netdev of a RIF. This makes it unnecessary for the function mlxsw_sp_rif_dev() to be visible outside of the router module, so in patch #8, hide it. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents e069ba0 + df95ae6 commit 55d7c91

6 files changed

Lines changed: 89 additions & 81 deletions

File tree

drivers/net/ethernet/mellanox/mlxsw/spectrum.c

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5139,14 +5139,6 @@ static int mlxsw_sp_netdevice_event(struct notifier_block *nb,
51395139
return notifier_from_errno(err);
51405140
}
51415141

5142-
static struct notifier_block mlxsw_sp_inetaddr_valid_nb __read_mostly = {
5143-
.notifier_call = mlxsw_sp_inetaddr_valid_event,
5144-
};
5145-
5146-
static struct notifier_block mlxsw_sp_inet6addr_valid_nb __read_mostly = {
5147-
.notifier_call = mlxsw_sp_inet6addr_valid_event,
5148-
};
5149-
51505142
static const struct pci_device_id mlxsw_sp1_pci_id_table[] = {
51515143
{PCI_VDEVICE(MELLANOX, PCI_DEVICE_ID_MELLANOX_SPECTRUM), 0},
51525144
{0, },
@@ -5191,12 +5183,9 @@ static int __init mlxsw_sp_module_init(void)
51915183
{
51925184
int err;
51935185

5194-
register_inetaddr_validator_notifier(&mlxsw_sp_inetaddr_valid_nb);
5195-
register_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
5196-
51975186
err = mlxsw_core_driver_register(&mlxsw_sp1_driver);
51985187
if (err)
5199-
goto err_sp1_core_driver_register;
5188+
return err;
52005189

52015190
err = mlxsw_core_driver_register(&mlxsw_sp2_driver);
52025191
if (err)
@@ -5242,9 +5231,6 @@ static int __init mlxsw_sp_module_init(void)
52425231
mlxsw_core_driver_unregister(&mlxsw_sp2_driver);
52435232
err_sp2_core_driver_register:
52445233
mlxsw_core_driver_unregister(&mlxsw_sp1_driver);
5245-
err_sp1_core_driver_register:
5246-
unregister_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
5247-
unregister_inetaddr_validator_notifier(&mlxsw_sp_inetaddr_valid_nb);
52485234
return err;
52495235
}
52505236

@@ -5258,8 +5244,6 @@ static void __exit mlxsw_sp_module_exit(void)
52585244
mlxsw_core_driver_unregister(&mlxsw_sp3_driver);
52595245
mlxsw_core_driver_unregister(&mlxsw_sp2_driver);
52605246
mlxsw_core_driver_unregister(&mlxsw_sp1_driver);
5261-
unregister_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
5262-
unregister_inetaddr_validator_notifier(&mlxsw_sp_inetaddr_valid_nb);
52635247
}
52645248

52655249
module_init(mlxsw_sp_module_init);

drivers/net/ethernet/mellanox/mlxsw/spectrum.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -755,10 +755,6 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
755755
void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp);
756756
void mlxsw_sp_rif_macvlan_del(struct mlxsw_sp *mlxsw_sp,
757757
const struct net_device *macvlan_dev);
758-
int mlxsw_sp_inetaddr_valid_event(struct notifier_block *unused,
759-
unsigned long event, void *ptr);
760-
int mlxsw_sp_inet6addr_valid_event(struct notifier_block *unused,
761-
unsigned long event, void *ptr);
762758
int
763759
mlxsw_sp_port_vlan_router_join(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
764760
struct net_device *l3_dev,

drivers/net/ethernet/mellanox/mlxsw/spectrum_dpipe.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ mlxsw_sp_dpipe_table_erif_entries_dump(void *priv, bool counters_enabled,
221221
for (; i < rif_count; i++) {
222222
struct mlxsw_sp_rif *rif = mlxsw_sp_rif_by_index(mlxsw_sp, i);
223223

224-
if (!rif || !mlxsw_sp_rif_dev(rif))
224+
if (!rif || !mlxsw_sp_rif_has_dev(rif))
225225
continue;
226226
err = mlxsw_sp_erif_entry_get(mlxsw_sp, &entry, rif,
227227
counters_enabled);

drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.c

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -704,26 +704,25 @@ void mlxsw_sp_mr_vif_del(struct mlxsw_sp_mr_table *mr_table, vifi_t vif_index)
704704

705705
static struct mlxsw_sp_mr_vif *
706706
mlxsw_sp_mr_dev_vif_lookup(struct mlxsw_sp_mr_table *mr_table,
707-
const struct net_device *dev)
707+
const struct mlxsw_sp_rif *rif)
708708
{
709709
vifi_t vif_index;
710710

711711
for (vif_index = 0; vif_index < MAXVIFS; vif_index++)
712-
if (mr_table->vifs[vif_index].dev == dev)
712+
if (mlxsw_sp_rif_dev_is(rif, mr_table->vifs[vif_index].dev))
713713
return &mr_table->vifs[vif_index];
714714
return NULL;
715715
}
716716

717717
int mlxsw_sp_mr_rif_add(struct mlxsw_sp_mr_table *mr_table,
718718
const struct mlxsw_sp_rif *rif)
719719
{
720-
const struct net_device *rif_dev = mlxsw_sp_rif_dev(rif);
721720
struct mlxsw_sp_mr_vif *mr_vif;
722721

723-
if (!rif_dev)
722+
if (!mlxsw_sp_rif_has_dev(rif))
724723
return 0;
725724

726-
mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif_dev);
725+
mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif);
727726
if (!mr_vif)
728727
return 0;
729728
return mlxsw_sp_mr_vif_resolve(mr_table, mr_vif->dev, mr_vif,
@@ -733,13 +732,12 @@ int mlxsw_sp_mr_rif_add(struct mlxsw_sp_mr_table *mr_table,
733732
void mlxsw_sp_mr_rif_del(struct mlxsw_sp_mr_table *mr_table,
734733
const struct mlxsw_sp_rif *rif)
735734
{
736-
const struct net_device *rif_dev = mlxsw_sp_rif_dev(rif);
737735
struct mlxsw_sp_mr_vif *mr_vif;
738736

739-
if (!rif_dev)
737+
if (!mlxsw_sp_rif_has_dev(rif))
740738
return;
741739

742-
mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif_dev);
740+
mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif);
743741
if (!mr_vif)
744742
return;
745743
mlxsw_sp_mr_vif_unresolve(mr_table, mr_vif->dev, mr_vif);
@@ -748,17 +746,16 @@ void mlxsw_sp_mr_rif_del(struct mlxsw_sp_mr_table *mr_table,
748746
void mlxsw_sp_mr_rif_mtu_update(struct mlxsw_sp_mr_table *mr_table,
749747
const struct mlxsw_sp_rif *rif, int mtu)
750748
{
751-
const struct net_device *rif_dev = mlxsw_sp_rif_dev(rif);
752749
struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp;
753750
struct mlxsw_sp_mr_route_vif_entry *rve;
754751
struct mlxsw_sp_mr *mr = mlxsw_sp->mr;
755752
struct mlxsw_sp_mr_vif *mr_vif;
756753

757-
if (!rif_dev)
754+
if (!mlxsw_sp_rif_has_dev(rif))
758755
return;
759756

760757
/* Search for a VIF that use that RIF */
761-
mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif_dev);
758+
mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif);
762759
if (!mr_vif)
763760
return;
764761

drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

Lines changed: 74 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2748,13 +2748,12 @@ static void mlxsw_sp_router_update_priority_work(struct work_struct *work)
27482748
}
27492749

27502750
static int mlxsw_sp_router_schedule_work(struct net *net,
2751-
struct notifier_block *nb,
2751+
struct mlxsw_sp_router *router,
2752+
struct neighbour *n,
27522753
void (*cb)(struct work_struct *))
27532754
{
27542755
struct mlxsw_sp_netevent_work *net_work;
2755-
struct mlxsw_sp_router *router;
27562756

2757-
router = container_of(nb, struct mlxsw_sp_router, netevent_nb);
27582757
if (!net_eq(net, mlxsw_sp_net(router->mlxsw_sp)))
27592758
return NOTIFY_DONE;
27602759

@@ -2764,19 +2763,31 @@ static int mlxsw_sp_router_schedule_work(struct net *net,
27642763

27652764
INIT_WORK(&net_work->work, cb);
27662765
net_work->mlxsw_sp = router->mlxsw_sp;
2766+
net_work->n = n;
27672767
mlxsw_core_schedule_work(&net_work->work);
27682768
return NOTIFY_DONE;
27692769
}
27702770

2771+
static bool mlxsw_sp_dev_lower_is_port(struct net_device *dev)
2772+
{
2773+
struct mlxsw_sp_port *mlxsw_sp_port;
2774+
2775+
rcu_read_lock();
2776+
mlxsw_sp_port = mlxsw_sp_port_dev_lower_find_rcu(dev);
2777+
rcu_read_unlock();
2778+
return !!mlxsw_sp_port;
2779+
}
2780+
27712781
static int mlxsw_sp_router_netevent_event(struct notifier_block *nb,
27722782
unsigned long event, void *ptr)
27732783
{
2774-
struct mlxsw_sp_netevent_work *net_work;
2775-
struct mlxsw_sp_port *mlxsw_sp_port;
2776-
struct mlxsw_sp *mlxsw_sp;
2784+
struct mlxsw_sp_router *router;
27772785
unsigned long interval;
27782786
struct neigh_parms *p;
27792787
struct neighbour *n;
2788+
struct net *net;
2789+
2790+
router = container_of(nb, struct mlxsw_sp_router, netevent_nb);
27802791

27812792
switch (event) {
27822793
case NETEVENT_DELAY_PROBE_TIME_UPDATE:
@@ -2790,51 +2801,37 @@ static int mlxsw_sp_router_netevent_event(struct notifier_block *nb,
27902801
/* We are in atomic context and can't take RTNL mutex,
27912802
* so use RCU variant to walk the device chain.
27922803
*/
2793-
mlxsw_sp_port = mlxsw_sp_port_lower_dev_hold(p->dev);
2794-
if (!mlxsw_sp_port)
2804+
if (!mlxsw_sp_dev_lower_is_port(p->dev))
27952805
return NOTIFY_DONE;
27962806

2797-
mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
27982807
interval = jiffies_to_msecs(NEIGH_VAR(p, DELAY_PROBE_TIME));
2799-
mlxsw_sp->router->neighs_update.interval = interval;
2800-
2801-
mlxsw_sp_port_dev_put(mlxsw_sp_port);
2808+
router->neighs_update.interval = interval;
28022809
break;
28032810
case NETEVENT_NEIGH_UPDATE:
28042811
n = ptr;
2812+
net = neigh_parms_net(n->parms);
28052813

28062814
if (n->tbl->family != AF_INET && n->tbl->family != AF_INET6)
28072815
return NOTIFY_DONE;
28082816

2809-
mlxsw_sp_port = mlxsw_sp_port_lower_dev_hold(n->dev);
2810-
if (!mlxsw_sp_port)
2817+
if (!mlxsw_sp_dev_lower_is_port(n->dev))
28112818
return NOTIFY_DONE;
28122819

2813-
net_work = kzalloc(sizeof(*net_work), GFP_ATOMIC);
2814-
if (!net_work) {
2815-
mlxsw_sp_port_dev_put(mlxsw_sp_port);
2816-
return NOTIFY_BAD;
2817-
}
2818-
2819-
INIT_WORK(&net_work->work, mlxsw_sp_router_neigh_event_work);
2820-
net_work->mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
2821-
net_work->n = n;
2822-
28232820
/* Take a reference to ensure the neighbour won't be
28242821
* destructed until we drop the reference in delayed
28252822
* work.
28262823
*/
28272824
neigh_clone(n);
2828-
mlxsw_core_schedule_work(&net_work->work);
2829-
mlxsw_sp_port_dev_put(mlxsw_sp_port);
2830-
break;
2825+
return mlxsw_sp_router_schedule_work(net, router, n,
2826+
mlxsw_sp_router_neigh_event_work);
2827+
28312828
case NETEVENT_IPV4_MPATH_HASH_UPDATE:
28322829
case NETEVENT_IPV6_MPATH_HASH_UPDATE:
2833-
return mlxsw_sp_router_schedule_work(ptr, nb,
2830+
return mlxsw_sp_router_schedule_work(ptr, router, NULL,
28342831
mlxsw_sp_router_mp_hash_event_work);
28352832

28362833
case NETEVENT_IPV4_FWD_UPDATE_PRIORITY_UPDATE:
2837-
return mlxsw_sp_router_schedule_work(ptr, nb,
2834+
return mlxsw_sp_router_schedule_work(ptr, router, NULL,
28382835
mlxsw_sp_router_update_priority_work);
28392836
}
28402837

@@ -7708,7 +7705,7 @@ mlxsw_sp_rif_find_by_dev(const struct mlxsw_sp *mlxsw_sp,
77087705

77097706
for (i = 0; i < max_rifs; i++)
77107707
if (mlxsw_sp->router->rifs[i] &&
7711-
mlxsw_sp->router->rifs[i]->dev == dev)
7708+
mlxsw_sp_rif_dev_is(mlxsw_sp->router->rifs[i], dev))
77127709
return mlxsw_sp->router->rifs[i];
77137710

77147711
return NULL;
@@ -8078,11 +8075,22 @@ int mlxsw_sp_rif_dev_ifindex(const struct mlxsw_sp_rif *rif)
80788075
return rif->dev->ifindex;
80798076
}
80808077

8081-
const struct net_device *mlxsw_sp_rif_dev(const struct mlxsw_sp_rif *rif)
8078+
static const struct net_device *mlxsw_sp_rif_dev(const struct mlxsw_sp_rif *rif)
80828079
{
80838080
return rif->dev;
80848081
}
80858082

8083+
bool mlxsw_sp_rif_has_dev(const struct mlxsw_sp_rif *rif)
8084+
{
8085+
return !!mlxsw_sp_rif_dev(rif);
8086+
}
8087+
8088+
bool mlxsw_sp_rif_dev_is(const struct mlxsw_sp_rif *rif,
8089+
const struct net_device *dev)
8090+
{
8091+
return mlxsw_sp_rif_dev(rif) == dev;
8092+
}
8093+
80868094
static void mlxsw_sp_rif_push_l3_stats(struct mlxsw_sp_rif *rif)
80878095
{
80888096
struct rtnl_hw_stats64 stats = {};
@@ -8879,8 +8887,8 @@ static int mlxsw_sp_inetaddr_event(struct notifier_block *nb,
88798887
return notifier_from_errno(err);
88808888
}
88818889

8882-
int mlxsw_sp_inetaddr_valid_event(struct notifier_block *unused,
8883-
unsigned long event, void *ptr)
8890+
static int mlxsw_sp_inetaddr_valid_event(struct notifier_block *unused,
8891+
unsigned long event, void *ptr)
88848892
{
88858893
struct in_validator_info *ivi = (struct in_validator_info *) ptr;
88868894
struct net_device *dev = ivi->ivi_dev->dev;
@@ -8962,8 +8970,8 @@ static int mlxsw_sp_inet6addr_event(struct notifier_block *nb,
89628970
return NOTIFY_DONE;
89638971
}
89648972

8965-
int mlxsw_sp_inet6addr_valid_event(struct notifier_block *unused,
8966-
unsigned long event, void *ptr)
8973+
static int mlxsw_sp_inet6addr_valid_event(struct notifier_block *unused,
8974+
unsigned long event, void *ptr)
89678975
{
89688976
struct in6_validator_info *i6vi = (struct in6_validator_info *) ptr;
89698977
struct net_device *dev = i6vi->i6vi_dev->dev;
@@ -10510,6 +10518,7 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
1051010518
struct netlink_ext_ack *extack)
1051110519
{
1051210520
struct mlxsw_sp_router *router;
10521+
struct notifier_block *nb;
1051310522
int err;
1051410523

1051510524
router = kzalloc(sizeof(*mlxsw_sp->router), GFP_KERNEL);
@@ -10588,6 +10597,17 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
1058810597
if (err)
1058910598
goto err_register_inet6addr_notifier;
1059010599

10600+
router->inetaddr_valid_nb.notifier_call = mlxsw_sp_inetaddr_valid_event;
10601+
err = register_inetaddr_validator_notifier(&router->inetaddr_valid_nb);
10602+
if (err)
10603+
goto err_register_inetaddr_valid_notifier;
10604+
10605+
nb = &router->inet6addr_valid_nb;
10606+
nb->notifier_call = mlxsw_sp_inet6addr_valid_event;
10607+
err = register_inet6addr_validator_notifier(nb);
10608+
if (err)
10609+
goto err_register_inet6addr_valid_notifier;
10610+
1059110611
mlxsw_sp->router->netevent_nb.notifier_call =
1059210612
mlxsw_sp_router_netevent_event;
1059310613
err = register_netevent_notifier(&mlxsw_sp->router->netevent_nb);
@@ -10627,6 +10647,10 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
1062710647
err_register_nexthop_notifier:
1062810648
unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb);
1062910649
err_register_netevent_notifier:
10650+
unregister_inet6addr_validator_notifier(&router->inet6addr_valid_nb);
10651+
err_register_inet6addr_valid_notifier:
10652+
unregister_inetaddr_validator_notifier(&router->inetaddr_valid_nb);
10653+
err_register_inetaddr_valid_notifier:
1063010654
unregister_inet6addr_notifier(&router->inet6addr_nb);
1063110655
err_register_inet6addr_notifier:
1063210656
unregister_inetaddr_notifier(&router->inetaddr_nb);
@@ -10664,28 +10688,31 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
1066410688

1066510689
void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp)
1066610690
{
10691+
struct mlxsw_sp_router *router = mlxsw_sp->router;
10692+
1066710693
unregister_netdevice_notifier_net(mlxsw_sp_net(mlxsw_sp),
10668-
&mlxsw_sp->router->netdevice_nb);
10669-
unregister_fib_notifier(mlxsw_sp_net(mlxsw_sp),
10670-
&mlxsw_sp->router->fib_nb);
10694+
&router->netdevice_nb);
10695+
unregister_fib_notifier(mlxsw_sp_net(mlxsw_sp), &router->fib_nb);
1067110696
unregister_nexthop_notifier(mlxsw_sp_net(mlxsw_sp),
10672-
&mlxsw_sp->router->nexthop_nb);
10673-
unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb);
10674-
unregister_inet6addr_notifier(&mlxsw_sp->router->inet6addr_nb);
10675-
unregister_inetaddr_notifier(&mlxsw_sp->router->inetaddr_nb);
10697+
&router->nexthop_nb);
10698+
unregister_netevent_notifier(&router->netevent_nb);
10699+
unregister_inet6addr_validator_notifier(&router->inet6addr_valid_nb);
10700+
unregister_inetaddr_validator_notifier(&router->inetaddr_valid_nb);
10701+
unregister_inet6addr_notifier(&router->inet6addr_nb);
10702+
unregister_inetaddr_notifier(&router->inetaddr_nb);
1067610703
mlxsw_core_flush_owq();
1067710704
mlxsw_sp_mp_hash_fini(mlxsw_sp);
1067810705
mlxsw_sp_neigh_fini(mlxsw_sp);
1067910706
mlxsw_sp_lb_rif_fini(mlxsw_sp);
1068010707
mlxsw_sp_vrs_fini(mlxsw_sp);
1068110708
mlxsw_sp_mr_fini(mlxsw_sp);
1068210709
mlxsw_sp_lpm_fini(mlxsw_sp);
10683-
rhashtable_destroy(&mlxsw_sp->router->nexthop_group_ht);
10684-
rhashtable_destroy(&mlxsw_sp->router->nexthop_ht);
10710+
rhashtable_destroy(&router->nexthop_group_ht);
10711+
rhashtable_destroy(&router->nexthop_ht);
1068510712
mlxsw_sp_ipips_fini(mlxsw_sp);
1068610713
mlxsw_sp_rifs_fini(mlxsw_sp);
1068710714
__mlxsw_sp_router_fini(mlxsw_sp);
10688-
cancel_delayed_work_sync(&mlxsw_sp->router->nh_grp_activity_dw);
10689-
mutex_destroy(&mlxsw_sp->router->lock);
10690-
kfree(mlxsw_sp->router);
10715+
cancel_delayed_work_sync(&router->nh_grp_activity_dw);
10716+
mutex_destroy(&router->lock);
10717+
kfree(router);
1069110718
}

0 commit comments

Comments
 (0)