when system forks a process with CLONE_NEWNET flag under the
high memory pressure, it will trigger memory reclaim and stall
for a long time because nf_ct_alloc_hashtable need to allocate
high-order memory at that time. The calltrace as below:

        delay_tsc
        __delay
        _raw_spin_lock
        _spin_lock
        mmu_shrink
        shrink_slab
        zone_reclaim
        get_page_from_freelist
        __alloc_pages_nodemask
        alloc_pages_current
        __get_free_pages
        nf_ct_alloc_hashtable
        nf_conntrack_init_net
        setup_net
        copy_net_ns
        create_new_namespaces
        copy_namespaces
        copy_process
        do_fork
        sys_clone
        stub_clone
        __clone

not use the directly memory reclaim flag to avoid stall

Signed-off-by: Ni Xun <ni...@baidu.com>
Signed-off-by: Zhang Yu <zhangy...@baidu.com>
Signed-off-by: Wang Li <wangl...@baidu.com>
Signed-off-by: Li RongQing <lirongq...@baidu.com>
---
 net/netfilter/nf_conntrack_core.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/netfilter/nf_conntrack_core.c 
b/net/netfilter/nf_conntrack_core.c
index 8a113ca1eea2..672c5960530d 100644
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -2120,8 +2120,8 @@ void *nf_ct_alloc_hashtable(unsigned int *sizep, int 
nulls)
                return NULL;
 
        sz = nr_slots * sizeof(struct hlist_nulls_head);
-       hash = (void *)__get_free_pages(GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO,
-                                       get_order(sz));
+       hash = (void *)__get_free_pages((GFP_KERNEL & ~__GFP_DIRECT_RECLAIM) |
+                                   __GFP_NOWARN | __GFP_ZERO, get_order(sz));
        if (!hash)
                hash = vzalloc(sz);
 
-- 
2.16.2

Reply via email to