nfp: flower: add rcu locks when accessing netdev for tunnels
[ Upstream commitcb07d915bf] Add rcu locks when accessing netdev when processing route request and tunnel keep alive messages received from hardware. Fixes:8e6a9046b6("nfp: flower vxlan neighbour offload") Fixes:856f5b1357("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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
948cd61650
commit
e4a6df16b4
1 changed files with 11 additions and 6 deletions
|
|
@ -194,6 +194,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);
|
||||
|
|
@ -209,6 +210,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 bool nfp_tun_is_netdev_to_offload(struct net_device *netdev)
|
||||
|
|
@ -404,9 +406,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_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;
|
||||
|
|
@ -416,21 +419,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");
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue