| From 306d6c49ac9ded11114cb53b0925da52f2c2ada1 Mon Sep 17 00:00:00 2001 |
| From: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com> |
| Date: Mon, 16 Jul 2018 10:38:57 +0200 |
| Subject: s390/kvm: fix deadlock when killed by oom |
| |
| From: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com> |
| |
| commit 306d6c49ac9ded11114cb53b0925da52f2c2ada1 upstream. |
| |
| When the oom killer kills a userspace process in the page fault handler |
| while in guest context, the fault handler fails to release the mm_sem |
| if the FAULT_FLAG_RETRY_NOWAIT option is set. This leads to a deadlock |
| when tearing down the mm when the process terminates. This bug can only |
| happen when pfault is enabled, so only KVM clients are affected. |
| |
| The problem arises in the rare cases in which handle_mm_fault does not |
| release the mm_sem. This patch fixes the issue by manually releasing |
| the mm_sem when needed. |
| |
| Fixes: 24eb3a824c4f3 ("KVM: s390: Add FAULT_FLAG_RETRY_NOWAIT for guest fault") |
| Cc: <stable@vger.kernel.org> # 3.15+ |
| Signed-off-by: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com> |
| Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/s390/mm/fault.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/arch/s390/mm/fault.c |
| +++ b/arch/s390/mm/fault.c |
| @@ -486,6 +486,8 @@ retry: |
| /* No reason to continue if interrupted by SIGKILL. */ |
| if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) { |
| fault = VM_FAULT_SIGNAL; |
| + if (flags & FAULT_FLAG_RETRY_NOWAIT) |
| + goto out_up; |
| goto out; |
| } |
| if (unlikely(fault & VM_FAULT_ERROR)) |