Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753432AbdHIRQz (ORCPT ); Wed, 9 Aug 2017 13:16:55 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:38792 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753188AbdHIQxy (ORCPT ); Wed, 9 Aug 2017 12:53:54 -0400 From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Mike Rapoport , Andrea Arcangeli , "Dr. David Alan Gilbert" , Pavel Emelyanov , Andrew Morton , Linus Torvalds Subject: [PATCH 4.12 021/106] userfaultfd: non-cooperative: flush event_wqh at release time Date: Wed, 9 Aug 2017 09:52:05 -0700 Message-Id: <20170809164518.933665713@linuxfoundation.org> X-Mailer: git-send-email 2.14.0 In-Reply-To: <20170809164515.714288642@linuxfoundation.org> References: <20170809164515.714288642@linuxfoundation.org> User-Agent: quilt/0.65 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1377 Lines: 40 4.12-stable review patch. If anyone has any objections, please let me know. ------------------ From: Mike Rapoport commit 5a18b64e3f02125be1c0ef777501ae38aafe2a24 upstream. There may still be threads waiting on event_wqh at the time the userfault file descriptor is closed. Flush the events wait-queue to prevent waiting threads from hanging. Link: http://lkml.kernel.org/r/1501398127-30419-1-git-send-email-rppt@linux.vnet.ibm.com Fixes: 9cd75c3cd4c3d ("userfaultfd: non-cooperative: add ability to report non-PF events from uffd descriptor") Signed-off-by: Mike Rapoport Cc: Andrea Arcangeli Cc: "Dr. David Alan Gilbert" Cc: Pavel Emelyanov Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- fs/userfaultfd.c | 3 +++ 1 file changed, 3 insertions(+) --- a/fs/userfaultfd.c +++ b/fs/userfaultfd.c @@ -851,6 +851,9 @@ wakeup: __wake_up_locked_key(&ctx->fault_wqh, TASK_NORMAL, &range); spin_unlock(&ctx->fault_pending_wqh.lock); + /* Flush pending events that may still wait on event_wqh */ + wake_up_all(&ctx->event_wqh); + wake_up_poll(&ctx->fd_wqh, POLLHUP); userfaultfd_ctx_put(ctx); return 0;