[RHEL7,COMMIT] net/sock: teach sock_kmalloc() to call kvmalloc() when possible

Submitted by Konstantin Khorenko on March 22, 2018, 10:28 a.m.

Details

Message ID 201803221028.w2MASK7L028532@finist_ce7.work
State New
Series "Series without cover letter"
Headers show

Commit Message

Konstantin Khorenko March 22, 2018, 10:28 a.m.
The commit is pushed to "branch-rh7-3.10.0-693.17.1.vz7.45.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-693.17.1.vz7.45.8
------>
commit 243e241a61c3d9293ab06151fce51c80504fa85d
Author: Konstantin Khorenko <khorenko@virtuozzo.com>
Date:   Thu Mar 22 13:28:19 2018 +0300

    net/sock: teach sock_kmalloc() to call kvmalloc() when possible
    
    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@virtuozzo.com>
    
    Ughh, but ok.
    Reviewed-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
---
 net/core/sock.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Patch hide | download patch | download mbox

diff --git a/net/core/sock.c b/net/core/sock.c
index b4abbbf35797..5d2016807042 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1707,7 +1707,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);
@@ -1721,7 +1721,7 @@  EXPORT_SYMBOL(sock_kmalloc);
  */
 void sock_kfree_s(struct sock *sk, void *mem, int size)
 {
-	kfree(mem);
+	kvfree(mem);
 	atomic_sub(size, &sk->sk_omem_alloc);
 }
 EXPORT_SYMBOL(sock_kfree_s);