[Devel] [PATCH RHEL7 COMMIT] cifs: use kvcalloc for high-order-page allocations

Vasily Averin vvs at virtuozzo.com
Fri Jun 4 11:56:08 MSK 2021


The commit is pushed to "branch-rh7-3.10.0-1160.25.1.vz7.180.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-1160.25.1.vz7.180.10
------>
commit 5df216c56f48b6d4a97584a922e7670cc0f2dc71
Author: Vasily Averin <vvs at virtuozzo.com>
Date:   Fri Jun 4 11:56:08 2021 +0300

    cifs: use kvcalloc for high-order-page allocations
    
    smb2_unlock_range() and smb2_push_mandatory_locks() allocates
    temporal buffer which  consumes 3+ order pages.
    
    WARNING: CPU: 3 PID: 127055 at mm/page_alloc.c:3532 __alloc_pages_nodemask+0x1b1/0x600
        order 4 >= 3, gfp 0xc0d0
        Call Trace:
         [<ffffffff89dbd00f>] dump_stack+0x19/0x1b
         [<ffffffff89db5f86>] panic+0xe8/0x21f
         [<ffffffff8969d6ca>] __warn+0xfa/0x100
         [<ffffffff8969d72f>] warn_slowpath_fmt+0x5f/0x80
         [<ffffffff897e09d1>] __alloc_pages_nodemask+0x1b1/0x600
         [<ffffffff89837018>] alloc_pages_current+0x98/0x110
         [<ffffffff89800298>] kmalloc_order+0x18/0x40
         [<ffffffff898002e6>] kmalloc_order_trace+0x26/0xa0
         [<ffffffff898467c1>] __kmalloc+0x281/0x2a0
         [<ffffffffc0a829aa>] smb2_unlock_range+0xaa/0x340 [cifs]
         [<ffffffffc0a5a221>] cifs_lock+0x3f1/0x1210 [cifs]
         [<ffffffff898d54d5>] vfs_lock_file+0x35/0x60
         [<ffffffff898d5654>] do_lock_file_wait.part.31+0x54/0x100
         [<ffffffff898d6f64>] fcntl_setlk+0x114/0x2d0
         [<ffffffff898878cb>] SyS_fcntl+0x3cb/0x6f0
         [<ffffffff89dd0052>] system_call_fastpath+0x25/0x2a
    
    Let's switch it to kvmalloc to avoid user-triggered disruptive
    actions like OOM killer in case of high-order memory shortage.
    
    https://jira.sw.ru/browse/PSBM-130341
    Signed-off-by: Vasily Averin <vvs at virtuozzo.com>
---
 fs/cifs/smb2file.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c
index 885d7c3..ce6681d 100644
--- a/fs/cifs/smb2file.c
+++ b/fs/cifs/smb2file.c
@@ -128,7 +128,7 @@ smb2_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock,
 		return -EINVAL;
 
 	max_num = max_buf / sizeof(struct smb2_lock_element);
-	buf = kcalloc(max_num, sizeof(struct smb2_lock_element), GFP_KERNEL);
+	buf = kvcalloc(max_num, sizeof(struct smb2_lock_element), GFP_KERNEL);
 	if (!buf)
 		return -ENOMEM;
 
@@ -197,7 +197,7 @@ smb2_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock,
 	}
 	up_write(&cinode->lock_sem);
 
-	kfree(buf);
+	kvfree(buf);
 	return rc;
 }
 
@@ -264,7 +264,7 @@ smb2_push_mandatory_locks(struct cifsFileInfo *cfile)
 	}
 
 	max_num = max_buf / sizeof(struct smb2_lock_element);
-	buf = kcalloc(max_num, sizeof(struct smb2_lock_element), GFP_KERNEL);
+	buf = kvcalloc(max_num, sizeof(struct smb2_lock_element), GFP_KERNEL);
 	if (!buf) {
 		free_xid(xid);
 		return -ENOMEM;
@@ -276,7 +276,7 @@ smb2_push_mandatory_locks(struct cifsFileInfo *cfile)
 			rc = stored_rc;
 	}
 
-	kfree(buf);
+	kvfree(buf);
 	free_xid(xid);
 	return rc;
 }


More information about the Devel mailing list