Whamcloud - gitweb
LU-5270 obdclass: do not lock repetitively when geting jobid 90/10890/3
authorLi Xi <lixi@ddn.com>
Sat, 28 Jun 2014 02:23:38 +0000 (10:23 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 1 Jul 2014 04:21:21 +0000 (04:21 +0000)
When trying to get customized job ID, cfs_get_environ() tries to
lock/unlock mmap_sem for two times, which is unnecessary.

Signed-off-by: Li Xi <lixi@ddn.com>
Change-Id: Iae8a45d87508e3c465c0424d5fa54e294d4fb2b1
Reviewed-on: http://review.whamcloud.com/10890
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
libcfs/libcfs/linux/linux-curproc.c

index 525cebc..cfe1641 100644 (file)
@@ -130,21 +130,24 @@ int cfs_capable(cfs_cap_t cap)
         return capable(cfs_cap_unpack(cap));
 }
 
-static int cfs_access_process_vm(struct task_struct *tsk, unsigned long addr,
+static int cfs_access_process_vm(struct task_struct *tsk,
+                                struct mm_struct *mm,
+                                unsigned long addr,
                                 void *buf, int len, int write)
 {
        /* Just copied from kernel for the kernels which doesn't
         * have access_process_vm() exported */
-       struct mm_struct *mm;
        struct vm_area_struct *vma;
        struct page *page;
        void *old_buf = buf;
 
-       mm = get_task_mm(tsk);
-       if (!mm)
-               return 0;
+       /* Avoid deadlocks on mmap_sem if called from sys_mmap_pgoff(),
+        * which is already holding mmap_sem for writes.  If some other
+        * thread gets the write lock in the meantime, this thread will
+        * block, but at least it won't deadlock on itself.  LU-1735 */
+       if (down_read_trylock(&mm->mmap_sem) == 0)
+               return -EDEADLK;
 
-       down_read(&mm->mmap_sem);
        /* ignore errors, just check how much was sucessfully transfered */
        while (len) {
                int bytes, rc, offset;
@@ -176,7 +179,6 @@ static int cfs_access_process_vm(struct task_struct *tsk, unsigned long addr,
                addr += bytes;
        }
        up_read(&mm->mmap_sem);
-       mmput(mm);
 
        return buf - old_buf;
 }
@@ -202,15 +204,6 @@ int cfs_get_environ(const char *key, char *value, int *val_len)
                RETURN(-EINVAL);
        }
 
-       /* Avoid deadlocks on mmap_sem if called from sys_mmap_pgoff(),
-        * which is already holding mmap_sem for writes.  If some other
-        * thread gets the write lock in the meantime, this thread will
-        * block, but at least it won't deadlock on itself.  LU-1735 */
-       if (down_read_trylock(&mm->mmap_sem) == 0)
-               GOTO(out, rc = -EDEADLK);
-
-       up_read(&mm->mmap_sem);
-
        addr = mm->env_start;
        while (addr < mm->env_end) {
                int this_len, retval, scan_len;
@@ -219,9 +212,11 @@ int cfs_get_environ(const char *key, char *value, int *val_len)
                memset(buffer, 0, buf_len);
 
                this_len = min_t(int, mm->env_end - addr, buf_len);
-               retval = cfs_access_process_vm(current, addr, buffer,
+               retval = cfs_access_process_vm(current, mm, addr, buffer,
                                               this_len, 0);
-               if (retval != this_len)
+               if (retval < 0)
+                       GOTO(out, rc = retval);
+               else if (retval != this_len)
                        break;
 
                addr += retval;