Commit b5aaab12 authored by Or Gerlitz's avatar Or Gerlitz Committed by David S. Miller

net/ipv4: Use non-atomic allocation of udp offloads structure instance

Since udp_add_offload() can be called from non-sleepable context e.g
under this call tree from the vxlan driver use case:

  vxlan_socket_create() <-- holds the spinlock
  -> vxlan_notify_add_rx_port()
     -> udp_add_offload()  <-- schedules

we should allocate the udp_offloads structure in atomic manner.

Fixes: b582ef09 ('net: Add GRO support for UDP encapsulating protocols')
Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f8d56d8f
...@@ -101,7 +101,7 @@ static struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb, ...@@ -101,7 +101,7 @@ static struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb,
int udp_add_offload(struct udp_offload *uo) int udp_add_offload(struct udp_offload *uo)
{ {
struct udp_offload_priv __rcu **head = &udp_offload_base; struct udp_offload_priv __rcu **head = &udp_offload_base;
struct udp_offload_priv *new_offload = kzalloc(sizeof(*new_offload), GFP_KERNEL); struct udp_offload_priv *new_offload = kzalloc(sizeof(*new_offload), GFP_ATOMIC);
if (!new_offload) if (!new_offload)
return -ENOMEM; return -ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment