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 EAEBEC61D92 for ; Wed, 22 Nov 2023 06:03:28 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 636696B0560; Wed, 22 Nov 2023 01:03:28 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 5E7106B0561; Wed, 22 Nov 2023 01:03:28 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4600F6B0562; Wed, 22 Nov 2023 01:03:28 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 371D36B0560 for ; Wed, 22 Nov 2023 01:03:28 -0500 (EST) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id E9616160772 for ; Wed, 22 Nov 2023 06:03:27 +0000 (UTC) X-FDA: 81484548054.20.F1C1A08 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2066.outbound.protection.outlook.com [40.107.223.66]) by imf27.hostedemail.com (Postfix) with ESMTP id 1301F4001C for ; Wed, 22 Nov 2023 06:03:24 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=R1MQ2ktP; spf=pass (imf27.hostedemail.com: domain of apopple@nvidia.com designates 40.107.223.66 as permitted sender) smtp.mailfrom=apopple@nvidia.com; dmarc=pass (policy=reject) header.from=nvidia.com; arc=pass ("microsoft.com:s=arcselector9901:i=1") ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1700633005; 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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=n2NaTXqkDd4+TO4BPbBavhg6dqkr1zzKs9DUo0Umv2E=; b=zHL0tmL2Hu3R+pKj46c80qeLjrWBAetrU2UkHyLZ/LIQ2V5dpVyJ0e85lsDUzK7QHVpCmX rkSQNk6JkQsPC2J830HFfNy2JM+zd0z8x0CzEhiyIfH0dcKHEnJkpldXl3Qn39QAMrpQ6n n9kPz/G5Fkf4XO5KUC9V19VrJySAGgY= ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1700633005; a=rsa-sha256; cv=pass; b=dzabD75sDWY5PXsd7/PeUj6LLmx02SJcopEbV3zhyFAyKg0m9TZJtr0nMgfOGFh0fxqdWD XZaMS5ziLOO6QoEYsOHfyWRSh/Bcdh8v9ztxhN/A4+jOFWKzYP1BiPwJbmRycYDzm01oYW vRBuPBLz7TfHct8iSxeXSbh7KCp1Oy4= ARC-Authentication-Results: i=2; imf27.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=R1MQ2ktP; spf=pass (imf27.hostedemail.com: domain of apopple@nvidia.com designates 40.107.223.66 as permitted sender) smtp.mailfrom=apopple@nvidia.com; dmarc=pass (policy=reject) header.from=nvidia.com; arc=pass ("microsoft.com:s=arcselector9901:i=1") ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=TariAfuUSpYzVB4OtkjsiqmKfnxIiMco+EAwgZohI5QOHetw4ZYTDIFxv0sNBlvcg4S+TKz3M6UrOUBdyDtIbkWYX4nYzhATxNG8ZVkpRWpxl9X120LL63LrypFYYNRwR9U+QZBt7HOc1/SnvslHsBoQz/HL43l0Ti3UQTGApH58vlwQkheCZpYiu9eils+XtkctPPaMl2d1ltVQCV7PrvvCVXbHOVwf+9zafoddy52krkAjMLlhTphmAJIgIFlZsYPdz9Hs8ppk8zzzLCwOr4JAfiVQb8RVuAO79ULxtDfVNqBn5bUwe4MtjVThs3T24Olc65vpIoA3ID/uNUM24w== 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=n2NaTXqkDd4+TO4BPbBavhg6dqkr1zzKs9DUo0Umv2E=; b=Apiy6OHPYx4tfF72wztH3B5X6yXAKIAQyl4hXD7tI3/IRm4eQNGwLS8GDH1hJnIlfxCU9pCzJuoiNIWogHrAN/qxturcspEiBCkDyRxUJBEDOG/WfBh+p+IFchhKDuG7hbP2fkZkSkHSlttQHSVb5tlWovsIaSMyvvNqdCC8BVYHNjvjJuUfIDTOaHEOSXXAPW/D6WgKGTOMaD1BMGhuuPDFz9FPukERbtnTXN+6AOsHZJWaA3wDEaQcKVZfFTZC0lSY5f+gffZB9f832JtwTHh7HvfAKMvczL9tbh1tW6X7OFqmSZjVzWlGJcl14U93o8PFnuW932fzIg2sQv4LTw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; 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=n2NaTXqkDd4+TO4BPbBavhg6dqkr1zzKs9DUo0Umv2E=; b=R1MQ2ktP5oHuulZh9ZFSiVXK4AKvC9x+1XJPr64okZxt6bKURfbDpKDfLD6hGkmvvl2wOcy+TnvNImefFmdU0NHKVVKGwCOv8ycVFQolb2Ip5ALQ96Gu//+CAHZIDieBl2Nc9o0P9n73TomqXsaWVe0v+zkl3OfNtGw1Jj/sXFe7oewNYm6LUwGmTy/FZYqtFhQcyQyyyQ1tUP5+VNV9TiUrvWbUX5+FOQvKGGr02aNppqtekQBqFZBZwSEFOiYF0Vkqu3rbzPWY0RZHcx55lCXu3jkHMY3DLYwH0EZAm4+gWBk+I+ZayM0Y8y9GxLPZ19aJ9EA4ZyN5V3x3bDMtsw== Received: from BYAPR12MB3176.namprd12.prod.outlook.com (2603:10b6:a03:134::26) by SA1PR12MB8598.namprd12.prod.outlook.com (2603:10b6:806:253::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7002.28; Wed, 22 Nov 2023 06:03:21 +0000 Received: from BYAPR12MB3176.namprd12.prod.outlook.com ([fe80::fb09:9679:bd22:6bcb]) by BYAPR12MB3176.namprd12.prod.outlook.com ([fe80::fb09:9679:bd22:6bcb%7]) with mapi id 15.20.7002.027; Wed, 22 Nov 2023 06:03:21 +0000 References: <20231115163018.1303287-1-ryan.roberts@arm.com> <20231115163018.1303287-13-ryan.roberts@arm.com> <87v89vmjus.fsf@nvdebian.thelocal> User-agent: mu4e 1.8.13; emacs 29.1 From: Alistair Popple To: Ryan Roberts Cc: Catalin Marinas , Will Deacon , Ard Biesheuvel , Marc Zyngier , Oliver Upton , James Morse , Suzuki K Poulose , Zenghui Yu , Andrey Ryabinin , Alexander Potapenko , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , Andrew Morton , Anshuman Khandual , Matthew Wilcox , Yu Zhao , Mark Rutland , David Hildenbrand , Kefeng Wang , John Hubbard , Zi Yan , linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 12/14] arm64/mm: Wire up PTE_CONT for user mappings Date: Wed, 22 Nov 2023 17:01:05 +1100 In-reply-to: Message-ID: <87il5umijf.fsf@nvdebian.thelocal> Content-Type: text/plain X-ClientProxiedBy: SY0PR01CA0012.ausprd01.prod.outlook.com (2603:10c6:10:1bb::20) To BYAPR12MB3176.namprd12.prod.outlook.com (2603:10b6:a03:134::26) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BYAPR12MB3176:EE_|SA1PR12MB8598:EE_ X-MS-Office365-Filtering-Correlation-Id: 673b7530-1b79-4103-9367-08dbeb20bace X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 6YZI0SvxukN0Kl2svv+X8ogbc47hNrtMrQ2rXS3TgnJjiLsBNrBudNgUY0MV0iWK2qhQCi4bYU4AarEGhOTD8fodZb0jdmiFSaT814UMxK7cvZdLs0bbXV3GGzR6lAjUfa3dsHaSTkhEUrJJGXKXmDtweDP5bIXGEuhkiiQKXljWR7F3hZUmPsLvKU69nYvzMPWOT8ODkOPOlH4G8fnzd7EW9MjQ1/ahEPTlOVNIBPNL2xhBCxJLO3SGdbKIE67eNqkSimDXwqycLCTffGG/+Jw8VxGpKqRFlTInUW6ij8P8YMeBOFC/qOCVK0wym4vAUVzgO+rtFCVoU8oaTiySgB1YO0sMEKtpz1uIlY3gDbO6Juij2QI4dHsgV8WO3oG0fLrkTXn6OAlwjN6JOkY5vRljMaspp+3szgSCepdc3VU0g2AamMDr3IV+QOFw396XI89yu8njAQ7mn6rIg0lCGkXBQvllS1pdPtNxrSaD+WwkUGm+VWtD+DCMXvCUp2Y83iNayXUTvEmj9vSSD14/3NMXRrKco7TWisc9iOPWwLlHSKBeHulnTB1CK72FULE0 X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BYAPR12MB3176.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(136003)(396003)(39860400002)(346002)(376002)(230922051799003)(451199024)(186009)(64100799003)(1800799012)(66899024)(83380400001)(38100700002)(86362001)(66946007)(66476007)(41300700001)(8676002)(54906003)(66556008)(4326008)(8936002)(316002)(7416002)(5660300002)(2906002)(26005)(53546011)(6512007)(6916009)(6486002)(6666004)(478600001)(9686003)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?+JEGGdd4VRDsE3xNcx186aptY6DB7aNDzz54OM384tQ2kUH2efguVEyzndAb?= =?us-ascii?Q?cxKIUgI+1vIB1jen9sgweaWy097Lw9iV9g9zlMX9p75zIihg3XeQZ0U6PwA1?= =?us-ascii?Q?3iB65LkUXBHVsl+nyw7QfuWwKvIiw1rsLEprkNf2zbDSN+VJWPC/4ofcbrgO?= =?us-ascii?Q?GVbUOdji+lHfUv/0z+IZMnOEwnopqfW8nDbgXVgPr02UJT2pqIVA7mjPuYZ3?= =?us-ascii?Q?AS39nj/kG87nvFhZo2fyVytI7yLoAurAefZPkn41diOpNPVWnvA720KDpDoY?= =?us-ascii?Q?cv+SZVpcrn4/aekqqzkUSyzJzEL/bXD+uqmBO2s3p18Iv9Clqr1BvCNR7H5/?= =?us-ascii?Q?d8jCCE9UjYjEiB9M2SpAF/QfyasYlei+LCIze3yTijcnBIAWzkZUd0bTAwJQ?= =?us-ascii?Q?7OCEOV1qK3zEjUWZgSBOBXAj6UAhvJLx8esegISXqOW2RvVZUCy8cik/xtKZ?= =?us-ascii?Q?Mua30bvIQJXGeN+PLvAP/GPMe3EZEw4WUJFcT5OS8IZwEQJY0AyaKwrmYL+F?= =?us-ascii?Q?yvAX9/2kVbNCyHRNyzVQ+lugAqlmYVsxLm234TaO7nA0vNWVVUah6Cmk8j6L?= =?us-ascii?Q?nCKuDIqVtTzk1evksxVQz49ZriCtNJqSCuVM3V4PGksB1J3JDA/IhL3QcQ2M?= =?us-ascii?Q?9nDC1Uj/AsaQBk1YRI1pG9wGdqKt3H0R99lFdsty+WGb4JuQ7DDQZE5qewfh?= =?us-ascii?Q?dXWool6O6bAi1I1HNLWYcEsPPBhPRwhAGSB1dSk5fV250ju+M8Tp503wIsCR?= =?us-ascii?Q?udWzVox9Nj1haIKHRC9vsc0gCwS/Esury/EG+VoEBxrkqouWLHlj1hJsbcVB?= =?us-ascii?Q?Gusl1mdmZmy4w9zBoZRIZnLHOuNijxk3X6O/7202bAPCHrUXaBJxeDjswUYc?= =?us-ascii?Q?kZ2juHy4ZRzSiSdSE6SKBHLdvOpwyBKnklmZYYKEMizDzHuQ+wf1TQdhpsBm?= =?us-ascii?Q?Kz38pRQ5inqSIAdJjXbLa9EWl+q29Aiy/QpfLt06ED6oAKD6eQj14/Cr2RiQ?= =?us-ascii?Q?NjgeY5yirXevPrF2f9B3EbWTqoTBkWAdbNoNjLHtbA2xhhKw2dZ+GzVtA+bv?= =?us-ascii?Q?yjquDnWbI6hCmYJq9JYKPDhJCMpMHR9XdaAflqSPOTJOQ4xwgOdioBiT2Z2j?= =?us-ascii?Q?4E0oqsJDbl4h7dxCYlXTcxyJPSEurjfFw7swPvXcgmtNLjcwY29b8yoqtZqE?= =?us-ascii?Q?+YyT0l8MlXVQSdSe5YT7g8dlW5j55H/GttdNzAYISeBf/cztx6A1xK30Oi4j?= =?us-ascii?Q?tN6L9dVspVkLwtuEidzcZAqZmy3yKiCBauLTJmDqZThHtUbb3wZI6oAUt6Cl?= =?us-ascii?Q?/m2L+NIixnIkBrGu2v+dbyOOHMyFtjAlRalNIo9tm4SOsAtn2iKHuImyZRlr?= =?us-ascii?Q?8WUl+edIHyPm4JbxwcXZWBTpwkn/7UFu8jEQyNWP7djR4q7XuaZdRavQJGA0?= =?us-ascii?Q?SlHeIwliwF6VyRkCUp7QxUNJ5nv37Fw8pZWE9/d+1n7gd3+hTyTy3Hn8X7wM?= =?us-ascii?Q?2+XHotF5WlW9sKTFmk1XW4CUOeQor6CuU3jdKlK1hbwoDNHKx1fcHl2c5Xbm?= =?us-ascii?Q?VB44z9gD+lrI9GU/pDCG4XLHu2t2eKfmNc7Wg1Mq?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 673b7530-1b79-4103-9367-08dbeb20bace X-MS-Exchange-CrossTenant-AuthSource: BYAPR12MB3176.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Nov 2023 06:03:21.0585 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: xIUJ95lEVRKOKrr0SL55q4b+rvbs1TG7luEA718kl6aYG8L013JRu7UMcxZ8Cso8lWnNrO5EYIpHSrKOaBCtOw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB8598 X-Rspamd-Queue-Id: 1301F4001C X-Rspam-User: X-Stat-Signature: upqaxr5az6qqaq8swd6dkuauz17cgfew X-Rspamd-Server: rspam03 X-HE-Tag: 1700633004-500126 X-HE-Meta: U2FsdGVkX1811fZXYfzFYrsKCDdtJ/LbtcV8KWAyoUDBBVzr/6CIPWTjFfOtbT9m8Btv8UpUhbbzPy0CSInK7u0cJ2Q77ylLkkd1QDsqH+4o0cjFbrYerQ1W8pN2nYj41EbM4O2HBpst5T9Q8hk457aHu/32xdkjYrhH8tmt1lrd5Xs2go0QkROQpJrYA0gncNEm/E+QZTlFWnD5gHGMBZRLfl0oV/lq0YwBT1GK1XKQgjt2rSwQeBRcrnUiMH/qmU7RWhwQwvoJZ3r47xbV8a61+TKXhyskBikUFuRDj6JGUCclY/SuUMR62XW6DM6C/3Lg3+Ex13l4HRINNRYquIbQNGC3qPgIsr2UNVl0GeX9PW2zuZg5sOG3qnw99rKOOLvtLHL9ES5YnAfQn1DbYqVR2IpgCB3eT2lnL3U+1Cvg8gDNXVIVXqq6mBfgsjWsNUC+YfQU+tjE9F4M/C/mT34nLgQHQ9i01k/fgn3H37w1pRe237q1IciuptCt2cQdlVZnXkH20Uox5aeI8T1WhxdMYmjJIl2jxWNBGzrSLO2wvzlQa3/ckD2+/bbXKIxiKHU1cbzRYfG7Xq+yrlAzUwK6TTgkd0XPvoasLifRcAK8qcGElKJmdBEPyGLIqYtLG9eMtVZ0J5Q0n3z0RHN1ifUatG0q+4b4a6QtWcdaORmbvHn3sjahKWDtMdKhFduKd+Sm6ffkzpeFlWAwpATReibmHM/YZn0WHhGaTN3lBSZjvRBpQxBQVuhULvC3JNTgnUHSY/8TKQjFywF9FtWlT+V0Rj42hpoMu8c/WAIDTpvlCwlod9RogAiYHFQKwxfxlzFOs3jMG9Hf4IPgWZ7se5AYVzk6qp12gH+4LSOew3+B7S4l8xquWuUo4u3sOm/oKSWmyQLj8JW4/oDt5unk9FyX1XyjVzfdgBqS9fZFh1JeIRY6C4PXG38EDZzh9/WlvV5EC8VcZiKdTyBdDGM ZbrMNXTs wYnghIyri26TgmYVZJRLxTUleBKpTweQKO7eKPpvexsDVLx4ZeSN/ByPNLXydEx8ZEFxR5VBME+9IabrXT8BGU1+OiZ90SKRapMd5CodFkMIMBLGsrQk33NLubB9pzqBmZOJBZE2QOGHGtUMK3Rw8N80AIIdul3vg5HBw32knsrXjTajuYja9xhJFLlDc9NcFH/G/qfjn5S+E3dXIlFqZXkcM8dB5leOzVGhV8DM1wQBO2SMsSuW6IsAwy17Z65yEFGhuG6AXFjq5FWqacHwMyCn4NpThBMfuqyNIPOvmiQn8i3Eb9+XTqXUHSH9MbX3MDXfL0hauf/gfgUZOI91alCcHlg== 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: List-Subscribe: List-Unsubscribe: Ryan Roberts writes: > On 21/11/2023 11:22, Alistair Popple wrote: >> >> Ryan Roberts writes: >> >> [...] >> >>> +static void contpte_fold(struct mm_struct *mm, unsigned long addr, >>> + pte_t *ptep, pte_t pte, bool fold) >>> +{ >>> + struct vm_area_struct vma = TLB_FLUSH_VMA(mm, 0); >>> + unsigned long start_addr; >>> + pte_t *start_ptep; >>> + int i; >>> + >>> + start_ptep = ptep = contpte_align_down(ptep); >>> + start_addr = addr = ALIGN_DOWN(addr, CONT_PTE_SIZE); >>> + pte = pfn_pte(ALIGN_DOWN(pte_pfn(pte), CONT_PTES), pte_pgprot(pte)); >>> + pte = fold ? pte_mkcont(pte) : pte_mknoncont(pte); >>> + >>> + for (i = 0; i < CONT_PTES; i++, ptep++, addr += PAGE_SIZE) { >>> + pte_t ptent = __ptep_get_and_clear(mm, addr, ptep); >>> + >>> + if (pte_dirty(ptent)) >>> + pte = pte_mkdirty(pte); >>> + >>> + if (pte_young(ptent)) >>> + pte = pte_mkyoung(pte); >>> + } >>> + >>> + __flush_tlb_range(&vma, start_addr, addr, PAGE_SIZE, true, 3); >>> + >>> + __set_ptes(mm, start_addr, start_ptep, pte, CONT_PTES); >>> +} >>> + >>> +void __contpte_try_fold(struct mm_struct *mm, unsigned long addr, >>> + pte_t *ptep, pte_t pte) >>> +{ >>> + /* >>> + * We have already checked that the virtual and pysical addresses are >>> + * correctly aligned for a contpte mapping in contpte_try_fold() so the >>> + * remaining checks are to ensure that the contpte range is fully >>> + * covered by a single folio, and ensure that all the ptes are valid >>> + * with contiguous PFNs and matching prots. We ignore the state of the >>> + * access and dirty bits for the purpose of deciding if its a contiguous >>> + * range; the folding process will generate a single contpte entry which >>> + * has a single access and dirty bit. Those 2 bits are the logical OR of >>> + * their respective bits in the constituent pte entries. In order to >>> + * ensure the contpte range is covered by a single folio, we must >>> + * recover the folio from the pfn, but special mappings don't have a >>> + * folio backing them. Fortunately contpte_try_fold() already checked >>> + * that the pte is not special - we never try to fold special mappings. >>> + * Note we can't use vm_normal_page() for this since we don't have the >>> + * vma. >>> + */ >>> + >>> + struct page *page = pte_page(pte); >>> + struct folio *folio = page_folio(page); >>> + unsigned long folio_saddr = addr - (page - &folio->page) * PAGE_SIZE; >>> + unsigned long folio_eaddr = folio_saddr + folio_nr_pages(folio) * PAGE_SIZE; >>> + unsigned long cont_saddr = ALIGN_DOWN(addr, CONT_PTE_SIZE); >>> + unsigned long cont_eaddr = cont_saddr + CONT_PTE_SIZE; >>> + unsigned long pfn; >>> + pgprot_t prot; >>> + pte_t subpte; >>> + pte_t *orig_ptep; >>> + int i; >>> + >>> + if (folio_saddr > cont_saddr || folio_eaddr < cont_eaddr) >>> + return; >>> + >>> + pfn = pte_pfn(pte) - ((addr - cont_saddr) >> PAGE_SHIFT); >>> + prot = pte_pgprot(pte_mkold(pte_mkclean(pte))); >>> + orig_ptep = ptep; >>> + ptep = contpte_align_down(ptep); >>> + >>> + for (i = 0; i < CONT_PTES; i++, ptep++, pfn++) { >>> + subpte = __ptep_get(ptep); >>> + subpte = pte_mkold(pte_mkclean(subpte)); >>> + >>> + if (!pte_valid(subpte) || >>> + pte_pfn(subpte) != pfn || >>> + pgprot_val(pte_pgprot(subpte)) != pgprot_val(prot)) >>> + return; >>> + } >>> + >>> + contpte_fold(mm, addr, orig_ptep, pte, true); >>> +} >>> +EXPORT_SYMBOL(__contpte_try_fold); >>> + >>> +void __contpte_try_unfold(struct mm_struct *mm, unsigned long addr, >>> + pte_t *ptep, pte_t pte) >>> +{ >>> + /* >>> + * We have already checked that the ptes are contiguous in >>> + * contpte_try_unfold(), so we can unfold unconditionally here. >>> + */ >>> + >>> + contpte_fold(mm, addr, ptep, pte, false); >> >> I'm still working my way through the series but > > Thanks for taking the time to review! > >> calling a fold during an >> unfold stood out as it seemed wrong. Obviously further reading revealed >> the boolean flag that changes the functions meaning but I think it would >> be better to refactor that. > > Yes that sounds reasonable. > >> >> We could easily rename contpte_fold() to eg. set_cont_ptes() and factor >> the pte calculation loop into a separate helper >> (eg. calculate_contpte_dirty_young() or some hopefully better name) >> called further up the stack. That has an added benefit of providing a >> spot to add the nice comment for young/dirty rules you provided in the >> patch description ;-) >> >> In other words we'd have something like: >> >> void __contpte_try_unfold() { >> pte = calculate_contpte_dirty_young(mm, addr, ptep, pte); >> pte = pte_mknoncont(pte); >> set_cont_ptes(mm, addr, ptep, pte); >> } > > My concern with this approach is that calculate_contpte_dirty_young() has side > effects; it has to clear each PTE as it loops through it prevent a race between > our reading access/dirty and another thread causing access/dirty to be set. So > its not just a "calculation", its the teardown portion of the process too. I > guess its a taste thing, so happy for it to be argued the other way, but I would > prefer to keep it all together in one function. > > How about renaming contpte_fold() to contpte_convert() or contpte_repaint() > (other suggestions welcome), and extracting the pte_mkcont()/pte_mknoncont() > part (so we can remove the bool param): > > void __contpte_try_unfold() { > pte = pte_mknoncont(pte); > contpte_convert(mm, addr, ptep, pte); > } Thanks. That works for me, although sadly I don't have any better ideas for names atm. - Alistair > Thanks, > Ryan > >> >> Which IMHO is more immediately understandable. >> >> - Alistair >>