net/ipv4: Use non-atomic allocation of udp offloads structure instance
authorOr Gerlitz <ogerlitz@mellanox.com>
Wed, 29 Jan 2014 16:08:59 +0000 (18:08 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 31 Jan 2014 00:25:48 +0000 (16:25 -0800)
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: b582ef0 ('net: Add GRO support for UDP encapsulating protocols')
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/udp_offload.c

index 25f5cee3a08a3ea22f2b30ef15809da73af44f08..2ffea6f31efcdf70f58b4bde4ddd08d59841edc2 100644 (file)
@@ -101,7 +101,7 @@ out:
 int udp_add_offload(struct udp_offload *uo)
 {
        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)
                return -ENOMEM;