From: Pieter Jansen van Vuuren <pieter.jansenvanvuu...@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.jansenvanvuu...@netronome.com>
Reviewed-by: Jakub Kicinski <jakub.kicin...@netronome.com>
Reviewed-by: John Hurley <john.hur...@netronome.com>
---
 .../ethernet/netronome/nfp/flower/tunnel_conf.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

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");
 }
 
-- 
2.21.0

Reply via email to