From: Li Xi Date: Sat, 28 Jun 2014 02:23:38 +0000 (+0800) Subject: LU-5270 obdclass: do not lock repetitively when geting jobid X-Git-Tag: 2.6.0-RC1~39 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=c06ad2fda8da78dd48f07ada906724eef0e78db5 LU-5270 obdclass: do not lock repetitively when geting jobid 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 Change-Id: Iae8a45d87508e3c465c0424d5fa54e294d4fb2b1 Reviewed-on: http://review.whamcloud.com/10890 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- diff --git a/libcfs/libcfs/linux/linux-curproc.c b/libcfs/libcfs/linux/linux-curproc.c index 525cebc..cfe1641 100644 --- a/libcfs/libcfs/linux/linux-curproc.c +++ b/libcfs/libcfs/linux/linux-curproc.c @@ -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;