OSDN Git Service

nfp: flower: add rcu locks when accessing netdev for tunnels
authorPieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com>
Tue, 14 May 2019 21:28:19 +0000 (14:28 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 14 May 2019 23:02:42 +0000 (16:02 -0700)
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>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c

index faa06ed..8c67505 100644 (file)
@@ -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");
 }