From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.4 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0D170C2D0EC for ; Sun, 12 Apr 2020 20:11:20 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id BEA0620656 for ; Sun, 12 Apr 2020 20:11:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="CdqFIbVA" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BEA0620656 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 59F918E00EC; Sun, 12 Apr 2020 16:11:19 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 54E798E00D0; Sun, 12 Apr 2020 16:11:19 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 464F08E00EC; Sun, 12 Apr 2020 16:11:19 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0164.hostedemail.com [216.40.44.164]) by kanga.kvack.org (Postfix) with ESMTP id 2EA048E00D0 for ; Sun, 12 Apr 2020 16:11:19 -0400 (EDT) Received: from smtpin19.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id E90FB824556B for ; Sun, 12 Apr 2020 20:11:18 +0000 (UTC) X-FDA: 76700297436.19.view67_28888c5bf9223 X-HE-Tag: view67_28888c5bf9223 X-Filterd-Recvd-Size: 4525 Received: from mail-ed1-f45.google.com (mail-ed1-f45.google.com [209.85.208.45]) by imf32.hostedemail.com (Postfix) with ESMTP for ; Sun, 12 Apr 2020 20:11:18 +0000 (UTC) Received: by mail-ed1-f45.google.com with SMTP id v1so9562576edq.8 for ; Sun, 12 Apr 2020 13:11:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:from:date:message-id:subject:to:cc; bh=xVoFy5prvKV31pJ2Xw6jO7vr4DzZOqRzuwySyEyap1w=; b=CdqFIbVA8zdrhadBSMdnbHTdVYECnGJFNfF95qrXCJfSD0zjSZsJLLJFoL8sYKR2RZ Mphf/TZxLswlvJPlYGAXIVe2PPZgakecDnfKsE4F29aPiHYXx8xsdJ2xXM7KUCNfjUDp qmtOAiUNff6+kKlwpPozZm9h51WJNUM8c4glLohJK1VvdWoDQQcuOPXTS5G8gZvmB7GA TLmTeq82QVrWeTiuYHJIW7i0/c4M71bd4lNtx8cfyB5kMTyY+ypFIguO+gpDj1rSIEC6 2BzyZpSv2sl1hZk+JYC1rKZl8A5hyBtlNSlkjm69rZDPGUDpMPQfo1u48LZD0lLAW8JT RvBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to:cc; bh=xVoFy5prvKV31pJ2Xw6jO7vr4DzZOqRzuwySyEyap1w=; b=ZPgdPG2Pf2K2939RRwD4MwC+6E59O7BQXvqrkoRtr7LNsFpq5xT7nHt3EktY3FPNxk G186wVOjjwU42ZW3+C9yEd0Xf1+v8MJ0cCZsn3oabtWO4djKmvPN0REGiQ4StuAJzSLn egs6J1DnRrtzNKXAJbX/8RgHJtS3lsv3aMchNP+597hMUfgQGL4g2XcJZzyPN5f76Itq Sk4mah147ux6l5D2R+9AAj4aNWvl3Wx/mGmMyYMw1X6+iUUUMMwzli9aBbXz4ADAcmMa /SbgXmJV5iJMSFJ9nc8Q+5VdVs/xgxvzmt3AR99EPDhlGmYYG72iLR+Lx/oHNV1Gf0zo 1wcw== X-Gm-Message-State: AGi0PuaYog4FxJ0khnBlITwF4X0YyaAtp4T4NpP3jjnGNW6FewxZPeNk xlUMatBJzXVuubSIzMrBfG3Tbb169daVmEpdMJmTiQ== X-Google-Smtp-Source: APiQypLhOLcaZ+/VK/nbtE3aYw+nKyFCUuKaU2/i4T7+O1pmbRnsb1CcWeVsIE1TEQZLDLaOlHNU3LPFbYu99daVF2k= X-Received: by 2002:a17:906:fc18:: with SMTP id ov24mr12407159ejb.189.1586722276868; Sun, 12 Apr 2020 13:11:16 -0700 (PDT) MIME-Version: 1.0 From: Brian Geffon Date: Sun, 12 Apr 2020 13:10:40 -0700 Message-ID: Subject: Userfaultfd doesn't seem to break out of poll on fd close To: Andrea Arcangeli Cc: linux-mm , LKML , Sonny Rao , Peter Xu Content-Type: text/plain; charset="UTF-8" X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Hi, It seems that userfaultfd isn't woken from a poll when the file descriptor is closed. It seems that it should be from the code in userfault_ctx_release, but it appears that's not actually called immediately. I have a simple standalone example that shows this behavior. It's straight forward: one thread creates a userfaultfd and then closes it after a second thread has entered a poll syscall, some abbreviated strace output is below showing this and the code can be seen here: https://gist.github.com/bgaff/9a8fbbe8af79c0e18502430d416df77e Given that it's probably very common to have a dedicated thread remain blocked indefinitely in a poll(2) waiting for faults there must be a way to break it out early when it's closed. Am I missing something? Thanks, Brian // Open a userfaultfd from Thread 1. 12:55:27.611942 userfaultfd(O_NONBLOCK) = 3 12:55:27.612007 ioctl(3, UFFDIO_API, {api=0xaa, features=0 => features=UFFD_FEATURE_EVENT_FORK|UFFD_FEATURE_EVENT_REMAP|UFFD_FEATURE_EVENT_REMOVE|UFFD_FEATURE_MISSING_HUGETLBFS|UFFD_FEATURE_MISSING_SHMEM|UFFD_FEATURE_EVENT_UNMAP|UFFD_FEATURE_SIGBUS|UFFD_FEATURE_THREAD_ID, ioctls=1<<_UFFDIO_REGISTER|1<<_UFFDIO_UNREGISTER|1<<_UFFDIO_API}) = 0 // Create a second thread (Thread 2) to poll. 12:55:27.612447 clone(strace: Process 72730 attached child_stack=0x7f30efa9ffb0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f30efaa09d0, tls=0x7f30efaa0700, child_tidptr=0x7f30efaa09d0) = 72730 // Thread 2 will poll on the userfaultfd for up to 2000ms. [pid 72730] 12:55:27.612676 poll([{fd=3, events=POLLIN}], 1, 2000 // Thread 1 closes the userfaultfd and fcntl confirms it's closed: [pid 72729] 12:55:28.612945 close(3) = 0 [pid 72729] 12:55:28.613039 fcntl(3, F_GETFD) = -1 EBADF (Bad file descriptor) // Poll technically times out and while loop back in do_poll it gets a POLLNVAL. [pid 72730] 12:55:29.614906 <... poll resumed> ) = 1 ([{fd=3, revents=POLLNVAL}])