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 <[email protected]>
---
 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 885d7c31d76c..ce6681d4ecc0 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;
 }
-- 
2.25.1

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to