From: Pieter Jansen van Vuuren <[email protected]>

[ Upstream commit cb07d915bf278a7a3938b983bbcb4921366b5eff ]

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 <[email protected]>
Reviewed-by: Jakub Kicinski <[email protected]>
Reviewed-by: John Hurley <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
---
 drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c |   17 ++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

--- a/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c
@@ -164,6 +164,7 @@ void nfp_tunnel_keep_alive(struct nfp_ap
                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);
@@ -179,6 +180,7 @@ void nfp_tunnel_keep_alive(struct nfp_ap
                neigh_event_send(n, NULL);
                neigh_release(n);
        }
+       rcu_read_unlock();
 }
 
 static int
@@ -362,9 +364,10 @@ void nfp_tunnel_request_route(struct nfp
 
        payload = nfp_flower_cmsg_get_data(skb);
 
+       rcu_read_lock();
        netdev = nfp_app_repr_get(app, be32_to_cpu(payload->ingress_port));
        if (!netdev)
-               goto route_fail_warning;
+               goto fail_rcu_unlock;
 
        flow.daddr = payload->ipv4_addr;
        flow.flowi4_proto = IPPROTO_UDP;
@@ -374,21 +377,23 @@ void nfp_tunnel_request_route(struct nfp
        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");
 }
 


Reply via email to