Since mm->locked_vm is already an atomic counter, account_locked_vm()
does not need to hold mmap_lock.

Signed-off-by: Pengfei Li <f...@kernel.page>
---
 drivers/vfio/vfio_iommu_type1.c |  8 ++------
 mm/util.c                       | 15 +++------------
 2 files changed, 5 insertions(+), 18 deletions(-)

diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
index 78013be07fe7..53818fce78a6 100644
--- a/drivers/vfio/vfio_iommu_type1.c
+++ b/drivers/vfio/vfio_iommu_type1.c
@@ -376,12 +376,8 @@ static int vfio_lock_acct(struct vfio_dma *dma, long 
npage, bool async)
        if (!mm)
                return -ESRCH; /* process exited */
 
-       ret = mmap_write_lock_killable(mm);
-       if (!ret) {
-               ret = __account_locked_vm(mm, abs(npage), npage > 0, dma->task,
-                                         dma->lock_cap);
-               mmap_write_unlock(mm);
-       }
+       ret = __account_locked_vm(mm, abs(npage), npage > 0,
+                                       dma->task, dma->lock_cap);
 
        if (async)
                mmput(mm);
diff --git a/mm/util.c b/mm/util.c
index 473add0dc275..320fdd537aea 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -424,8 +424,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm, struct 
rlimit *rlim_stack)
  * @task:        task used to check RLIMIT_MEMLOCK
  * @bypass_rlim: %true if checking RLIMIT_MEMLOCK should be skipped
  *
- * Assumes @task and @mm are valid (i.e. at least one reference on each), and
- * that mmap_lock is held as writer.
+ * Assumes @task and @mm are valid (i.e. at least one reference on each).
  *
  * Return:
  * * 0       on success
@@ -437,8 +436,6 @@ int __account_locked_vm(struct mm_struct *mm, unsigned long 
pages, bool inc,
        unsigned long locked_vm, limit;
        int ret = 0;
 
-       mmap_assert_write_locked(mm);
-
        locked_vm = atomic64_read(&mm->locked_vm);
        if (inc) {
                if (!bypass_rlim) {
@@ -476,17 +473,11 @@ EXPORT_SYMBOL_GPL(__account_locked_vm);
  */
 int account_locked_vm(struct mm_struct *mm, unsigned long pages, bool inc)
 {
-       int ret;
-
        if (pages == 0 || !mm)
                return 0;
 
-       mmap_write_lock(mm);
-       ret = __account_locked_vm(mm, pages, inc, current,
-                                 capable(CAP_IPC_LOCK));
-       mmap_write_unlock(mm);
-
-       return ret;
+       return __account_locked_vm(mm, pages, inc,
+                                       current, capable(CAP_IPC_LOCK));
 }
 EXPORT_SYMBOL_GPL(account_locked_vm);
 
-- 
2.26.2

Reply via email to