Message ID | 20190514212819.7789-1-jakub.kicinski@netronome.com |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | [net] nfp: flower: add rcu locks when accessing netdev for tunnels | expand |
From: Jakub Kicinski <jakub.kicinski@netronome.com> Date: Tue, 14 May 2019 14:28:19 -0700 > From: Pieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com> > > Add rcu locks when accessing netdev when processing route request > and tunnel keep alive messages received from hardware. > > Fixes: 8e6a9046b66a ("nfp: flower vxlan neighbour offload") > Fixes: 856f5b135758 ("nfp: flower vxlan neighbour keep-alive") > Signed-off-by: Pieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com> > Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com> > Reviewed-by: John Hurley <john.hurley@netronome.com> Applied and queued up for -stable.
On Tue, 14 May 2019 16:03:39 -0700 (PDT), David Miller wrote: > From: Jakub Kicinski <jakub.kicinski@netronome.com> > Date: Tue, 14 May 2019 14:28:19 -0700 > > > From: Pieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com> > > > > Add rcu locks when accessing netdev when processing route request > > and tunnel keep alive messages received from hardware. > > > > Fixes: 8e6a9046b66a ("nfp: flower vxlan neighbour offload") > > Fixes: 856f5b135758 ("nfp: flower vxlan neighbour keep-alive") > > Signed-off-by: Pieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com> > > Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com> > > Reviewed-by: John Hurley <john.hurley@netronome.com> > > Applied and queued up for -stable. Thank you, FWIW for stable there may be a slight conflict because the nfp_app_dev_get() call was recently renamed from nfp_app_repr_get().
diff --git a/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c b/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c index faa06edf95ac..8c67505865a4 100644 --- a/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c +++ b/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c @@ -168,6 +168,7 @@ void nfp_tunnel_keep_alive(struct nfp_app *app, struct sk_buff *skb) return; } + rcu_read_lock(); for (i = 0; i < count; i++) { ipv4_addr = payload->tun_info[i].ipv4; port = be32_to_cpu(payload->tun_info[i].egress_port); @@ -183,6 +184,7 @@ void nfp_tunnel_keep_alive(struct nfp_app *app, struct sk_buff *skb) neigh_event_send(n, NULL); neigh_release(n); } + rcu_read_unlock(); } static int @@ -367,9 +369,10 @@ void nfp_tunnel_request_route(struct nfp_app *app, struct sk_buff *skb) payload = nfp_flower_cmsg_get_data(skb); + rcu_read_lock(); netdev = nfp_app_dev_get(app, be32_to_cpu(payload->ingress_port), NULL); if (!netdev) - goto route_fail_warning; + goto fail_rcu_unlock; flow.daddr = payload->ipv4_addr; flow.flowi4_proto = IPPROTO_UDP; @@ -379,21 +382,23 @@ void nfp_tunnel_request_route(struct nfp_app *app, struct sk_buff *skb) rt = ip_route_output_key(dev_net(netdev), &flow); err = PTR_ERR_OR_ZERO(rt); if (err) - goto route_fail_warning; + goto fail_rcu_unlock; #else - goto route_fail_warning; + goto fail_rcu_unlock; #endif /* Get the neighbour entry for the lookup */ n = dst_neigh_lookup(&rt->dst, &flow.daddr); ip_rt_put(rt); if (!n) - goto route_fail_warning; - nfp_tun_write_neigh(n->dev, app, &flow, n, GFP_KERNEL); + goto fail_rcu_unlock; + nfp_tun_write_neigh(n->dev, app, &flow, n, GFP_ATOMIC); neigh_release(n); + rcu_read_unlock(); return; -route_fail_warning: +fail_rcu_unlock: + rcu_read_unlock(); nfp_flower_cmsg_warn(app, "Requested route not found.\n"); }