linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] replace few other kvmalloc open coded variants
@ 2017-05-31 15:51 Michal Hocko
  2017-05-31 15:51 ` [PATCH 1/3] fs/file: replace alloc_fdmem with kvmalloc alternative Michal Hocko
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Michal Hocko @ 2017-05-31 15:51 UTC (permalink / raw)
  To: LKML
  Cc: linux-mm, Andrew Morton, Alexander Viro, Florian Westphal,
	Herbert Xu, Jozsef Kadlecsik, Michal Hocko, Pablo Neira Ayuso,
	Thomas Graf

Hi,
while doing something unrelated I've noticed these few open coded
kvmalloc variants so let's replace them with the library function. Each
patch can be merged separately so I hope I've CCed proper people. This
is based on the current linux-next.

Shortlog
Michal Hocko (3):
      fs/file: replace alloc_fdmem with kvmalloc alternative
      lib/rhashtable.c: use kvzalloc in bucket_table_alloc when possible
      netfilter: use kvmalloc xt_alloc_table_info

Diffstat
 fs/file.c                | 22 ++++------------------
 lib/rhashtable.c         |  7 +++----
 net/netfilter/x_tables.c | 12 ++++--------
 3 files changed, 11 insertions(+), 30 deletions(-)

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [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

^ 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

^ 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

^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2017-05-31 15:52 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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 ` [PATCH 3/3] netfilter: use kvmalloc xt_alloc_table_info Michal Hocko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).