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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 816A3C38142 for ; Fri, 20 Jan 2023 02:51:38 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CE1D06B0074; Thu, 19 Jan 2023 21:51:37 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id C92366B0075; Thu, 19 Jan 2023 21:51:37 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B0AEF6B0078; Thu, 19 Jan 2023 21:51:37 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id A1C516B0074 for ; Thu, 19 Jan 2023 21:51:37 -0500 (EST) Received: from smtpin08.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 9682640842 for ; Fri, 20 Jan 2023 02:51:36 +0000 (UTC) X-FDA: 80373651792.08.D44D6F5 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2056.outbound.protection.outlook.com [40.107.223.56]) by imf04.hostedemail.com (Postfix) with ESMTP id F2E2B4000D for ; Fri, 20 Jan 2023 02:51:31 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=NJ4y4h43; spf=pass (imf04.hostedemail.com: domain of jhubbard@nvidia.com designates 40.107.223.56 as permitted sender) smtp.mailfrom=jhubbard@nvidia.com; arc=pass ("microsoft.com:s=arcselector9901:i=1"); dmarc=pass (policy=reject) header.from=nvidia.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1674183093; h=from:from:sender: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:dkim-signature; bh=40SGpz+5MobL+i2EZQ9u+qo0PNv/uaphBttn3k/5qo0=; b=hdC7WTS9OnrzVimovwnqF5PifftKICepSxgV0hE96K4ARF/+ao9j3FXSSJ3Sd3FLeXjBk5 1aabcyK9WWq+NxqLgHbb1yj89xDBagz7/QgdLaldmj93yDTY2X4/jUHVH2BH4vFfIHDnDW /rAAFIduS180SgANkm0SuU17P42AeKM= ARC-Authentication-Results: i=2; imf04.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=NJ4y4h43; spf=pass (imf04.hostedemail.com: domain of jhubbard@nvidia.com designates 40.107.223.56 as permitted sender) smtp.mailfrom=jhubbard@nvidia.com; arc=pass ("microsoft.com:s=arcselector9901:i=1"); dmarc=pass (policy=reject) header.from=nvidia.com ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1674183093; a=rsa-sha256; cv=pass; b=XqgHAFHS3fPKy6KH8VNbRlmVmh9vnvJWI/Rh/Sob22rAyOtP/7z4WPJ9vVwlnq0VdkIB4+ m01HWlmv0okwxkhLnAgMxhqYixXoKwrWEkIFIZwyHkxROM7zKdjVxY8ajUu5+0jrhVrvLy HP44em5IWCGeBru2iFHS0+HS1UfimDw= ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=g+i35WTpsCAEP6BuK4ZCEkPWcDkz4+us0iGvhYQJsAf8JgETzb3eFTEabwX50CSvzFtyEXmEvOvJZQVZ+Sj/jFrWPWzv1XokEN/kthZ+jo7uofYi5eqxyvUnJ9PPwzLesVb2rlE1Z2EQ/FhYS+niPhSTTCqexgVIPAYc+xFqhHvpaRJ0Gv601hHXCRI1FhzdGmdnSVlMTCazlF2a5UrA7blYOnYW70xdqJfD/9DCfdrwF+yOwdUDK7pwAoHFSF/OIYj3bevzkbyp2nuofSW3K+3MdnO9lYuDgBSvOwItJF/gNBb9HcpXkE7eJhwWY3EompQstnEU89FAp3q9pD3PrQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=40SGpz+5MobL+i2EZQ9u+qo0PNv/uaphBttn3k/5qo0=; b=fYRtA4tFnUsIRFySCGyJMIDr4oueolBDceO7DY/ISXc+eXbHrFGnsdmW+nBO+l6rMGD036mQOBGHVLWXGwYw4aDX1y0/CwoK6QMWg2w99R1WOYU64cmBjdph18BlNsZPeDYs9tQ8QW/84uGYpdJwyhh8GLRA+zM2yW75BQKn1HtQ3gq/k9mjYhWS/6Hcz2ZoibzWVuI9Wlt6siISQGrGqZd4dZbwrJdJY/owiChX8/iIE5sGFFc7MXBuMbnqQAJm5G45rShbELmVS41gCr1enh1Av7wt0LvS7vAcXtuatFGEA1Ol9BwhO0lm2cM0I8Q0qYrexiWbWHvBXf6pb2av1w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=kvack.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=40SGpz+5MobL+i2EZQ9u+qo0PNv/uaphBttn3k/5qo0=; b=NJ4y4h43/2CihGdzcDId3QgtLoZltdOnc9eLeSXT6+c7Jl7vmBOFBEeMBEcCaPIngQcYsCMNFdkGRl4Hr9w1zx+GqbYhoWRAawsdCjfd5iEx1BZL2qM88ng9PooHxCJG9ttHJaa+gP5Y65ILT5/o2OcVNHC3KhZWYgW8XRwNHr4RvNDAlIKxM6QT78/TIC9BtOF6mk7RlmN7ttDRG6VRg19O0indfmWn2Wb0OeMZbbWCkRTLQVarz0xVOvtbmcDUEoiEg7ZMJKSc0UpKDtjzeBIYpZd87wZvvrHUL2fjNRdcM2UtZyAA5rJgYS1lt9/OqCPKLJO2GV2ZDUgwUslDog== Received: from DS7PR03CA0069.namprd03.prod.outlook.com (2603:10b6:5:3bb::14) by MW4PR12MB6973.namprd12.prod.outlook.com (2603:10b6:303:20a::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6002.27; Fri, 20 Jan 2023 02:51:29 +0000 Received: from DM6NAM11FT011.eop-nam11.prod.protection.outlook.com (2603:10b6:5:3bb:cafe::40) by DS7PR03CA0069.outlook.office365.com (2603:10b6:5:3bb::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6002.25 via Frontend Transport; Fri, 20 Jan 2023 02:51:29 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by DM6NAM11FT011.mail.protection.outlook.com (10.13.172.108) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6023.16 via Frontend Transport; Fri, 20 Jan 2023 02:51:28 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.36; Thu, 19 Jan 2023 18:51:19 -0800 Received: from [10.110.48.28] (10.126.230.37) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.36; Thu, 19 Jan 2023 18:51:19 -0800 Message-ID: <845c3d54-efe5-6e3a-05ca-5f419ac7d145@nvidia.com> Date: Thu, 19 Jan 2023 18:51:18 -0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 Subject: Re: [PATCH 3/8] mm/gup: simplify the external interface functions and consolidate invariants Content-Language: en-US To: Jason Gunthorpe CC: Alistair Popple , References: <3-v1-dd94f8f0d5ad+716-gup_tidy_jgg@nvidia.com> From: John Hubbard In-Reply-To: <3-v1-dd94f8f0d5ad+716-gup_tidy_jgg@nvidia.com> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.126.230.37] X-ClientProxiedBy: rnnvmail201.nvidia.com (10.129.68.8) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6NAM11FT011:EE_|MW4PR12MB6973:EE_ X-MS-Office365-Filtering-Correlation-Id: fa6e7864-f34f-408c-5455-08dafa913ac6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ePveq9XlfnWQxiV9iTEHy/+K1FAWLwvzpbW4SWaISPogxxGkheRA13dFWBQ2v9nYrK7CXf0ltpMskX76IN4UBYDrklsTXWemclJRJtzGgQSdlJ5oSGyUfSOV6sBrrfgtySbdX7AvmACbkA1rwqBrV14WcEsn/bcO4wcp6p01YQb7NSVpSr4zIw9LKQw1mh8nmiZ62MFiSEvDtnnFdR8ql63ACvrUSFrr24WEC8D7CxjBGFFTEfOK+cK1EGz0LI6LF7e18HX4ZNejbehep782aQOumOLCHt3vqqkqSGvb4PT2aRrC/Tp9LGQaJf1wJHgH3oFx4rD33Z7tVLLnmB5+czEJ6iz2E+OVvzB4PEe6n5FFizhaVpI6v3UQZ8RdDehI6av94uh03Di6ohzjwiOeJSs5E8e5tnsjYTYc7kSPyTa0CSPmPll4NNFMLikEnA9R2SuPN/HWtaPD8q7XJsCRY/sQLjAXik5wzITyUArP8NWMs9RGfcpAvT7NFJtW9QFDVijARjnep8wxWsL24lgC5KXUCx1JrgcHZ10Hqzl9HysgXZ4RQSt3Q0jACYHoY3NnAh/4ldggf1G+vnoTwap2tOUW38VC2EF7FVMlajYjauwd1uQAa170M1sP1qxMktC67wnAYVlrGom1gXtPb+fl7pejHRLXOkYBvaGarcyM68wVkzV8prh5WV9W7j6LpAitvwdddhyW3X1dTCo4MqYYphV/O+LcrYGRdpiYNueNopE= X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230022)(4636009)(136003)(39860400002)(376002)(396003)(346002)(451199015)(36840700001)(46966006)(40470700004)(40480700001)(478600001)(54906003)(6636002)(53546011)(31686004)(70586007)(4326008)(70206006)(8676002)(37006003)(16576012)(316002)(186003)(26005)(16526019)(5660300002)(336012)(6862004)(8936002)(36756003)(41300700001)(2616005)(83380400001)(2906002)(86362001)(36860700001)(426003)(40460700003)(47076005)(82740400003)(356005)(7636003)(31696002)(82310400005)(43740500002);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jan 2023 02:51:28.8218 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: fa6e7864-f34f-408c-5455-08dafa913ac6 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: DM6NAM11FT011.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6973 X-Rspam-User: X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: F2E2B4000D X-Stat-Signature: 1pnc9cd8dpwqzkbbitb84kqbcjdadkza X-HE-Tag: 1674183091-180196 X-HE-Meta: U2FsdGVkX1+AsY8lySgGhcPiyVVECwjuftxsgvVTtG1h2G95ERKZPKsSfwuQ37RrTDLAM/YUqcaoPHDt2vScprSgYiPR3hArzPYQF4nr69e0nRFTswBCdMfL0nQudC3vif/5n/GWIqfXINzT9+VSI3xEXn9GtvJhN43/ANdGwUIkWjrmHbFlcxcWRKMQMvwf0Nv2pcfd9pgsyWtyZE1XFTAKT49pbAXlUEx5wCmnfBvUx2fxjk73UX7wOLHSA8a+gwz5dpiioMahzYPFu5pME9GQgr6Y4NLZZI9xxE60HWH8sQKd6wFLYqeVprc60I3U9muSOQCRi8nqEW15675Rky2h0lJKUCED9/ZR2Iph/T+C6uz8sbpBVuL8KhrBr9/LRFDrNW/JE6oiHNNE6PujpTZ0Bttq21K4HEC2npMSv8zcnTF2ORw7WEhURsBnGsrHCSLKew6ZCvAgAKn4s/UlvRkBbCZ1n1xJGMYmYAA4LzUeqcT7xS88J0wm8+B5EvQ7ky0ghTtQ2X74OhBya74pDFFN5jC64AlzzUQn4XNSTXUg2pPcctMhGd/L0NnYG8AgE9do/bksWdBSpGsUiQVupKpPTnsXI9+hjBtTiEop2/UYFvwnrVfB40bXVaC4PgY8nZQGIkrv9KCauAhN73PwC6shph9nwDsOywm+ZhIrRxEwOE+B+ESRoEFDIkYYkBtn/0nRHOGOPcLq/74UMpqiHt/3DZzBaRxvPPnAPNToiFMW6iHJbmLClXwoO+BzJ5Pz2xP+YPZI67IXisDp2OWKGW0f9aI3ebz2X/gHFxeRh4OKssnn+Igr9pxy36DPZ9SrQRkOULh0iP6N5FEOX/U0B1fAYcxxDSeEiqyvbaMfEJrioeyjYzWUvpQSRCL+TIUfjMlW/hsVnmCoOa6j7UCd6ctbhW5Xb+91DBjRhxrzdCaFgnIoCcRxqd5PqZ1l2HiRXCrKZrvun1lTY+PRqe6 x7Ooclvr x29gYivB0CuHyQ/pKKkpxLZzy/fV8SbxHsEZWR4e0yeDCbP9Bbolr5nEzZ/DBVJ6Rbx5N26sBO+IxpCk9aPtNbS3h0rdwyviT3GZ8BB72kdvj8utWQLT68vg/SFwKZsxS2Ug/Kum+xm9+VJ364bs18rGLJOlg0jR/7V1QfWNsLis6sude7NQ1pfaxXzg3b8DCDkTLn+BBYnGkMvuoqDPE73XidSibRNcRldnEfnV79TO0hpGcuDOvVkRVBGr5fQTso/vW2XXtlJHdhHkykz0kXvaIvWcHNx7f3b/c4ZDYVtWs1yjidnwg9G72++hrQG1ZYhswb7rIhONqk6YuVTmlGcoArA== 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: On 1/17/23 07:58, Jason Gunthorpe wrote: > The GUP family of functions have a complex, but fairly well defined, set > of invariants for their arguments. Currently these are sprinkled about, > sometimes in duplicate through many functions. > > Internally we don't follow all the invariants that the external interface > has to follow, so place these checks directly at the exported > interface. This ensures the internal functions never reach a violated > invariant. > > Remove the duplicated invariant checks. > > The end result is to make these functions fully internal: > __get_user_pages_locked() > internal_get_user_pages_fast() > __gup_longterm_locked() > > And all the other functions call directly into one of these. > > Suggested-by: John Hubbard > Signed-off-by: Jason Gunthorpe > --- > mm/gup.c | 150 +++++++++++++++++++++++------------------------ > mm/huge_memory.c | 10 ---- > 2 files changed, 75 insertions(+), 85 deletions(-) > > diff --git a/mm/gup.c b/mm/gup.c > index 2c833f862d0354..9e332e3f6ea8e2 100644 > --- a/mm/gup.c > +++ b/mm/gup.c > @@ -215,7 +215,6 @@ int __must_check try_grab_page(struct page *page, unsigned int flags) > { > struct folio *folio = page_folio(page); > > - WARN_ON_ONCE((flags & (FOLL_GET | FOLL_PIN)) == (FOLL_GET | FOLL_PIN)); try_grab_page() is declared in mm.h and is therefore potentially something that other subsystems could call--although they really shouldn't! And here, we are simply assuming that that is enough. But in order to be really comfortable removing this check on the basis of "try_grab_page() is internal to mm", I think it would help to move its declaration from mm.h, to mm/internal.h. Perhaps as a separate patch. > if (WARN_ON_ONCE(folio_ref_count(folio) <= 0)) > return -ENOMEM; > > @@ -818,7 +817,7 @@ struct page *follow_page(struct vm_area_struct *vma, unsigned long address, > if (vma_is_secretmem(vma)) > return NULL; > > - if (foll_flags & FOLL_PIN) > + if (WARN_ON_ONCE(foll_flags & FOLL_PIN)) OK, so we're slightly fortifying follow_page() checking, but not at the level of is_valid_gup_args(). Should this be mentioned in the commit description? And should the checks be more extensive? ... > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index abe6cfd92ffa0e..eaf879c835de44 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -1039,11 +1039,6 @@ struct page *follow_devmap_pmd(struct vm_area_struct *vma, unsigned long addr, > > assert_spin_locked(pmd_lockptr(mm, pmd)); > > - /* FOLL_GET and FOLL_PIN are mutually exclusive. */ > - if (WARN_ON_ONCE((flags & (FOLL_PIN | FOLL_GET)) == > - (FOLL_PIN | FOLL_GET))) > - return NULL; > - For both follow_devmap_pmd() and follow_devmap_pud(), below, it looks like the following external API path is left exposed (with respect to checking gup flags): do_mlock() __mm_populate() populate_vma_page_range() __get_user_pages() follow_page_mask() ... follow_devmap_pmd() So I'm not sure that it's good to delete these checks without covering that path. > if (flags & FOLL_WRITE && !pmd_write(*pmd)) > return NULL; > > @@ -1202,11 +1197,6 @@ struct page *follow_devmap_pud(struct vm_area_struct *vma, unsigned long addr, > if (flags & FOLL_WRITE && !pud_write(*pud)) > return NULL; > > - /* FOLL_GET and FOLL_PIN are mutually exclusive. */ > - if (WARN_ON_ONCE((flags & (FOLL_PIN | FOLL_GET)) == > - (FOLL_PIN | FOLL_GET))) > - return NULL; > - > if (pud_present(*pud) && pud_devmap(*pud)) > /* pass */; > else thanks, -- John Hubbard NVIDIA