[Devel] [PATCH RH9 25/30] net/sock: teach sock_kmalloc() to call kvmalloc() when possible

Andrey Zhadchenko andrey.zhadchenko at virtuozzo.com
Tue Sep 28 21:49:16 MSK 2021


From: Konstantin Khorenko <khorenko at virtuozzo.com>

sock_setsockopt()
 sk_attach_filter()
  sock_kmalloc()

Memory size to be allocated depends on the number of rules provided by
userspace, but not more than net.core.optmem_max (20480 by default),
which still allows to allocate 3rd order pages via kmalloc() =>
it's better to substitute it with kvmalloc().

But sock_kmalloc() can be called with GFP_ATOMIC from some places,
so we cannot unconditionally call kvmalloc() instead of kmalloc().

Hopefully sk_attach_filter() calls sock_kmalloc() with GFP_KERNEL,
so kvmalloc() can be used there.

=> use kvmalloc_check() which calls kvmalloc() if it's allowed
by provided flags.

https://jira.sw.ru/browse/PSBM-82593

Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>

Ughh, but ok.
Reviewed-by: Andrey Ryabinin <aryabinin at virtuozzo.com>

(cherry picked from vz7 commit 29b736c18d06 ("net/sock: teach sock_kmalloc() to
call kvmalloc() when possible"))

VZ 8 rebase part https://jira.sw.ru/browse/PSBM-127798

Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn at virtuozzo.com>

(cherry picked from vz8 commit 29f9cfc48b3f5d31cb4259eaea6216254cf8c498)
Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko at virtuozzo.com>
---
 net/core/sock.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/net/core/sock.c b/net/core/sock.c
index 202ea92..35db91b 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -2359,7 +2359,7 @@ void *sock_kmalloc(struct sock *sk, int size, gfp_t priority)
 		 * might sleep.
 		 */
 		atomic_add(size, &sk->sk_omem_alloc);
-		mem = kmalloc(size, priority);
+		mem = kvmalloc_check(size, priority);
 		if (mem)
 			return mem;
 		atomic_sub(size, &sk->sk_omem_alloc);
@@ -2378,9 +2378,9 @@ static inline void __sock_kfree_s(struct sock *sk, void *mem, int size,
 	if (WARN_ON_ONCE(!mem))
 		return;
 	if (nullify)
-		kfree_sensitive(mem);
-	else
-		kfree(mem);
+		memset(mem, 0, size);
+
+	kvfree(mem);
 	atomic_sub(size, &sk->sk_omem_alloc);
 }
 
-- 
1.8.3.1



More information about the Devel mailing list