net: mpls: rt_nhn_alive and nh_flags should be accessed using READ_ONCE
The number of alive nexthops for a route (rt->rt_nhn_alive) and the flags for a next hop (nh->nh_flags) are modified by netdev event handlers. The event handlers run with rtnl_lock held so updates are always done with the lock held. The packet path accesses the fields under the rcu lock. Since those fields can change at any moment in the packet path, both fields should be accessed using READ_ONCE. Updates to both fields should use WRITE_ONCE. Update mpls_select_multipath (packet path) and mpls_ifdown and mpls_ifup (event handlers) accordingly. Signed-off-by: David Ahern <dsa@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
3d8417d79e
commit
39eb8cd175
@@ -83,6 +83,10 @@ enum mpls_payload_type {
|
||||
|
||||
struct mpls_nh { /* next hop label forwarding entry */
|
||||
struct net_device __rcu *nh_dev;
|
||||
|
||||
/* nh_flags is accessed under RCU in the packet path; it is
|
||||
* modified handling netdev events with rtnl lock held
|
||||
*/
|
||||
unsigned int nh_flags;
|
||||
u32 nh_label[MAX_NEW_LABELS];
|
||||
u8 nh_labels;
|
||||
@@ -124,6 +128,10 @@ struct mpls_route { /* next hop label forwarding entry */
|
||||
u8 rt_max_alen;
|
||||
u8 rt_ttl_propagate;
|
||||
unsigned int rt_nhn;
|
||||
|
||||
/* rt_nhn_alive is accessed under RCU in the packet path; it
|
||||
* is modified handling netdev events with rtnl lock held
|
||||
*/
|
||||
unsigned int rt_nhn_alive;
|
||||
struct mpls_nh rt_nh[0];
|
||||
};
|
||||
|
Reference in New Issue
Block a user