linux-arch.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem for write killable
  2016-02-29 13:26 [PATCH 0/18] change mmap_sem taken " Michal Hocko
@ 2016-02-29 13:26 ` Michal Hocko
  2016-02-29 13:26   ` Michal Hocko
                     ` (5 more replies)
  0 siblings, 6 replies; 13+ messages in thread
From: Michal Hocko @ 2016-02-29 13:26 UTC (permalink / raw)
  To: LKML
  Cc: Andrew Morton, linux-mm, Alex Deucher, Alex Thorlton,
	Andrea Arcangeli, Andy Lutomirski, Benjamin LaHaise,
	Christian König, Daniel Vetter, Dave Hansen, David Airlie,
	Davidlohr Bueso, David Rientjes, H . Peter Anvin, Hugh Dickins,
	Ingo Molnar, Johannes Weiner, Kirill A . Shutemov,
	Konstantin Khlebnikov, linux-arch, Mel Gorman, Oleg Nesterov,
	Peter Zijlstra

From: Michal Hocko <mhocko@suse.com>

most architectures are relying on mmap_sem for write in their
arch_setup_additional_pages. If the waiting task gets killed by the oom
killer it would block oom_reaper from asynchronous address space reclaim
and reduce the chances of timely OOM resolving. Wait for the lock in
the killable mode and return with EINTR if the task got killed while
waiting.

Cc: linux-arch@vger.kernel.org
Cc: Andy Lutomirski <luto@amacapital.net>
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
 arch/arm/kernel/process.c          | 3 ++-
 arch/arm64/kernel/vdso.c           | 6 ++++--
 arch/hexagon/kernel/vdso.c         | 3 ++-
 arch/mips/kernel/vdso.c            | 3 ++-
 arch/powerpc/kernel/vdso.c         | 3 ++-
 arch/s390/kernel/vdso.c            | 3 ++-
 arch/sh/kernel/vsyscall/vsyscall.c | 4 +++-
 arch/x86/entry/vdso/vma.c          | 3 ++-
 arch/x86/um/vdso/vma.c             | 3 ++-
 9 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index 4adfb46e3ee9..94cccae090fa 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -420,7 +420,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	npages = 1; /* for sigpage */
 	npages += vdso_total_pages;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 	hint = sigpage_addr(mm, npages);
 	addr = get_unmapped_area(NULL, hint, npages << PAGE_SHIFT, 0, 0);
 	if (IS_ERR_VALUE(addr)) {
diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c
index 97bc68f4c689..d7423dfb4a4a 100644
--- a/arch/arm64/kernel/vdso.c
+++ b/arch/arm64/kernel/vdso.c
@@ -95,7 +95,8 @@ int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp)
 	};
 	void *ret;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 	current->mm->context.vdso = (void *)addr;
 
 	/* Map vectors page at the high address. */
@@ -163,7 +164,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,
 	/* Be sure to map the data page */
 	vdso_mapping_len = vdso_text_len + PAGE_SIZE;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 	vdso_base = get_unmapped_area(NULL, 0, vdso_mapping_len, 0, 0);
 	if (IS_ERR_VALUE(vdso_base)) {
 		ret = ERR_PTR(vdso_base);
diff --git a/arch/hexagon/kernel/vdso.c b/arch/hexagon/kernel/vdso.c
index 0bf5a87e4d0a..3ea968415539 100644
--- a/arch/hexagon/kernel/vdso.c
+++ b/arch/hexagon/kernel/vdso.c
@@ -65,7 +65,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	unsigned long vdso_base;
 	struct mm_struct *mm = current->mm;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 
 	/* Try to get it loaded right near ld.so/glibc. */
 	vdso_base = STACK_TOP;
diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c
index 975e99759bab..54e1663ce639 100644
--- a/arch/mips/kernel/vdso.c
+++ b/arch/mips/kernel/vdso.c
@@ -104,7 +104,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	struct resource gic_res;
 	int ret;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 
 	/*
 	 * Determine total area size. This includes the VDSO data itself, the
diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c
index def1b8b5e6c1..6767605ea8da 100644
--- a/arch/powerpc/kernel/vdso.c
+++ b/arch/powerpc/kernel/vdso.c
@@ -195,7 +195,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	 * and end up putting it elsewhere.
 	 * Add enough to the size so that the result can be aligned.
 	 */
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 	vdso_base = get_unmapped_area(NULL, vdso_base,
 				      (vdso_pages << PAGE_SHIFT) +
 				      ((VDSO_ALIGNMENT - 1) & PAGE_MASK),
diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c
index 94495cac8be3..5904abf6b1ae 100644
--- a/arch/s390/kernel/vdso.c
+++ b/arch/s390/kernel/vdso.c
@@ -216,7 +216,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	 * it at vdso_base which is the "natural" base for it, but we might
 	 * fail and end up putting it elsewhere.
 	 */
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 	vdso_base = get_unmapped_area(NULL, 0, vdso_pages << PAGE_SHIFT, 0, 0);
 	if (IS_ERR_VALUE(vdso_base)) {
 		rc = vdso_base;
diff --git a/arch/sh/kernel/vsyscall/vsyscall.c b/arch/sh/kernel/vsyscall/vsyscall.c
index ea2aa1393b87..cc0cc5b4ff18 100644
--- a/arch/sh/kernel/vsyscall/vsyscall.c
+++ b/arch/sh/kernel/vsyscall/vsyscall.c
@@ -64,7 +64,9 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	unsigned long addr;
 	int ret;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
+
 	addr = get_unmapped_area(NULL, 0, PAGE_SIZE, 0, 0);
 	if (IS_ERR_VALUE(addr)) {
 		ret = addr;
diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c
index 10f704584922..69d861f67c47 100644
--- a/arch/x86/entry/vdso/vma.c
+++ b/arch/x86/entry/vdso/vma.c
@@ -174,7 +174,8 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr)
 		addr = 0;
 	}
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 
 	addr = get_unmapped_area(NULL, addr,
 				 image->size - image->sym_vvar_start, 0, 0);
diff --git a/arch/x86/um/vdso/vma.c b/arch/x86/um/vdso/vma.c
index 237c6831e095..6be22f991b59 100644
--- a/arch/x86/um/vdso/vma.c
+++ b/arch/x86/um/vdso/vma.c
@@ -61,7 +61,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	if (!vdso_enabled)
 		return 0;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 
 	err = install_special_mapping(mm, um_vdso_addr, PAGE_SIZE,
 		VM_READ|VM_EXEC|
-- 
2.7.0

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem for write killable
  2016-02-29 13:26 ` [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem " Michal Hocko
@ 2016-02-29 13:26   ` Michal Hocko
  2016-02-29 13:45   ` kbuild test robot
                     ` (4 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: Michal Hocko @ 2016-02-29 13:26 UTC (permalink / raw)
  To: LKML
  Cc: Andrew Morton, linux-mm, Alex Deucher, Alex Thorlton,
	Andrea Arcangeli, Andy Lutomirski, Benjamin LaHaise,
	Christian König, Daniel Vetter, Dave Hansen, David Airlie,
	Davidlohr Bueso, David Rientjes, H . Peter Anvin, Hugh Dickins,
	Ingo Molnar, Johannes Weiner, Kirill A . Shutemov,
	Konstantin Khlebnikov, linux-arch, Mel Gorman, Oleg Nesterov,
	Peter Zijlstra, Petr Cermak, Thomas Gleixner, Michal Hocko

From: Michal Hocko <mhocko@suse.com>

most architectures are relying on mmap_sem for write in their
arch_setup_additional_pages. If the waiting task gets killed by the oom
killer it would block oom_reaper from asynchronous address space reclaim
and reduce the chances of timely OOM resolving. Wait for the lock in
the killable mode and return with EINTR if the task got killed while
waiting.

Cc: linux-arch@vger.kernel.org
Cc: Andy Lutomirski <luto@amacapital.net>
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
 arch/arm/kernel/process.c          | 3 ++-
 arch/arm64/kernel/vdso.c           | 6 ++++--
 arch/hexagon/kernel/vdso.c         | 3 ++-
 arch/mips/kernel/vdso.c            | 3 ++-
 arch/powerpc/kernel/vdso.c         | 3 ++-
 arch/s390/kernel/vdso.c            | 3 ++-
 arch/sh/kernel/vsyscall/vsyscall.c | 4 +++-
 arch/x86/entry/vdso/vma.c          | 3 ++-
 arch/x86/um/vdso/vma.c             | 3 ++-
 9 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index 4adfb46e3ee9..94cccae090fa 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -420,7 +420,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	npages = 1; /* for sigpage */
 	npages += vdso_total_pages;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 	hint = sigpage_addr(mm, npages);
 	addr = get_unmapped_area(NULL, hint, npages << PAGE_SHIFT, 0, 0);
 	if (IS_ERR_VALUE(addr)) {
diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c
index 97bc68f4c689..d7423dfb4a4a 100644
--- a/arch/arm64/kernel/vdso.c
+++ b/arch/arm64/kernel/vdso.c
@@ -95,7 +95,8 @@ int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp)
 	};
 	void *ret;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 	current->mm->context.vdso = (void *)addr;
 
 	/* Map vectors page at the high address. */
@@ -163,7 +164,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,
 	/* Be sure to map the data page */
 	vdso_mapping_len = vdso_text_len + PAGE_SIZE;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 	vdso_base = get_unmapped_area(NULL, 0, vdso_mapping_len, 0, 0);
 	if (IS_ERR_VALUE(vdso_base)) {
 		ret = ERR_PTR(vdso_base);
diff --git a/arch/hexagon/kernel/vdso.c b/arch/hexagon/kernel/vdso.c
index 0bf5a87e4d0a..3ea968415539 100644
--- a/arch/hexagon/kernel/vdso.c
+++ b/arch/hexagon/kernel/vdso.c
@@ -65,7 +65,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	unsigned long vdso_base;
 	struct mm_struct *mm = current->mm;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 
 	/* Try to get it loaded right near ld.so/glibc. */
 	vdso_base = STACK_TOP;
diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c
index 975e99759bab..54e1663ce639 100644
--- a/arch/mips/kernel/vdso.c
+++ b/arch/mips/kernel/vdso.c
@@ -104,7 +104,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	struct resource gic_res;
 	int ret;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 
 	/*
 	 * Determine total area size. This includes the VDSO data itself, the
diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c
index def1b8b5e6c1..6767605ea8da 100644
--- a/arch/powerpc/kernel/vdso.c
+++ b/arch/powerpc/kernel/vdso.c
@@ -195,7 +195,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	 * and end up putting it elsewhere.
 	 * Add enough to the size so that the result can be aligned.
 	 */
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 	vdso_base = get_unmapped_area(NULL, vdso_base,
 				      (vdso_pages << PAGE_SHIFT) +
 				      ((VDSO_ALIGNMENT - 1) & PAGE_MASK),
diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c
index 94495cac8be3..5904abf6b1ae 100644
--- a/arch/s390/kernel/vdso.c
+++ b/arch/s390/kernel/vdso.c
@@ -216,7 +216,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	 * it at vdso_base which is the "natural" base for it, but we might
 	 * fail and end up putting it elsewhere.
 	 */
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 	vdso_base = get_unmapped_area(NULL, 0, vdso_pages << PAGE_SHIFT, 0, 0);
 	if (IS_ERR_VALUE(vdso_base)) {
 		rc = vdso_base;
diff --git a/arch/sh/kernel/vsyscall/vsyscall.c b/arch/sh/kernel/vsyscall/vsyscall.c
index ea2aa1393b87..cc0cc5b4ff18 100644
--- a/arch/sh/kernel/vsyscall/vsyscall.c
+++ b/arch/sh/kernel/vsyscall/vsyscall.c
@@ -64,7 +64,9 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	unsigned long addr;
 	int ret;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
+
 	addr = get_unmapped_area(NULL, 0, PAGE_SIZE, 0, 0);
 	if (IS_ERR_VALUE(addr)) {
 		ret = addr;
diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c
index 10f704584922..69d861f67c47 100644
--- a/arch/x86/entry/vdso/vma.c
+++ b/arch/x86/entry/vdso/vma.c
@@ -174,7 +174,8 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr)
 		addr = 0;
 	}
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 
 	addr = get_unmapped_area(NULL, addr,
 				 image->size - image->sym_vvar_start, 0, 0);
diff --git a/arch/x86/um/vdso/vma.c b/arch/x86/um/vdso/vma.c
index 237c6831e095..6be22f991b59 100644
--- a/arch/x86/um/vdso/vma.c
+++ b/arch/x86/um/vdso/vma.c
@@ -61,7 +61,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	if (!vdso_enabled)
 		return 0;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 
 	err = install_special_mapping(mm, um_vdso_addr, PAGE_SIZE,
 		VM_READ|VM_EXEC|
-- 
2.7.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem for write killable
  2016-02-29 13:26 ` [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem " Michal Hocko
  2016-02-29 13:26   ` Michal Hocko
@ 2016-02-29 13:45   ` kbuild test robot
  2016-02-29 13:45     ` kbuild test robot
  2016-02-29 13:50   ` kbuild test robot
                     ` (3 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: kbuild test robot @ 2016-02-29 13:45 UTC (permalink / raw)
  To: Michal Hocko
  Cc: kbuild-all, LKML, Andrew Morton, linux-mm, Alex Deucher,
	Alex Thorlton, Andrea Arcangeli, Andy Lutomirski,
	Benjamin LaHaise, Christian König, Daniel Vetter,
	Dave Hansen, David Airlie, Davidlohr Bueso, David Rientjes,
	H . Peter Anvin, Hugh Dickins, Ingo Molnar, Johannes Weiner,
	Kirill A . Shutemov, Konstantin Khlebnikov, linux-arch,
	Mel Gorman

[-- Attachment #1: Type: text/plain, Size: 1377 bytes --]

Hi Michal,

[auto build test ERROR on next-20160229]
[also build test ERROR on v4.5-rc6]
[cannot apply to drm/drm-next drm-intel/for-linux-next v4.5-rc6 v4.5-rc5 v4.5-rc4]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Michal-Hocko/change-mmap_sem-taken-for-write-killable/20160229-213258
config: i386-randconfig-x004-201609 (attached as .config)
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

   arch/x86/entry/vdso/vma.c: In function 'map_vdso':
>> arch/x86/entry/vdso/vma.c:177:6: error: implicit declaration of function 'down_write_killable' [-Werror=implicit-function-declaration]
     if (down_write_killable(&mm->mmap_sem))
         ^
   cc1: some warnings being treated as errors

vim +/down_write_killable +177 arch/x86/entry/vdso/vma.c

   171			addr = vdso_addr(current->mm->start_stack,
   172					 image->size - image->sym_vvar_start);
   173		} else {
   174			addr = 0;
   175		}
   176	
 > 177		if (down_write_killable(&mm->mmap_sem))
   178			return -EINTR;
   179	
   180		addr = get_unmapped_area(NULL, addr,

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 30172 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem for write killable
  2016-02-29 13:45   ` kbuild test robot
@ 2016-02-29 13:45     ` kbuild test robot
  0 siblings, 0 replies; 13+ messages in thread
From: kbuild test robot @ 2016-02-29 13:45 UTC (permalink / raw)
  To: Michal Hocko
  Cc: kbuild-all, LKML, Andrew Morton, linux-mm, Alex Deucher,
	Alex Thorlton, Andrea Arcangeli, Andy Lutomirski,
	Benjamin LaHaise, Christian König, Daniel Vetter,
	Dave Hansen, David Airlie, Davidlohr Bueso, David Rientjes,
	H . Peter Anvin, Hugh Dickins, Ingo Molnar, Johannes Weiner,
	Kirill A . Shutemov, Konstantin Khlebnikov, linux-arch,
	Mel Gorman, Oleg Nesterov, Peter Zijlstra, Petr Cermak,
	Thomas Gleixner, Michal Hocko

[-- Attachment #1: Type: text/plain, Size: 1377 bytes --]

Hi Michal,

[auto build test ERROR on next-20160229]
[also build test ERROR on v4.5-rc6]
[cannot apply to drm/drm-next drm-intel/for-linux-next v4.5-rc6 v4.5-rc5 v4.5-rc4]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Michal-Hocko/change-mmap_sem-taken-for-write-killable/20160229-213258
config: i386-randconfig-x004-201609 (attached as .config)
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

   arch/x86/entry/vdso/vma.c: In function 'map_vdso':
>> arch/x86/entry/vdso/vma.c:177:6: error: implicit declaration of function 'down_write_killable' [-Werror=implicit-function-declaration]
     if (down_write_killable(&mm->mmap_sem))
         ^
   cc1: some warnings being treated as errors

vim +/down_write_killable +177 arch/x86/entry/vdso/vma.c

   171			addr = vdso_addr(current->mm->start_stack,
   172					 image->size - image->sym_vvar_start);
   173		} else {
   174			addr = 0;
   175		}
   176	
 > 177		if (down_write_killable(&mm->mmap_sem))
   178			return -EINTR;
   179	
   180		addr = get_unmapped_area(NULL, addr,

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 30172 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem for write killable
  2016-02-29 13:26 ` [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem " Michal Hocko
  2016-02-29 13:26   ` Michal Hocko
  2016-02-29 13:45   ` kbuild test robot
@ 2016-02-29 13:50   ` kbuild test robot
  2016-02-29 13:50     ` kbuild test robot
  2016-02-29 13:53   ` kbuild test robot
                     ` (2 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: kbuild test robot @ 2016-02-29 13:50 UTC (permalink / raw)
  To: Michal Hocko
  Cc: kbuild-all, LKML, Andrew Morton, linux-mm, Alex Deucher,
	Alex Thorlton, Andrea Arcangeli, Andy Lutomirski,
	Benjamin LaHaise, Christian König, Daniel Vetter,
	Dave Hansen, David Airlie, Davidlohr Bueso, David Rientjes,
	H . Peter Anvin, Hugh Dickins, Ingo Molnar, Johannes Weiner,
	Kirill A . Shutemov, Konstantin Khlebnikov, linux-arch,
	Mel Gorman

[-- Attachment #1: Type: text/plain, Size: 1676 bytes --]

Hi Michal,

[auto build test ERROR on next-20160229]
[also build test ERROR on v4.5-rc6]
[cannot apply to drm/drm-next drm-intel/for-linux-next v4.5-rc6 v4.5-rc5 v4.5-rc4]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Michal-Hocko/change-mmap_sem-taken-for-write-killable/20160229-213258
config: s390-allyesconfig (attached as .config)
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=s390 

All errors (new ones prefixed by >>):

   arch/s390/kernel/vdso.c: In function 'arch_setup_additional_pages':
>> arch/s390/kernel/vdso.c:219:2: error: implicit declaration of function 'down_write_killable' [-Werror=implicit-function-declaration]
     if (down_write_killable(&mm->mmap_sem))
     ^
   cc1: some warnings being treated as errors

vim +/down_write_killable +219 arch/s390/kernel/vdso.c

   213	
   214		/*
   215		 * pick a base address for the vDSO in process space. We try to put
   216		 * it at vdso_base which is the "natural" base for it, but we might
   217		 * fail and end up putting it elsewhere.
   218		 */
 > 219		if (down_write_killable(&mm->mmap_sem))
   220			return -EINTR;
   221		vdso_base = get_unmapped_area(NULL, 0, vdso_pages << PAGE_SHIFT, 0, 0);
   222		if (IS_ERR_VALUE(vdso_base)) {

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 40506 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem for write killable
  2016-02-29 13:50   ` kbuild test robot
@ 2016-02-29 13:50     ` kbuild test robot
  0 siblings, 0 replies; 13+ messages in thread
From: kbuild test robot @ 2016-02-29 13:50 UTC (permalink / raw)
  To: Michal Hocko
  Cc: kbuild-all, LKML, Andrew Morton, linux-mm, Alex Deucher,
	Alex Thorlton, Andrea Arcangeli, Andy Lutomirski,
	Benjamin LaHaise, Christian König, Daniel Vetter,
	Dave Hansen, David Airlie, Davidlohr Bueso, David Rientjes,
	H . Peter Anvin, Hugh Dickins, Ingo Molnar, Johannes Weiner,
	Kirill A . Shutemov, Konstantin Khlebnikov, linux-arch,
	Mel Gorman, Oleg Nesterov, Peter Zijlstra, Petr Cermak,
	Thomas Gleixner, Michal Hocko

[-- Attachment #1: Type: text/plain, Size: 1676 bytes --]

Hi Michal,

[auto build test ERROR on next-20160229]
[also build test ERROR on v4.5-rc6]
[cannot apply to drm/drm-next drm-intel/for-linux-next v4.5-rc6 v4.5-rc5 v4.5-rc4]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Michal-Hocko/change-mmap_sem-taken-for-write-killable/20160229-213258
config: s390-allyesconfig (attached as .config)
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=s390 

All errors (new ones prefixed by >>):

   arch/s390/kernel/vdso.c: In function 'arch_setup_additional_pages':
>> arch/s390/kernel/vdso.c:219:2: error: implicit declaration of function 'down_write_killable' [-Werror=implicit-function-declaration]
     if (down_write_killable(&mm->mmap_sem))
     ^
   cc1: some warnings being treated as errors

vim +/down_write_killable +219 arch/s390/kernel/vdso.c

   213	
   214		/*
   215		 * pick a base address for the vDSO in process space. We try to put
   216		 * it at vdso_base which is the "natural" base for it, but we might
   217		 * fail and end up putting it elsewhere.
   218		 */
 > 219		if (down_write_killable(&mm->mmap_sem))
   220			return -EINTR;
   221		vdso_base = get_unmapped_area(NULL, 0, vdso_pages << PAGE_SHIFT, 0, 0);
   222		if (IS_ERR_VALUE(vdso_base)) {

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 40506 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem for write killable
  2016-02-29 13:26 ` [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem " Michal Hocko
                     ` (2 preceding siblings ...)
  2016-02-29 13:50   ` kbuild test robot
@ 2016-02-29 13:53   ` kbuild test robot
  2016-02-29 13:53     ` kbuild test robot
  2016-02-29 15:41   ` Andy Lutomirski
  2016-03-11 11:28   ` Vlastimil Babka
  5 siblings, 1 reply; 13+ messages in thread
From: kbuild test robot @ 2016-02-29 13:53 UTC (permalink / raw)
  To: Michal Hocko
  Cc: kbuild-all, LKML, Andrew Morton, linux-mm, Alex Deucher,
	Alex Thorlton, Andrea Arcangeli, Andy Lutomirski,
	Benjamin LaHaise, Christian König, Daniel Vetter,
	Dave Hansen, David Airlie, Davidlohr Bueso, David Rientjes,
	H . Peter Anvin, Hugh Dickins, Ingo Molnar, Johannes Weiner,
	Kirill A . Shutemov, Konstantin Khlebnikov, linux-arch,
	Mel Gorman

[-- Attachment #1: Type: text/plain, Size: 1563 bytes --]

Hi Michal,

[auto build test ERROR on next-20160229]
[also build test ERROR on v4.5-rc6]
[cannot apply to drm/drm-next drm-intel/for-linux-next v4.5-rc6 v4.5-rc5 v4.5-rc4]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Michal-Hocko/change-mmap_sem-taken-for-write-killable/20160229-213258
config: mips-allyesconfig (attached as .config)
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=mips 

All errors (new ones prefixed by >>):

   arch/mips/kernel/vdso.c: In function 'arch_setup_additional_pages':
>> arch/mips/kernel/vdso.c:107:6: error: implicit declaration of function 'down_write_killable' [-Werror=implicit-function-declaration]
     if (down_write_killable(&mm->mmap_sem))
         ^
   cc1: some warnings being treated as errors

vim +/down_write_killable +107 arch/mips/kernel/vdso.c

   101		struct mm_struct *mm = current->mm;
   102		unsigned long gic_size, vvar_size, size, base, data_addr, vdso_addr;
   103		struct vm_area_struct *vma;
   104		struct resource gic_res;
   105		int ret;
   106	
 > 107		if (down_write_killable(&mm->mmap_sem))
   108			return -EINTR;
   109	
   110		/*

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 41198 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem for write killable
  2016-02-29 13:53   ` kbuild test robot
@ 2016-02-29 13:53     ` kbuild test robot
  0 siblings, 0 replies; 13+ messages in thread
From: kbuild test robot @ 2016-02-29 13:53 UTC (permalink / raw)
  To: Michal Hocko
  Cc: kbuild-all, LKML, Andrew Morton, linux-mm, Alex Deucher,
	Alex Thorlton, Andrea Arcangeli, Andy Lutomirski,
	Benjamin LaHaise, Christian König, Daniel Vetter,
	Dave Hansen, David Airlie, Davidlohr Bueso, David Rientjes,
	H . Peter Anvin, Hugh Dickins, Ingo Molnar, Johannes Weiner,
	Kirill A . Shutemov, Konstantin Khlebnikov, linux-arch,
	Mel Gorman, Oleg Nesterov, Peter Zijlstra, Petr Cermak,
	Thomas Gleixner, Michal Hocko

[-- Attachment #1: Type: text/plain, Size: 1563 bytes --]

Hi Michal,

[auto build test ERROR on next-20160229]
[also build test ERROR on v4.5-rc6]
[cannot apply to drm/drm-next drm-intel/for-linux-next v4.5-rc6 v4.5-rc5 v4.5-rc4]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Michal-Hocko/change-mmap_sem-taken-for-write-killable/20160229-213258
config: mips-allyesconfig (attached as .config)
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=mips 

All errors (new ones prefixed by >>):

   arch/mips/kernel/vdso.c: In function 'arch_setup_additional_pages':
>> arch/mips/kernel/vdso.c:107:6: error: implicit declaration of function 'down_write_killable' [-Werror=implicit-function-declaration]
     if (down_write_killable(&mm->mmap_sem))
         ^
   cc1: some warnings being treated as errors

vim +/down_write_killable +107 arch/mips/kernel/vdso.c

   101		struct mm_struct *mm = current->mm;
   102		unsigned long gic_size, vvar_size, size, base, data_addr, vdso_addr;
   103		struct vm_area_struct *vma;
   104		struct resource gic_res;
   105		int ret;
   106	
 > 107		if (down_write_killable(&mm->mmap_sem))
   108			return -EINTR;
   109	
   110		/*

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 41198 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem for write killable
  2016-02-29 13:26 ` [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem " Michal Hocko
                     ` (3 preceding siblings ...)
  2016-02-29 13:53   ` kbuild test robot
@ 2016-02-29 15:41   ` Andy Lutomirski
  2016-02-29 15:41     ` Andy Lutomirski
  2016-03-11 11:28   ` Vlastimil Babka
  5 siblings, 1 reply; 13+ messages in thread
From: Andy Lutomirski @ 2016-02-29 15:41 UTC (permalink / raw)
  To: Michal Hocko
  Cc: LKML, Andrew Morton, linux-mm@kvack.org, Alex Deucher,
	Alex Thorlton, Andrea Arcangeli, Benjamin LaHaise,
	Christian König, Daniel Vetter, Dave Hansen, David Airlie,
	Davidlohr Bueso, David Rientjes, H . Peter Anvin, Hugh Dickins,
	Ingo Molnar, Johannes Weiner, Kirill A . Shutemov,
	Konstantin Khlebnikov, linux-arch, Mel Gorman, Oleg Nesterov

On Mon, Feb 29, 2016 at 5:26 AM, Michal Hocko <mhocko@kernel.org> wrote:
> From: Michal Hocko <mhocko@suse.com>
>
> most architectures are relying on mmap_sem for write in their
> arch_setup_additional_pages. If the waiting task gets killed by the oom
> killer it would block oom_reaper from asynchronous address space reclaim
> and reduce the chances of timely OOM resolving. Wait for the lock in
> the killable mode and return with EINTR if the task got killed while
> waiting.

Acked-by: Andy Lutomirski <luto@kernel.org> # for the x86 vdso

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem for write killable
  2016-02-29 15:41   ` Andy Lutomirski
@ 2016-02-29 15:41     ` Andy Lutomirski
  0 siblings, 0 replies; 13+ messages in thread
From: Andy Lutomirski @ 2016-02-29 15:41 UTC (permalink / raw)
  To: Michal Hocko
  Cc: LKML, Andrew Morton, linux-mm@kvack.org, Alex Deucher,
	Alex Thorlton, Andrea Arcangeli, Benjamin LaHaise,
	Christian König, Daniel Vetter, Dave Hansen, David Airlie,
	Davidlohr Bueso, David Rientjes, H . Peter Anvin, Hugh Dickins,
	Ingo Molnar, Johannes Weiner, Kirill A . Shutemov,
	Konstantin Khlebnikov, linux-arch, Mel Gorman, Oleg Nesterov,
	Peter Zijlstra, Petr Cermak, Thomas Gleixner, Michal Hocko

On Mon, Feb 29, 2016 at 5:26 AM, Michal Hocko <mhocko@kernel.org> wrote:
> From: Michal Hocko <mhocko@suse.com>
>
> most architectures are relying on mmap_sem for write in their
> arch_setup_additional_pages. If the waiting task gets killed by the oom
> killer it would block oom_reaper from asynchronous address space reclaim
> and reduce the chances of timely OOM resolving. Wait for the lock in
> the killable mode and return with EINTR if the task got killed while
> waiting.

Acked-by: Andy Lutomirski <luto@kernel.org> # for the x86 vdso

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem for write killable
  2016-02-29 13:26 ` [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem " Michal Hocko
                     ` (4 preceding siblings ...)
  2016-02-29 15:41   ` Andy Lutomirski
@ 2016-03-11 11:28   ` Vlastimil Babka
  2016-03-11 11:28     ` Vlastimil Babka
  5 siblings, 1 reply; 13+ messages in thread
From: Vlastimil Babka @ 2016-03-11 11:28 UTC (permalink / raw)
  To: Michal Hocko, LKML
  Cc: Andrew Morton, linux-mm, Alex Deucher, Alex Thorlton,
	Andrea Arcangeli, Andy Lutomirski, Benjamin LaHaise,
	Christian König, Daniel Vetter, Dave Hansen, David Airlie,
	Davidlohr Bueso, David Rientjes, H . Peter Anvin, Hugh Dickins,
	Ingo Molnar, Johannes Weiner, Kirill A . Shutemov,
	Konstantin Khlebnikov, linux-arch, Mel Gorman, Oleg Nesterov,
	Peter Zijlstra

On 02/29/2016 02:26 PM, Michal Hocko wrote:
> From: Michal Hocko <mhocko@suse.com>
>
> most architectures are relying on mmap_sem for write in their
> arch_setup_additional_pages. If the waiting task gets killed by the oom
> killer it would block oom_reaper from asynchronous address space reclaim
> and reduce the chances of timely OOM resolving. Wait for the lock in
> the killable mode and return with EINTR if the task got killed while
> waiting.
>
> Cc: linux-arch@vger.kernel.org
> Cc: Andy Lutomirski <luto@amacapital.net>
> Signed-off-by: Michal Hocko <mhocko@suse.com>


I don't have much arch-specific insight, but looks OK.

Acked-by: Vlastimil Babka <vbabka@suse.cz>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem for write killable
  2016-03-11 11:28   ` Vlastimil Babka
@ 2016-03-11 11:28     ` Vlastimil Babka
  0 siblings, 0 replies; 13+ messages in thread
From: Vlastimil Babka @ 2016-03-11 11:28 UTC (permalink / raw)
  To: Michal Hocko, LKML
  Cc: Andrew Morton, linux-mm, Alex Deucher, Alex Thorlton,
	Andrea Arcangeli, Andy Lutomirski, Benjamin LaHaise,
	Christian König, Daniel Vetter, Dave Hansen, David Airlie,
	Davidlohr Bueso, David Rientjes, H . Peter Anvin, Hugh Dickins,
	Ingo Molnar, Johannes Weiner, Kirill A . Shutemov,
	Konstantin Khlebnikov, linux-arch, Mel Gorman, Oleg Nesterov,
	Peter Zijlstra, Petr Cermak, Thomas Gleixner, Michal Hocko

On 02/29/2016 02:26 PM, Michal Hocko wrote:
> From: Michal Hocko <mhocko@suse.com>
>
> most architectures are relying on mmap_sem for write in their
> arch_setup_additional_pages. If the waiting task gets killed by the oom
> killer it would block oom_reaper from asynchronous address space reclaim
> and reduce the chances of timely OOM resolving. Wait for the lock in
> the killable mode and return with EINTR if the task got killed while
> waiting.
>
> Cc: linux-arch@vger.kernel.org
> Cc: Andy Lutomirski <luto@amacapital.net>
> Signed-off-by: Michal Hocko <mhocko@suse.com>


I don't have much arch-specific insight, but looks OK.

Acked-by: Vlastimil Babka <vbabka@suse.cz>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem for write killable
       [not found] <1461675385-5934-1-git-send-email-mhocko@kernel.org>
@ 2016-04-26 12:56 ` Michal Hocko
  0 siblings, 0 replies; 13+ messages in thread
From: Michal Hocko @ 2016-04-26 12:56 UTC (permalink / raw)
  To: linux-mm, Andrew Morton
  Cc: LKML, Michal Hocko, linux-arch, Andy Lutomirski, Vlastimil Babka

From: Michal Hocko <mhocko@suse.com>

most architectures are relying on mmap_sem for write in their
arch_setup_additional_pages. If the waiting task gets killed by the oom
killer it would block oom_reaper from asynchronous address space reclaim
and reduce the chances of timely OOM resolving. Wait for the lock in
the killable mode and return with EINTR if the task got killed while
waiting.

Cc: linux-arch@vger.kernel.org
Acked-by: Andy Lutomirski <luto@amacapital.net> # for the x86 vdso
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
 arch/arm/kernel/process.c          | 3 ++-
 arch/arm64/kernel/vdso.c           | 6 ++++--
 arch/hexagon/kernel/vdso.c         | 3 ++-
 arch/mips/kernel/vdso.c            | 3 ++-
 arch/powerpc/kernel/vdso.c         | 3 ++-
 arch/s390/kernel/vdso.c            | 3 ++-
 arch/sh/kernel/vsyscall/vsyscall.c | 4 +++-
 arch/x86/entry/vdso/vma.c          | 3 ++-
 arch/x86/um/vdso/vma.c             | 3 ++-
 9 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index a647d6642f3e..4a803c5a1ff7 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -420,7 +420,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	npages = 1; /* for sigpage */
 	npages += vdso_total_pages;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 	hint = sigpage_addr(mm, npages);
 	addr = get_unmapped_area(NULL, hint, npages << PAGE_SHIFT, 0, 0);
 	if (IS_ERR_VALUE(addr)) {
diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c
index 64fc030be0f2..9fefb005812a 100644
--- a/arch/arm64/kernel/vdso.c
+++ b/arch/arm64/kernel/vdso.c
@@ -95,7 +95,8 @@ int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp)
 	};
 	void *ret;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 	current->mm->context.vdso = (void *)addr;
 
 	/* Map vectors page at the high address. */
@@ -163,7 +164,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,
 	/* Be sure to map the data page */
 	vdso_mapping_len = vdso_text_len + PAGE_SIZE;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 	vdso_base = get_unmapped_area(NULL, 0, vdso_mapping_len, 0, 0);
 	if (IS_ERR_VALUE(vdso_base)) {
 		ret = ERR_PTR(vdso_base);
diff --git a/arch/hexagon/kernel/vdso.c b/arch/hexagon/kernel/vdso.c
index 0bf5a87e4d0a..3ea968415539 100644
--- a/arch/hexagon/kernel/vdso.c
+++ b/arch/hexagon/kernel/vdso.c
@@ -65,7 +65,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	unsigned long vdso_base;
 	struct mm_struct *mm = current->mm;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 
 	/* Try to get it loaded right near ld.so/glibc. */
 	vdso_base = STACK_TOP;
diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c
index 975e99759bab..54e1663ce639 100644
--- a/arch/mips/kernel/vdso.c
+++ b/arch/mips/kernel/vdso.c
@@ -104,7 +104,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	struct resource gic_res;
 	int ret;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 
 	/*
 	 * Determine total area size. This includes the VDSO data itself, the
diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c
index def1b8b5e6c1..6767605ea8da 100644
--- a/arch/powerpc/kernel/vdso.c
+++ b/arch/powerpc/kernel/vdso.c
@@ -195,7 +195,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	 * and end up putting it elsewhere.
 	 * Add enough to the size so that the result can be aligned.
 	 */
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 	vdso_base = get_unmapped_area(NULL, vdso_base,
 				      (vdso_pages << PAGE_SHIFT) +
 				      ((VDSO_ALIGNMENT - 1) & PAGE_MASK),
diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c
index 94495cac8be3..5904abf6b1ae 100644
--- a/arch/s390/kernel/vdso.c
+++ b/arch/s390/kernel/vdso.c
@@ -216,7 +216,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	 * it at vdso_base which is the "natural" base for it, but we might
 	 * fail and end up putting it elsewhere.
 	 */
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 	vdso_base = get_unmapped_area(NULL, 0, vdso_pages << PAGE_SHIFT, 0, 0);
 	if (IS_ERR_VALUE(vdso_base)) {
 		rc = vdso_base;
diff --git a/arch/sh/kernel/vsyscall/vsyscall.c b/arch/sh/kernel/vsyscall/vsyscall.c
index ea2aa1393b87..cc0cc5b4ff18 100644
--- a/arch/sh/kernel/vsyscall/vsyscall.c
+++ b/arch/sh/kernel/vsyscall/vsyscall.c
@@ -64,7 +64,9 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	unsigned long addr;
 	int ret;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
+
 	addr = get_unmapped_area(NULL, 0, PAGE_SIZE, 0, 0);
 	if (IS_ERR_VALUE(addr)) {
 		ret = addr;
diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c
index b3cf81333a54..ab220ac9b3b9 100644
--- a/arch/x86/entry/vdso/vma.c
+++ b/arch/x86/entry/vdso/vma.c
@@ -163,7 +163,8 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr)
 		addr = 0;
 	}
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 
 	addr = get_unmapped_area(NULL, addr,
 				 image->size - image->sym_vvar_start, 0, 0);
diff --git a/arch/x86/um/vdso/vma.c b/arch/x86/um/vdso/vma.c
index 237c6831e095..6be22f991b59 100644
--- a/arch/x86/um/vdso/vma.c
+++ b/arch/x86/um/vdso/vma.c
@@ -61,7 +61,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 	if (!vdso_enabled)
 		return 0;
 
-	down_write(&mm->mmap_sem);
+	if (down_write_killable(&mm->mmap_sem))
+		return -EINTR;
 
 	err = install_special_mapping(mm, um_vdso_addr, PAGE_SIZE,
 		VM_READ|VM_EXEC|
-- 
2.8.0.rc3

^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2016-04-26 12:56 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <1461675385-5934-1-git-send-email-mhocko@kernel.org>
2016-04-26 12:56 ` [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem for write killable Michal Hocko
2016-02-29 13:26 [PATCH 0/18] change mmap_sem taken " Michal Hocko
2016-02-29 13:26 ` [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem " Michal Hocko
2016-02-29 13:26   ` Michal Hocko
2016-02-29 13:45   ` kbuild test robot
2016-02-29 13:45     ` kbuild test robot
2016-02-29 13:50   ` kbuild test robot
2016-02-29 13:50     ` kbuild test robot
2016-02-29 13:53   ` kbuild test robot
2016-02-29 13:53     ` kbuild test robot
2016-02-29 15:41   ` Andy Lutomirski
2016-02-29 15:41     ` Andy Lutomirski
2016-03-11 11:28   ` Vlastimil Babka
2016-03-11 11:28     ` Vlastimil Babka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).