aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/device.h
diff options
context:
space:
mode:
authorSultan Alsawaf <sultan@kerneltoast.com>2019-02-02 14:13:03 -0800
committerJason A. Donenfeld <Jason@zx2c4.com>2019-02-03 18:27:33 +0100
commitd814238650b16d9fd990ce604feb94b6ee31f9eb (patch)
tree76e3bf51b05f48308cbb2d6c24fd605eb60b266d /src/device.h
parentqueueing: more reasonable allocator function convention (diff)
downloadwireguard-monolithic-historical-d814238650b16d9fd990ce604feb94b6ee31f9eb.tar.xz
wireguard-monolithic-historical-d814238650b16d9fd990ce604feb94b6ee31f9eb.zip
hashtables: decouple hashtable allocations from the main device allocation
The hashtable allocations are quite large, and cause the device allocation in the net framework to stall sometimes while it tries to find a contiguous region that can fit the device struct: [<0000000000000000>] __switch_to+0x94/0xb8 [<0000000000000000>] __alloc_pages_nodemask+0x764/0x7e8 [<0000000000000000>] kmalloc_order+0x20/0x40 [<0000000000000000>] __kmalloc+0x144/0x1a0 [<0000000000000000>] alloc_netdev_mqs+0x5c/0x368 [<0000000000000000>] rtnl_create_link+0x48/0x180 [<0000000000000000>] rtnl_newlink+0x410/0x708 [<0000000000000000>] rtnetlink_rcv_msg+0x190/0x1f8 [<0000000000000000>] netlink_rcv_skb+0x4c/0xf8 [<0000000000000000>] rtnetlink_rcv+0x30/0x40 [<0000000000000000>] netlink_unicast+0x18c/0x208 [<0000000000000000>] netlink_sendmsg+0x19c/0x348 [<0000000000000000>] sock_sendmsg+0x3c/0x58 [<0000000000000000>] ___sys_sendmsg+0x290/0x2b0 [<0000000000000000>] __sys_sendmsg+0x58/0xa0 [<0000000000000000>] SyS_sendmsg+0x10/0x20 [<0000000000000000>] el0_svc_naked+0x34/0x38 [<0000000000000000>] 0xffffffffffffffff To fix the allocation stalls, decouple the hashtable allocations from the device allocation and allocate the hashtables with kvmalloc's implicit __GFP_NORETRY so that the allocations fall back to vmalloc with little resistance. Signed-off-by: Sultan Alsawaf <sultan@kerneltoast.com>
Diffstat (limited to 'src/device.h')
-rw-r--r--src/device.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/device.h b/src/device.h
index b85638c..7e7e216 100644
--- a/src/device.h
+++ b/src/device.h
@@ -48,8 +48,8 @@ struct wg_device {
int incoming_handshake_cpu;
struct multicore_worker __percpu *incoming_handshakes_worker;
struct cookie_checker cookie_checker;
- struct pubkey_hashtable peer_hashtable;
- struct index_hashtable index_hashtable;
+ struct pubkey_hashtable *peer_hashtable;
+ struct index_hashtable *index_hashtable;
struct allowedips peer_allowedips;
struct mutex device_update_lock, socket_update_lock;
struct list_head device_list, peer_list;