Skip to content

Commit

Permalink
net: use kvmalloc with __GFP_REPEAT rather than open coded variant
Browse files Browse the repository at this point in the history
fq_alloc_node, alloc_netdev_mqs and netif_alloc* open code kmalloc with
vmalloc fallback.  Use the kvmalloc variant instead.  Keep the
__GFP_REPEAT flag based on explanation from Eric:

 "At the time, tests on the hardware I had in my labs showed that
  vmalloc() could deliver pages spread all over the memory and that was
  a small penalty (once memory is fragmented enough, not at boot time)"

The way how the code is constructed means, however, that we prefer to go
and hit the OOM killer before we fall back to the vmalloc for requests
<=32kB (with 4kB pages) in the current code.  This is rather disruptive
for something that can be achived with the fallback.  On the other hand
__GFP_REPEAT doesn't have any useful semantic for these requests.  So
the effect of this patch is that requests which fit into 32kB will fall
back to vmalloc easier now.

Link: http://lkml.kernel.org/r/20170306103327.2766-3-mhocko@kernel.org
Signed-off-by: Michal Hocko <mhocko@suse.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Cc: Eric Dumazet <edumazet@google.com>
Cc: David Miller <davem@davemloft.net>
Cc: Shakeel Butt <shakeelb@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Michal Hocko authored and Linus Torvalds committed May 9, 2017
1 parent 752ade6 commit da6bc57
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 26 deletions.
24 changes: 9 additions & 15 deletions net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -7264,12 +7264,10 @@ static int netif_alloc_rx_queues(struct net_device *dev)

BUG_ON(count < 1);

rx = kzalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT);
if (!rx) {
rx = vzalloc(sz);
if (!rx)
return -ENOMEM;
}
rx = kvzalloc(sz, GFP_KERNEL | __GFP_REPEAT);
if (!rx)
return -ENOMEM;

dev->_rx = rx;

for (i = 0; i < count; i++)
Expand Down Expand Up @@ -7306,12 +7304,10 @@ static int netif_alloc_netdev_queues(struct net_device *dev)
if (count < 1 || count > 0xffff)
return -EINVAL;

tx = kzalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT);
if (!tx) {
tx = vzalloc(sz);
if (!tx)
return -ENOMEM;
}
tx = kvzalloc(sz, GFP_KERNEL | __GFP_REPEAT);
if (!tx)
return -ENOMEM;

dev->_tx = tx;

netdev_for_each_tx_queue(dev, netdev_init_one_queue, NULL);
Expand Down Expand Up @@ -7845,9 +7841,7 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
/* ensure 32-byte alignment of whole construct */
alloc_size += NETDEV_ALIGN - 1;

p = kzalloc(alloc_size, GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT);
if (!p)
p = vzalloc(alloc_size);
p = kvzalloc(alloc_size, GFP_KERNEL | __GFP_REPEAT);
if (!p)
return NULL;

Expand Down
12 changes: 1 addition & 11 deletions net/sched/sch_fq.c
Original file line number Diff line number Diff line change
Expand Up @@ -624,16 +624,6 @@ static void fq_rehash(struct fq_sched_data *q,
q->stat_gc_flows += fcnt;
}

static void *fq_alloc_node(size_t sz, int node)
{
void *ptr;

ptr = kmalloc_node(sz, GFP_KERNEL | __GFP_REPEAT | __GFP_NOWARN, node);
if (!ptr)
ptr = vmalloc_node(sz, node);
return ptr;
}

static void fq_free(void *addr)
{
kvfree(addr);
Expand All @@ -650,7 +640,7 @@ static int fq_resize(struct Qdisc *sch, u32 log)
return 0;

/* If XPS was setup, we can allocate memory on right NUMA node */
array = fq_alloc_node(sizeof(struct rb_root) << log,
array = kvmalloc_node(sizeof(struct rb_root) << log, GFP_KERNEL | __GFP_REPEAT,
netdev_queue_numa_node_read(sch->dev_queue));
if (!array)
return -ENOMEM;
Expand Down

0 comments on commit da6bc57

Please sign in to comment.