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=-9.9 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable 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 0268EC11D1C for ; Thu, 20 Feb 2020 19:53:58 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id B1AE4206E2 for ; Thu, 20 Feb 2020 19:53:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="QRsF0CJr" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B1AE4206E2 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 57A986B0007; Thu, 20 Feb 2020 14:53:57 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 5292C6B0008; Thu, 20 Feb 2020 14:53:57 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3F1F86B000A; Thu, 20 Feb 2020 14:53:57 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0025.hostedemail.com [216.40.44.25]) by kanga.kvack.org (Postfix) with ESMTP id 2564E6B0007 for ; Thu, 20 Feb 2020 14:53:57 -0500 (EST) Received: from smtpin30.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id D5CF8181AF5CA for ; Thu, 20 Feb 2020 19:53:56 +0000 (UTC) X-FDA: 76511556072.30.river35_3f3e99ae7444e X-HE-Tag: river35_3f3e99ae7444e X-Filterd-Recvd-Size: 8697 Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) by imf48.hostedemail.com (Postfix) with ESMTP for ; Thu, 20 Feb 2020 19:53:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1582228433; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=81ni+HXuJ0stQtFPZRMbNUJ5xk+OZclF20q9+yp/pbg=; b=QRsF0CJrtaOtzxjB/QYGVBWCFLE6qUUa877YHY/DBzM1oSA5PbC8urgGvqwJ9l02pvI9xq iJtynRacrZQwauJf58mlMgjYwr0UPoekV+S8CS4rJcG2Dousv6JOIZdk5HLUjJGAOQN1Oe MZK5ESAUEfu7wvXE5k3kiXNJb3QIftk= Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-341-g4Ir-monO7uje3TCCx6dAA-1; Thu, 20 Feb 2020 14:53:52 -0500 Received: by mail-qv1-f69.google.com with SMTP id k2so3322423qvu.22 for ; Thu, 20 Feb 2020 11:53:52 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=aCcTytOP234Bpez2/x/ttANB+L1zPQGu6RuaOR8/cjA=; b=gvU2+I+e1QV4LuuRLGrXr+OwgPp3SzBwwzjYa1+o36g2iec/91yukbRmuv3h3/ye+g 9VPAj7SkTFvZ5nh6nRA1xcDVZGJwBysneY1aRHP+qA9xzjcSNtrCeHjgDGWkyDiL147h KujMCLQ4cVgO2bz/rk6i6PAC/kTJE9gYLHCT9+bwcecCXNkaabhhYmfWy9GMRIZdcCc5 /82vbC67igepOfyq9safysVa4rHpWc48mxmhoY5nLOuNNCJb3rRn6L/QcOp+sJmnNBTK isEZ9ZtAYsmsGhZ3NK9POKg/eP51t9KyPkDHqXqZtVDpRkmZYjp6MGKe5tqDxwaNjSky CthQ== X-Gm-Message-State: APjAAAU5ZWPirS/P/+M7YHo1PutBCy46evnDUI3WkJ7nJTgiYtkFTTbn FltYU+trWXAq17qvgz3z6ENu5/EgFnTWr+TRO1vUQEdeNRsV+GuF9p1J+CNP1HgKCKYunYNCHJW yr1nFas5JUvQ= X-Received: by 2002:a0c:eacb:: with SMTP id y11mr27802165qvp.68.1582228431158; Thu, 20 Feb 2020 11:53:51 -0800 (PST) X-Google-Smtp-Source: APXvYqz93atG3z/lnFBir34YOlOdzPMcROHMRiL5PAnpOXXRYB9KUMpanhKW+UUPSuYBC/9MetdmXg== X-Received: by 2002:a0c:eacb:: with SMTP id y11mr27802131qvp.68.1582228430870; Thu, 20 Feb 2020 11:53:50 -0800 (PST) Received: from xz-x1.redhat.com ([104.156.64.75]) by smtp.gmail.com with ESMTPSA id r37sm293401qtj.44.2020.02.20.11.53.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Feb 2020 11:53:50 -0800 (PST) From: Peter Xu To: linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Peter Xu , Martin Cracauer , Mike Rapoport , Hugh Dickins , Jerome Glisse , "Kirill A . Shutemov" , Matthew Wilcox , Pavel Emelyanov , Brian Geffon , Maya Gokhale , Denis Plotnikov , Andrea Arcangeli , Johannes Weiner , "Dr . David Alan Gilbert" , Linus Torvalds , Mike Kravetz , Marty McFadden , David Hildenbrand , Bobby Powers , Mel Gorman Subject: [PATCH RESEND v6 12/16] mm: Introduce FAULT_FLAG_INTERRUPTIBLE Date: Thu, 20 Feb 2020 14:53:48 -0500 Message-Id: <20200220195348.16302-1-peterx@redhat.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200220155353.8676-1-peterx@redhat.com> References: MIME-Version: 1.0 X-MC-Unique: g4Ir-monO7uje3TCCx6dAA-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable 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: handle_userfaultfd() is currently the only one place in the kernel page fault procedures that can respond to non-fatal userspace signals. It was trying to detect such an allowance by checking against USER & KILLABLE flags, which was "un-official". In this patch, we introduced a new flag (FAULT_FLAG_INTERRUPTIBLE) to show that the fault handler allows the fault procedure to respond even to non-fatal signals. Meanwhile, add this new flag to the default fault flags so that all the page fault handlers can benefit from the new flag. With that, replacing the userfault check to this one. Since the line is getting even longer, clean up the fault flags a bit too to ease TTY users. Although we've got a new flag and applied it, we shouldn't have any functional change with this patch so far. Suggested-by: Linus Torvalds Reviewed-by: David Hildenbrand Signed-off-by: Peter Xu --- fs/userfaultfd.c | 4 +--- include/linux/mm.h | 39 ++++++++++++++++++++++++++++----------- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c index 888272621f38..c076d3295958 100644 --- a/fs/userfaultfd.c +++ b/fs/userfaultfd.c @@ -462,9 +462,7 @@ vm_fault_t handle_userfault(struct vm_fault *vmf, unsig= ned long reason) =09uwq.ctx =3D ctx; =09uwq.waken =3D false; =20 -=09return_to_userland =3D -=09=09(vmf->flags & (FAULT_FLAG_USER|FAULT_FLAG_KILLABLE)) =3D=3D -=09=09(FAULT_FLAG_USER|FAULT_FLAG_KILLABLE); +=09return_to_userland =3D vmf->flags & FAULT_FLAG_INTERRUPTIBLE; =09blocking_state =3D return_to_userland ? TASK_INTERRUPTIBLE : =09=09=09 TASK_KILLABLE; =20 diff --git a/include/linux/mm.h b/include/linux/mm.h index 08ca35d3c341..ff653f9136dd 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -378,22 +378,38 @@ extern unsigned int kobjsize(const void *objp); */ extern pgprot_t protection_map[16]; =20 -#define FAULT_FLAG_WRITE=090x01=09/* Fault was a write access */ -#define FAULT_FLAG_MKWRITE=090x02=09/* Fault was mkwrite of existing pte *= / -#define FAULT_FLAG_ALLOW_RETRY=090x04=09/* Retry fault if blocking */ -#define FAULT_FLAG_RETRY_NOWAIT=090x08=09/* Don't drop mmap_sem and wait w= hen retrying */ -#define FAULT_FLAG_KILLABLE=090x10=09/* The fault task is in SIGKILL killa= ble region */ -#define FAULT_FLAG_TRIED=090x20=09/* Second try */ -#define FAULT_FLAG_USER=09=090x40=09/* The fault originated in userspace *= / -#define FAULT_FLAG_REMOTE=090x80=09/* faulting for non current tsk/mm */ -#define FAULT_FLAG_INSTRUCTION 0x100=09/* The fault was during an instruc= tion fetch */ +/** + * Fault flag definitions. + * + * @FAULT_FLAG_WRITE: Fault was a write fault. + * @FAULT_FLAG_MKWRITE: Fault was mkwrite of existing PTE. + * @FAULT_FLAG_ALLOW_RETRY: Allow to retry the fault if blocked. + * @FAULT_FLAG_RETRY_NOWAIT: Don't drop mmap_sem and wait when retrying. + * @FAULT_FLAG_KILLABLE: The fault task is in SIGKILL killable region. + * @FAULT_FLAG_TRIED: The fault has been tried once. + * @FAULT_FLAG_USER: The fault originated in userspace. + * @FAULT_FLAG_REMOTE: The fault is not for current task/mm. + * @FAULT_FLAG_INSTRUCTION: The fault was during an instruction fetch. + * @FAULT_FLAG_INTERRUPTIBLE: The fault can be interrupted by non-fatal si= gnals. + */ +#define FAULT_FLAG_WRITE=09=09=090x01 +#define FAULT_FLAG_MKWRITE=09=09=090x02 +#define FAULT_FLAG_ALLOW_RETRY=09=09=090x04 +#define FAULT_FLAG_RETRY_NOWAIT=09=09=090x08 +#define FAULT_FLAG_KILLABLE=09=09=090x10 +#define FAULT_FLAG_TRIED=09=09=090x20 +#define FAULT_FLAG_USER=09=09=09=090x40 +#define FAULT_FLAG_REMOTE=09=09=090x80 +#define FAULT_FLAG_INSTRUCTION =09=090x100 +#define FAULT_FLAG_INTERRUPTIBLE=09=090x200 =20 /* * The default fault flags that should be used by most of the * arch-specific page fault handlers. */ #define FAULT_FLAG_DEFAULT (FAULT_FLAG_ALLOW_RETRY | \ -=09=09=09 FAULT_FLAG_KILLABLE) +=09=09=09 FAULT_FLAG_KILLABLE | \ +=09=09=09 FAULT_FLAG_INTERRUPTIBLE) =20 #define FAULT_FLAG_TRACE \ =09{ FAULT_FLAG_WRITE,=09=09"WRITE" }, \ @@ -404,7 +420,8 @@ extern pgprot_t protection_map[16]; =09{ FAULT_FLAG_TRIED,=09=09"TRIED" }, \ =09{ FAULT_FLAG_USER,=09=09"USER" }, \ =09{ FAULT_FLAG_REMOTE,=09=09"REMOTE" }, \ -=09{ FAULT_FLAG_INSTRUCTION,=09"INSTRUCTION" } +=09{ FAULT_FLAG_INSTRUCTION,=09"INSTRUCTION" }, \ +=09{ FAULT_FLAG_INTERRUPTIBLE,=09"INTERRUPTIBLE" } =20 /* * vm_fault is filled by the the pagefault handler and passed to the vma's --=20 2.24.1