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 F0FBFC28B23 for ; Thu, 6 Mar 2025 08:17:03 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6F51A6B007B; Thu, 6 Mar 2025 03:17:03 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 6A2E16B0082; Thu, 6 Mar 2025 03:17:03 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5208D6B0088; Thu, 6 Mar 2025 03:17:03 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 2DC6D6B007B for ; Thu, 6 Mar 2025 03:17:03 -0500 (EST) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id B5F41565C4 for ; Thu, 6 Mar 2025 08:17:02 +0000 (UTC) X-FDA: 83190420684.23.C15ACA4 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by imf04.hostedemail.com (Postfix) with ESMTP id 48BE040007 for ; Thu, 6 Mar 2025 08:17:00 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b="PBrmkEP/"; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf04.hostedemail.com: domain of mpenttil@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=mpenttil@redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1741249020; 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=odsRzfoyTq7MLWg0HBrmPljhEyWEbEmwPwdNT+/iYYo=; b=cfsslCzwUK2Kfp0dvO3Jt/kDtB8oRQdgTyfnIqZZ2l51azq+Z4VskcxDmILGk1cs24I0U8 k03lNGntcNp9R6K34DNuFb+OsZuWt/caGN1GD0WDbMP24D5r2I+anPDk1nvbd0E2PZpET0 6ABYOqiZbDGhX8CpovEKF6EdzWT9NOM= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b="PBrmkEP/"; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf04.hostedemail.com: domain of mpenttil@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=mpenttil@redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741249020; a=rsa-sha256; cv=none; b=ACRxc3Rz6a5u39MQ8vDZPkHy4fklFBpgjdMpAlRSBi+LxGKvg2JCR9q2xMu51NYmPztdht cQ7XNx/kufh0HN2TTSIJVohnPA4neenRs1W503Ovxjf1nvgsOOcBCm/Psq2H3v6EW3u47E T5NeHieoAZlkuC7skgfpCLElvVf4VoE= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1741249019; 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=odsRzfoyTq7MLWg0HBrmPljhEyWEbEmwPwdNT+/iYYo=; b=PBrmkEP/4Tz4tlDyTWxiqr11lD/l7HmZKvsNiCRdw3yZt+3zHI5vvpBN5yjBM7EqDf8zIF XyatIYPUq2wRbtDaNqYm+M1iZmn04tld/5MnknkPWEeXnhGFM+dceIeyb00vLBdWqNN679 0M7hDN199xJ3w0FiHtoJGL9yFjsyUVU= Received: from mail-lf1-f71.google.com (mail-lf1-f71.google.com [209.85.167.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-652-fnYWRL_OO4--VuRrlVV_pg-1; Thu, 06 Mar 2025 03:16:58 -0500 X-MC-Unique: fnYWRL_OO4--VuRrlVV_pg-1 X-Mimecast-MFC-AGG-ID: fnYWRL_OO4--VuRrlVV_pg_1741249017 Received: by mail-lf1-f71.google.com with SMTP id 2adb3069b0e04-549500fc33fso225338e87.3 for ; Thu, 06 Mar 2025 00:16:57 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741249016; x=1741853816; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=odsRzfoyTq7MLWg0HBrmPljhEyWEbEmwPwdNT+/iYYo=; b=oM471vPo/ytcUqZ1rN7LarzfUqyXw/YF/TkdCIKitRZM8rMRu0tkPRGSLFL5puY1qW GWqhShBMxyz0Lt30Hop6i0qjdv3TLjRxt5qJHN7g+FOHxXlqvQAy5fczac1BlSpRRk9y Ump99sGFO2BA9vDbDWZRBme83P8F7wY3AHIth0r2jNnBlZ4i8p2kyVptoFma26EK7DYm gAoaqOJ0hsgyKfHk/3qVqdNGHRrS2U3dTauLTG0oxGPME9Vg8VfQdl++7q+4nlfIvMYg G6rbE6IF16stxGar7FRfclPvS2zl1KZLuKhjM+n9X2R79oDMqPe8GQ3UaaLaJ8tERKvP dMUg== X-Forwarded-Encrypted: i=1; AJvYcCWNp1ab+zSoqEdbmPWV4Ofyc2g1os7cS8gNgvKibCzWhmvAT4qIMb6inVzI+qPPXhr0VM82VAR1iA==@kvack.org X-Gm-Message-State: AOJu0YyjkYuxso4WZ4zne6W8REk71p7rsS6qZAConK9wlCr9LhvlaeSa YLw+3r6tMAjFCbuDBM5DMZh955qZJgg1NEoemLasWW9xWBMP4EESNkttRM1/En6teTjxlIDy4yO gu8neLmFv4jaibhcRWL4FhduGfWXofbkTZoY7TRXKhKmlvdY= X-Gm-Gg: ASbGncs8pLYn9zynwsoa2dEdF0FNL7rVxNm3+OzofEw81IEuBbYIJL6ua1qaEiY6Gaz ZvB75H0AxrxrUYd7MBvglwFfDQXmOqikIPzpiQ29G9/Neufk/QgKuhb8FhTLP8CBhjPb5j+cYYg gDYotwD7ZVDuoYRzpBW0fuAvYf1UYku+XkpKrx1QGXqNM+XYy9cqZB2EOtaW6E1en1c+o3sVUoX gVoOMHV/cGtk7BaBh4h46im1iFroeMuBQheq61KeTluwmwpQirdmj0GyFJDzQx+HFRG3IFzcpEL uIsxs1kgDhEFponAc2Rf9GtfuvTF7Pmbloc5qbpHbg== X-Received: by 2002:a05:6512:1322:b0:545:eef:83f1 with SMTP id 2adb3069b0e04-5497d337e0cmr2671547e87.17.1741249016482; Thu, 06 Mar 2025 00:16:56 -0800 (PST) X-Google-Smtp-Source: AGHT+IEiqG6ICeY8Rgq/8C4HzQpFU5tEDdOt1pL5RtIfbip+7YLfAyoT3kW5xY2Cp2v83S4Jtg1SGQ== X-Received: by 2002:a05:6512:1322:b0:545:eef:83f1 with SMTP id 2adb3069b0e04-5497d337e0cmr2671520e87.17.1741249015951; Thu, 06 Mar 2025 00:16:55 -0800 (PST) Received: from [192.168.1.86] (85-23-48-6.bb.dnainternet.fi. [85.23.48.6]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5498ae45fd6sm103034e87.47.2025.03.06.00.16.54 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 06 Mar 2025 00:16:55 -0800 (PST) Message-ID: Date: Thu, 6 Mar 2025 10:16:53 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC 07/11] mm/memremap: Add folio_split support To: Balbir Singh , linux-mm@kvack.org, akpm@linux-foundation.org Cc: dri-devel@lists.freedesktop.org, nouveau@lists.freedesktop.org, Karol Herbst , Lyude Paul , Danilo Krummrich , David Airlie , Simona Vetter , =?UTF-8?B?SsOpcsO0bWUgR2xpc3Nl?= , Shuah Khan , David Hildenbrand , Barry Song , Baolin Wang , Ryan Roberts , Matthew Wilcox , Peter Xu , Zi Yan , Kefeng Wang , Jane Chu , Alistair Popple , Donet Tom References: <20250306044239.3874247-1-balbirs@nvidia.com> <20250306044239.3874247-8-balbirs@nvidia.com> From: =?UTF-8?Q?Mika_Penttil=C3=A4?= In-Reply-To: <20250306044239.3874247-8-balbirs@nvidia.com> X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: a4hMobwLgEM8Bu2sF2iFNvo_oABhbRH26gWV-x6GKOw_1741249017 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 48BE040007 X-Rspam-User: X-Stat-Signature: qu1hpeos45u9humcwpajr94zrzuaesuf X-HE-Tag: 1741249020-115144 X-HE-Meta: U2FsdGVkX1/V1yxdyyT5FEEHFKZEvM4uSGw4FBNsumMqeLmGjn1lzF2RsIRqdl0JX7wQIMChdoLp8O/6ekK2UStoBX+F2RjDEM7lQwO8gQ7np0SLbzHBU0NUsYfA+D4BDtSt2wy0CE6cixbLW8AADHAOjmuGwMFWP85nlJtuwqftQLWlA1tjuNrQZ2sA0ZzDc8q0tRHHjzpYvpLPhr2ggPQPyIuuwQ00VRL+rkW6Oi7Y49G/o+2Z32B+vvRCBaujVawoH41hk9TMZ6o+VYx0PDSIR/4MrKycoKfop3IiShJ3w8sOAh0FeRBDW5+J97MVWwkzQXxnc25kIdEGPEhHn8VfDVIY0OV0y/87+PRhxaDeCn5H7mNPJX5LgeLwp6EnG7RKG4y6+Fr/qVyr0dom8M4q5Xa5lWrjj+DngKIsU8tKXZ/RbzX8c1ehdgR0ubwrADpGNPFWpwun6Kuvs7ueOz0QoNH+noOUDfmOk8lZs2j2eNQW5pvbjeAa0NuNpcxgVBRuNOp34yp0qbn6E21sJCUcAPzuE+qbfBw8QH8Wp9IPaaC0QCopUpxgxirlG6ROdefUN6Y7nWlrHVpAC0HmLdnaICKBLLKIKoINGPhHigPE1cibtSFiUgBnk+wm10FN9fsBKISj5Ylqg+uTG3rMV4U4VDXtCIBr5/H9GycySvf2DWG3eM5AZMtYAF35+ayAY66a9ZmXKZ5Uwr8FwoOTz48Z7pgyv3uaK8o/uOYZkwl9rDZm1TvQweTQinnSQW1eLvWBGFdcMfq6BANSQ0WJI0900SMu1RtDQBhXYyavAk9osuHDyaIMslGOwhOMWmLUHwjJbRWnpGpWlYOkJfDveF9bX7hjEQZ2/7KA6DqYMYAhY/7wfm/xrRVW+5omeZcdHYKTCehtnAHEBM9jHC8j5Ojr/j4cfKLBhPXgN/ahq1YIGsvNAPTHzOdyqByaURhbBoA3PugillmjkmmihAy R8qDDGVZ 7PYqS9KVaspNjNkT5FJCFrFyiDRG+E0VxZ2PlPAE2mvhBbk9aR8Sn4zScPbofXOlO9oDKSFT2Y6suGLxleO3G87BCoeusm7Jz6lne4TavMZNCkqPCFVYvSIylCHkcCNQC4HGH6yvMUQmaK8YP2HtmgBcJ7Q1INGJe9mEC00DaWomY0MUeYRbF8+SDHqLjTIcD0Zb2sJacIonTCHz6r77Z1BHgtZ5OagC4ZyytRbt/sa7NpfwvKEQbcGmGg0oZOhvZmTgn5KwhLh19G/iBkwXyHfmH0vP+BDAhXQRWAd6WVfQ0BMJqsjBy4M6BMc3lbCU9AlhvglM6vyG4Q4VPybWOLC/IgifcJw0h7d2RtgRei451zUVnoTMshYi5m4PkEojt1PIwt27tMZp//vDpwLX84ljrastL5gnGq8Z6DD4q7v91EFLq6QgCKgsPiDhStEzyta3S0c5anHu677RaAf6FD5DfKHeggZJCidlq 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: Hi, On 3/6/25 06:42, Balbir Singh wrote: > When a zone device page is split (via huge pmd folio split). The > driver callback for folio_split is invoked to let the device driver > know that the folio size has been split into a smaller order. > > The HMM test driver has been updated to handle the split, since the > test driver uses backing pages, it requires a mechanism of reorganizing > the backing pages (backing pages are used to create a mirror device) > again into the right sized order pages. This is supported by exporting > prep_compound_page(). > > Signed-off-by: Balbir Singh > --- > include/linux/memremap.h | 7 +++++++ > include/linux/mm.h | 1 + > lib/test_hmm.c | 35 +++++++++++++++++++++++++++++++++++ > mm/huge_memory.c | 5 +++++ > mm/page_alloc.c | 1 + > 5 files changed, 49 insertions(+) > > diff --git a/include/linux/memremap.h b/include/linux/memremap.h > index 11d586dd8ef1..2091b754f1da 100644 > --- a/include/linux/memremap.h > +++ b/include/linux/memremap.h > @@ -100,6 +100,13 @@ struct dev_pagemap_ops { > */ > int (*memory_failure)(struct dev_pagemap *pgmap, unsigned long pfn, > unsigned long nr_pages, int mf_flags); > + > + /* > + * Used for private (un-addressable) device memory only. > + * This callback is used when a folio is split into > + * a smaller folio > + */ > + void (*folio_split)(struct folio *head, struct folio *tail); > }; > > #define PGMAP_ALTMAP_VALID (1 << 0) > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 98a67488b5fe..3d0e91e0a923 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -1415,6 +1415,7 @@ static inline struct folio *virt_to_folio(const void *x) > void __folio_put(struct folio *folio); > > void split_page(struct page *page, unsigned int order); > +void prep_compound_page(struct page *page, unsigned int order); > void folio_copy(struct folio *dst, struct folio *src); > int folio_mc_copy(struct folio *dst, struct folio *src); > > diff --git a/lib/test_hmm.c b/lib/test_hmm.c > index a81d2f8a0426..18b6a7b061d7 100644 > --- a/lib/test_hmm.c > +++ b/lib/test_hmm.c > @@ -1640,10 +1640,45 @@ static vm_fault_t dmirror_devmem_fault(struct vm_fault *vmf) > return ret; > } > > + > +static void dmirror_devmem_folio_split(struct folio *head, struct folio *tail) > +{ > + struct page *rpage = BACKING_PAGE(folio_page(head, 0)); > + struct folio *new_rfolio; > + struct folio *rfolio; > + unsigned long offset = 0; > + > + if (!rpage) { > + folio_page(tail, 0)->zone_device_data = NULL; > + return; > + } > + > + offset = folio_pfn(tail) - folio_pfn(head); > + rfolio = page_folio(rpage); > + new_rfolio = page_folio(folio_page(rfolio, offset)); > + > + folio_page(tail, 0)->zone_device_data = folio_page(new_rfolio, 0); > + > + if (folio_pfn(tail) - folio_pfn(head) == 1) { > + if (folio_order(head)) > + prep_compound_page(folio_page(rfolio, 0), > + folio_order(head)); > + folio_set_count(rfolio, 1); > + } I think this might need at least a comment. Also, isn't the folio_order(head) always 0, tail and head are splitted folios and if pfn difference == 1? If the intention is to adjust the backing folio's head page to the new order, shouldn't there be clear_compound_head() also for backing head page if split to zero order? > + clear_compound_head(folio_page(new_rfolio, 0)); > + if (folio_order(tail)) > + prep_compound_page(folio_page(new_rfolio, 0), > + folio_order(tail)); > + folio_set_count(new_rfolio, 1); > + folio_page(new_rfolio, 0)->mapping = folio_page(rfolio, 0)->mapping; > + tail->pgmap = head->pgmap; > +} > + > static const struct dev_pagemap_ops dmirror_devmem_ops = { > .page_free = dmirror_devmem_free, > .migrate_to_ram = dmirror_devmem_fault, > .page_free = dmirror_devmem_free, > + .folio_split = dmirror_devmem_folio_split, > }; > > static int dmirror_device_init(struct dmirror_device *mdevice, int id) > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 995ac8be5709..518a70d1b58a 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -3655,6 +3655,11 @@ static int __split_unmapped_folio(struct folio *folio, int new_order, > MTHP_STAT_NR_ANON, 1); > } > > + if (folio_is_device_private(origin_folio) && > + origin_folio->pgmap->ops->folio_split) > + origin_folio->pgmap->ops->folio_split( > + origin_folio, release); > + > /* > * Unfreeze refcount first. Additional reference from > * page cache. > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index 17ea8fb27cbf..563f7e39aa79 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -573,6 +573,7 @@ void prep_compound_page(struct page *page, unsigned int order) > > prep_compound_head(page, order); > } > +EXPORT_SYMBOL_GPL(prep_compound_page); > > static inline void set_buddy_order(struct page *page, unsigned int order) > { --Mika