diff options
author | Sultan Alsawaf <sultan@kerneltoast.com> | 2019-02-02 14:13:03 -0800 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-02-03 18:27:33 +0100 |
commit | 75f476905a1bcd013c8bee07282fd7fb1dca738e (patch) | |
tree | 987fcd2a85f2afe63f0da292826646192bfb8eec /src/hashtables.h | |
parent | d063dfb80911854ed273f6374b02f339a86462ba (diff) |
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>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'src/hashtables.h')
-rw-r--r-- | src/hashtables.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/hashtables.h b/src/hashtables.h index 7b12b86..de77537 100644 --- a/src/hashtables.h +++ b/src/hashtables.h @@ -21,7 +21,7 @@ struct pubkey_hashtable { struct mutex lock; }; -void wg_pubkey_hashtable_init(struct pubkey_hashtable *table); +struct pubkey_hashtable *wg_pubkey_hashtable_alloc(void); void wg_pubkey_hashtable_add(struct pubkey_hashtable *table, struct wg_peer *peer); void wg_pubkey_hashtable_remove(struct pubkey_hashtable *table, @@ -48,7 +48,7 @@ struct index_hashtable_entry { __le32 index; }; -void wg_index_hashtable_init(struct index_hashtable *table); +struct index_hashtable *wg_index_hashtable_alloc(void); __le32 wg_index_hashtable_insert(struct index_hashtable *table, struct index_hashtable_entry *entry); bool wg_index_hashtable_replace(struct index_hashtable *table, |