From nobody Thu Apr 2 09:20:48 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3FD6328DC4 for ; Mon, 30 Mar 2026 04:30:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774845050; cv=none; b=JK2Y4GatCRYsMzqbhRQDaN9GnPpVDAtiu2mAHAGu0gDcfXMY2Vp58tpNm7yBv4ZNOJJOULyrd2ZdEoCk8CWOZ36+ovjMGdjzINNz6edUKgHTK2XgVZsCBV8C9SEdhxNFaJAt+4b9s2PVi2wYrsNiHozeh5bJupAZqaXt+iy/Bns= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774845050; c=relaxed/simple; bh=71LZ/EjX3D79OGnHhLfU7iMbp173V6EH8+9AS22cENE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=BRfiaAdVtCWL00ZK6QKwqJB2iHgs8zVmtdmOP0d19r6Q0vm+6vw0qp4jC1zoK2t+1Ku3OnYhlRmWQOEz5tn3j7ntNE6Z5RmBPb5Askk2mPR50m1Kn87/Vjq18YZi5w84LW6/iJTU30C2GMbABTUmozCo2Y3Jb5jKgp7WXMI+Nc8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=fq2o6Hsu; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b=QU3kuG4O; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="fq2o6Hsu"; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b="QU3kuG4O" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1774845047; 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=Kv61ajyCc+m1Zr2ihJsLPfcGnhj6kHq30KwJ+MzkSds=; b=fq2o6HsuRxCPbwH4A/5zsSnFcKTdJElTlL5O8qE/OW7rH9Vhjof2fZqPyBPYhCyMUgsmIy aMPT2tNWK9paqgUm8iQ/6Qh0P96lQ/5mr5EYc/oF8AKNOOYX/C/HA9WSUhbVZqFwc1GmHW soHQYbDFGzoCZ4+OotFxN2nUBQ3gc74= Received: from mail-lj1-f199.google.com (mail-lj1-f199.google.com [209.85.208.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-622-GaROXvAMOL2-ZUP6cdmB8g-1; Mon, 30 Mar 2026 00:30:44 -0400 X-MC-Unique: GaROXvAMOL2-ZUP6cdmB8g-1 X-Mimecast-MFC-AGG-ID: GaROXvAMOL2-ZUP6cdmB8g_1774845043 Received: by mail-lj1-f199.google.com with SMTP id 38308e7fff4ca-389e0db12cbso23252481fa.3 for ; Sun, 29 Mar 2026 21:30:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1774845043; x=1775449843; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Kv61ajyCc+m1Zr2ihJsLPfcGnhj6kHq30KwJ+MzkSds=; b=QU3kuG4O6LZJnTDYhpSDer157x2hR4qlYKSh0fiYExjJIYwCQanlGqd8RYN6KjmQzA 7frfQ/F9XdX3qfmwmEfDDLZqSNRaj1mhmwjIR8x+j9zun6ZiDCIuhcbszQxToGRysFQ9 FPOxQbj3ade4ot2wC1vCfEmoqLmZmrp1v+Tv5dCdnecLW29aiQgyBScwu/2X02g+Xlh6 XEMU1v+DUHKtpRQcTzytxvi66BUmXDBQhEg5b3IPGDWyJazn8gzdhoGKRzsgxchtf5TB eHRNnOaCPJ+haAFc+u1uQnKBg9GFakKHmlqimYA3WB4B5/17Yh3t5J47ODWbpb5p3q32 frZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774845043; x=1775449843; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Kv61ajyCc+m1Zr2ihJsLPfcGnhj6kHq30KwJ+MzkSds=; b=BRhGfKfve+9mfOgQATTZDeydDxiq4XiDGve5YTJNtD3pWfdChrDQcfboc+Y0mESGiX WzIZMTSTlyh5djXkpmmWB2hbw/mK9Hg3n/rg0K6JO+f5oVZM5QV+i+6qW1/ELJFSEIYr n4iWjmhewFkeenY1sY1hoAZhi8PqFRdo+IFQHv0bATjyIO8cmYPauhEnlMNRcX0/GA9m af1d/ueSCLMAuX92iuutTNanPYw5ogh/SFyoVmOtZ9y4wUMmGGsU4dqoMDQeryVrhJnW tEcD7F5orBwG2wNZ7ZLnVjPW84zubmIPsTirmv57+cXASfK0pGJJmNdgPZ6kQj5Bhv5O bUnQ== X-Gm-Message-State: AOJu0YycLQeVYxH75IMQKwiPjks92lEwxVrP40tOSSQ4LTqQdIAmdXtH 64PL9gnVvtzk5zesBklUrF+Sym8FZ4ViY+BayBXJEBPRRFpP3kfTf8PJGR0xUhC5mFyEcXQhIg5 +R99nj2FOboLsW8LCHxOpR290uYu2CHUk0eUK/WoBbTOJnX6KSNMCnWm2D/c+0lA3 X-Gm-Gg: ATEYQzzObMNcF2ak102CXd6pEbZvwKPn2cggluH5II0ydsR+pAi9dGaEaXl++sf3YPO OuukA+0cFX6KN1eTM5hZJowwO8ZmBPw3TcK1tVKaby2JN1ACF25v7imgjl9bRkfO7cKwHWGkQqf FwEH1swUYLDtpIgKvYx+JfeM9GMAy09PezdrUs4kJUvI2PynN8mdjOZWdG6VJEfJbU9RT7yUlr+ AzW5YiXjLF+rSXyQLgO8sUBBkAGkhtti79zq1HHbdvZUG+yoTj5WrWZeuzNkRPSjtcryiViB8sP xMK1k3JHD1kJnxe21xLVFFUxOA/AohtN8GZEvlU6k2SU4eVsq85hTptnoSD6N1XuR747c9onriV b1JtvQf7y8bzr8TPFO1P1xEbUEH5w01S9yRh9 X-Received: by 2002:a05:651c:110e:b0:38a:49d1:3d with SMTP id 38308e7fff4ca-38c732638e5mr30547181fa.17.1774845042669; Sun, 29 Mar 2026 21:30:42 -0700 (PDT) X-Received: by 2002:a05:651c:110e:b0:38a:49d1:3d with SMTP id 38308e7fff4ca-38c732638e5mr30547041fa.17.1774845042124; Sun, 29 Mar 2026 21:30:42 -0700 (PDT) Received: from fedora (85-23-51-1.bb.dnainternet.fi. [85.23.51.1]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-38c83729522sm12470671fa.14.2026.03.29.21.30.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Mar 2026 21:30:41 -0700 (PDT) From: mpenttil@redhat.com To: linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, =?UTF-8?q?Mika=20Penttil=C3=A4?= , David Hildenbrand , Jason Gunthorpe , Leon Romanovsky , Alistair Popple , Balbir Singh , Zi Yan , Matthew Brost Subject: [PATCH v7 2/6] mm: Add helper to convert HMM pfn to migrate pfn Date: Mon, 30 Mar 2026 07:30:13 +0300 Message-ID: <20260330043017.251808-3-mpenttil@redhat.com> X-Mailer: git-send-email 2.50.0 In-Reply-To: <20260330043017.251808-1-mpenttil@redhat.com> References: <20260330043017.251808-1-mpenttil@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Mika Penttil=C3=A4 The unified HMM/migrate_device pagewalk does the "collecting" on the HMM side, so we need a helper to transfer pfns to the migrate_vma world. Cc: David Hildenbrand Cc: Jason Gunthorpe Cc: Leon Romanovsky Cc: Alistair Popple Cc: Balbir Singh Cc: Zi Yan Cc: Matthew Brost Suggested-by: Alistair Popple Signed-off-by: Mika Penttil=C3=A4 --- include/linux/hmm.h | 18 ++++++++++++- include/linux/migrate.h | 3 ++- mm/migrate_device.c | 57 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/include/linux/hmm.h b/include/linux/hmm.h index db75ffc949a7..9adc22b73533 100644 --- a/include/linux/hmm.h +++ b/include/linux/hmm.h @@ -13,6 +13,8 @@ =20 struct mmu_interval_notifier; =20 +struct migrate_vma; + /* * On output: * 0 - The page is faultable and a future call with=20 @@ -27,6 +29,12 @@ struct mmu_interval_notifier; * HMM_PFN_P2PDMA_BUS - Bus mapped P2P transfer * HMM_PFN_DMA_MAPPED - Flag preserved on input-to-output transformation * to mark that page is already DMA mapped + * HMM_PFN_MIGRATE - The entry is to be migrated. Note, HMM_PFN_MIGRATE + * alone without HMM_PFN_VALID denotes the + * empty page. + * This flag together with HMM_PFN_COMPOUND are + * indicators for migrate_hmm_range_setup() to + * setup the migrate pfns. * * On input: * 0 - Return the current state of the page, do not fault = it. @@ -34,6 +42,8 @@ struct mmu_interval_notifier; * will fail * HMM_PFN_REQ_WRITE - The output must have HMM_PFN_WRITE or hmm_range_fau= lt() * will fail. Must be combined with HMM_PFN_REQ_FAULT. + * HMM_PFN_REQ_MIGRATE - For default_flags, request to migrate, according = to + * hmm_range.migrate.flags */ enum hmm_pfn_flags { /* Output fields and flags */ @@ -48,11 +58,15 @@ enum hmm_pfn_flags { HMM_PFN_P2PDMA =3D 1UL << (BITS_PER_LONG - 5), HMM_PFN_P2PDMA_BUS =3D 1UL << (BITS_PER_LONG - 6), =20 - HMM_PFN_ORDER_SHIFT =3D (BITS_PER_LONG - 11), + /* Migrate request */ + HMM_PFN_MIGRATE =3D 1UL << (BITS_PER_LONG - 7), + HMM_PFN_COMPOUND =3D 1UL << (BITS_PER_LONG - 8), + HMM_PFN_ORDER_SHIFT =3D (BITS_PER_LONG - 13), =20 /* Input flags */ HMM_PFN_REQ_FAULT =3D HMM_PFN_VALID, HMM_PFN_REQ_WRITE =3D HMM_PFN_WRITE, + HMM_PFN_REQ_MIGRATE =3D HMM_PFN_MIGRATE, =20 HMM_PFN_FLAGS =3D ~((1UL << HMM_PFN_ORDER_SHIFT) - 1), }; @@ -107,6 +121,7 @@ static inline unsigned int hmm_pfn_to_map_order(unsigne= d long hmm_pfn) * @default_flags: default flags for the range (write, read, ... see hmm d= oc) * @pfn_flags_mask: allows to mask pfn flags so that only default_flags ma= tter * @dev_private_owner: owner of device private pages + * @migrate: structure for migrating a range of a VMA */ struct hmm_range { struct mmu_interval_notifier *notifier; @@ -117,6 +132,7 @@ struct hmm_range { unsigned long default_flags; unsigned long pfn_flags_mask; void *dev_private_owner; + struct migrate_vma *migrate; }; =20 /* diff --git a/include/linux/migrate.h b/include/linux/migrate.h index d5af2b7f577b..425ab5242da0 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h @@ -3,6 +3,7 @@ #define _LINUX_MIGRATE_H =20 #include +#include #include #include #include @@ -200,7 +201,7 @@ void migrate_device_pages(unsigned long *src_pfns, unsi= gned long *dst_pfns, unsigned long npages); void migrate_device_finalize(unsigned long *src_pfns, unsigned long *dst_pfns, unsigned long npages); - +void migrate_hmm_range_setup(struct hmm_range *range); #endif /* CONFIG_MIGRATION */ =20 #endif /* _LINUX_MIGRATE_H */ diff --git a/mm/migrate_device.c b/mm/migrate_device.c index 8079676c8f1f..a4062fd21490 100644 --- a/mm/migrate_device.c +++ b/mm/migrate_device.c @@ -1489,3 +1489,60 @@ int migrate_device_coherent_folio(struct folio *foli= o) return 0; return -EBUSY; } + +/** + * migrate_hmm_range_setup() - prepare to migrate a range of memory + * @range: contains pointer to struct migrate_vma to be set up. + * + * When collecting has been done with hmm_range_fault(), this + * should be called next, and completes range->migrate by + * populating migrate->src[] and migrate->dst[] + * using range->hmm_pfns[]. + * Also, migrate->cpages and migrate->npages get initialized. + * After migrate_hmm_range_setup(), range->migrate is good + * for the rest of the migrate_vma_* flow. + */ +void migrate_hmm_range_setup(struct hmm_range *range) +{ + + struct migrate_vma *migrate =3D range->migrate; + + if (!migrate) + return; + + migrate->npages =3D (migrate->end - migrate->start) >> PAGE_SHIFT; + migrate->cpages =3D 0; + + for (unsigned long i =3D 0; i < migrate->npages; i++) { + + unsigned long pfn =3D range->hmm_pfns[i]; + + /* + * We are only interested in entries to be + * migrated. + */ + if (!(pfn & HMM_PFN_MIGRATE)) { + migrate->src[i] =3D 0; + migrate->dst[i] =3D 0; + continue; + } + + migrate->cpages++; + + /* HMM_PFN_MIGRATE without HMM_PFN_VALID denotes the special zero page */ + if (pfn & (HMM_PFN_VALID)) + migrate->src[i] =3D migrate_pfn(page_to_pfn(hmm_pfn_to_page(pfn))) + | MIGRATE_PFN_MIGRATE; + else + migrate->src[i] =3D MIGRATE_PFN_MIGRATE; + + migrate->src[i] |=3D (pfn & HMM_PFN_WRITE) ? MIGRATE_PFN_WRITE : 0; + migrate->src[i] |=3D (pfn & HMM_PFN_COMPOUND) ? MIGRATE_PFN_COMPOUND : 0; + migrate->dst[i] =3D 0; + } + + if (migrate->cpages) + migrate_vma_unmap(migrate); + +} +EXPORT_SYMBOL(migrate_hmm_range_setup); --=20 2.50.0