* [PATCH 1/3] fs/file: replace alloc_fdmem with kvmalloc alternative
2017-05-31 15:51 [PATCH 0/3] replace few other kvmalloc open coded variants Michal Hocko
@ 2017-05-31 15:51 ` Michal Hocko
2017-05-31 15:51 ` [PATCH 2/3] lib/rhashtable.c: use kvzalloc in bucket_table_alloc when possible Michal Hocko
2017-05-31 15:51 ` [PATCH 3/3] netfilter: use kvmalloc xt_alloc_table_info Michal Hocko
2 siblings, 0 replies; 4+ messages in thread
From: Michal Hocko @ 2017-05-31 15:51 UTC (permalink / raw)
To: LKML; +Cc: linux-mm, Andrew Morton, Michal Hocko, Alexander Viro
From: Michal Hocko <mhocko@suse.com>
There is no real reason to duplicate kvmalloc* helpers so drop
alloc_fdmem and replace it with the appropriate library function.
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
fs/file.c | 22 ++++------------------
1 file changed, 4 insertions(+), 18 deletions(-)
diff --git a/fs/file.c b/fs/file.c
index 1c2972e3a405..1fc7fbbb4510 100644
--- a/fs/file.c
+++ b/fs/file.c
@@ -30,21 +30,6 @@ unsigned int sysctl_nr_open_min = BITS_PER_LONG;
unsigned int sysctl_nr_open_max =
__const_min(INT_MAX, ~(size_t)0/sizeof(void *)) & -BITS_PER_LONG;
-static void *alloc_fdmem(size_t size)
-{
- /*
- * Very large allocations can stress page reclaim, so fall back to
- * vmalloc() if the allocation size will be considered "large" by the VM.
- */
- if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER)) {
- void *data = kmalloc(size, GFP_KERNEL_ACCOUNT |
- __GFP_NOWARN | __GFP_NORETRY);
- if (data != NULL)
- return data;
- }
- return __vmalloc(size, GFP_KERNEL_ACCOUNT, PAGE_KERNEL);
-}
-
static void __free_fdtable(struct fdtable *fdt)
{
kvfree(fdt->fd);
@@ -131,13 +116,14 @@ static struct fdtable * alloc_fdtable(unsigned int nr)
if (!fdt)
goto out;
fdt->max_fds = nr;
- data = alloc_fdmem(nr * sizeof(struct file *));
+ data = kvmalloc_array(nr, sizeof(struct file *), GFP_KERNEL_ACCOUNT);
if (!data)
goto out_fdt;
fdt->fd = data;
- data = alloc_fdmem(max_t(size_t,
- 2 * nr / BITS_PER_BYTE + BITBIT_SIZE(nr), L1_CACHE_BYTES));
+ data = kvmalloc(max_t(size_t,
+ 2 * nr / BITS_PER_BYTE + BITBIT_SIZE(nr), L1_CACHE_BYTES),
+ GFP_KERNEL_ACCOUNT);
if (!data)
goto out_arr;
fdt->open_fds = data;
--
2.11.0
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/3] lib/rhashtable.c: use kvzalloc in bucket_table_alloc when possible
2017-05-31 15:51 [PATCH 0/3] replace few other kvmalloc open coded variants Michal Hocko
2017-05-31 15:51 ` [PATCH 1/3] fs/file: replace alloc_fdmem with kvmalloc alternative Michal Hocko
@ 2017-05-31 15:51 ` Michal Hocko
2017-05-31 15:51 ` [PATCH 3/3] netfilter: use kvmalloc xt_alloc_table_info Michal Hocko
2 siblings, 0 replies; 4+ messages in thread
From: Michal Hocko @ 2017-05-31 15:51 UTC (permalink / raw)
To: LKML; +Cc: linux-mm, Andrew Morton, Michal Hocko, Herbert Xu, Thomas Graf
From: Michal Hocko <mhocko@suse.com>
bucket_table_alloc can be currently called with GFP_KERNEL or
GFP_ATOMIC. For the former we basically have an open coded kvzalloc
while the later only uses kzalloc. Let's simplify the code a bit by
the dropping the open coded path and replace it with kvzalloc
Cc: Thomas Graf <tgraf@suug.ch>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: netdev@vger.kernel.org
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
lib/rhashtable.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/lib/rhashtable.c b/lib/rhashtable.c
index d9e7274a04cd..42466c167257 100644
--- a/lib/rhashtable.c
+++ b/lib/rhashtable.c
@@ -211,11 +211,10 @@ static struct bucket_table *bucket_table_alloc(struct rhashtable *ht,
int i;
size = sizeof(*tbl) + nbuckets * sizeof(tbl->buckets[0]);
- if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER) ||
- gfp != GFP_KERNEL)
+ if (gfp != GFP_KERNEL)
tbl = kzalloc(size, gfp | __GFP_NOWARN | __GFP_NORETRY);
- if (tbl == NULL && gfp == GFP_KERNEL)
- tbl = vzalloc(size);
+ else
+ tbl = kvzalloc(size, gfp);
size = nbuckets;
--
2.11.0
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/3] netfilter: use kvmalloc xt_alloc_table_info
2017-05-31 15:51 [PATCH 0/3] replace few other kvmalloc open coded variants Michal Hocko
2017-05-31 15:51 ` [PATCH 1/3] fs/file: replace alloc_fdmem with kvmalloc alternative Michal Hocko
2017-05-31 15:51 ` [PATCH 2/3] lib/rhashtable.c: use kvzalloc in bucket_table_alloc when possible Michal Hocko
@ 2017-05-31 15:51 ` Michal Hocko
2 siblings, 0 replies; 4+ messages in thread
From: Michal Hocko @ 2017-05-31 15:51 UTC (permalink / raw)
To: LKML
Cc: linux-mm, Andrew Morton, Michal Hocko, Florian Westphal,
Jozsef Kadlecsik, Pablo Neira Ayuso
From: Michal Hocko <mhocko@suse.com>
xt_alloc_table_info basically opencodes kvmalloc so use the library
function instead.
Cc: Pablo Neira Ayuso <pablo@netfilter.org>
Cc: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Cc: Florian Westphal <fw@strlen.de>
Cc: netfilter-devel@vger.kernel.org
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
net/netfilter/x_tables.c | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c
index 1770c1d9b37f..e1648238a9c9 100644
--- a/net/netfilter/x_tables.c
+++ b/net/netfilter/x_tables.c
@@ -1003,14 +1003,10 @@ struct xt_table_info *xt_alloc_table_info(unsigned int size)
if ((SMP_ALIGN(size) >> PAGE_SHIFT) + 2 > totalram_pages)
return NULL;
- if (sz <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER))
- info = kmalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY);
- if (!info) {
- info = __vmalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY,
- PAGE_KERNEL);
- if (!info)
- return NULL;
- }
+ info = kvmalloc(sz, GFP_KERNEL);
+ if (!info)
+ return NULL;
+
memset(info, 0, sizeof(*info));
info->size = size;
return info;
--
2.11.0
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply related [flat|nested] 4+ messages in thread