From nobody Wed Feb 11 20:55:54 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 E8A303502A4 for ; Wed, 11 Feb 2026 08:13:36 +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=1770797618; cv=none; b=ibK0OKAN++Z3LssrArCKyfWnaavvhunoru9ps297OuK0pwZPmGQsqyRPGAZvlHeXn7h/14Fv4SFSCUBYhhhkOoJs7A+/uKy8aAkr4ePhV0LcYj97qFfjkZXFryyr7sLjqfGfpkPTfqfkSHWLXO9NVRqGUPc1cZ3r0ncJvZ1r9BQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770797618; c=relaxed/simple; bh=QkdReehPKSwzKe+kTp7BrmssH2GrtGanwPvriRalmI0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=mEfWjy15m7gEQmWGpvfb/KuKNVk/aZG1rV9Q4W9gGd7lxKmLxCAM5Z8O++i+U2424PPxHdccm4sYqBgmPNGlBikxuXns7vigGVgMnxR5OrrBviIwSYbVgPMqlKPJnfSidngrdREQ0KjVgUISWsIMkNXqijKxHh36lKebwiAzB8o= 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=DwHFBE5/; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b=LeVHjd4e; 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="DwHFBE5/"; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b="LeVHjd4e" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1770797616; 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=pN7sR3vsA193k+Zi8CXWZHG9IV1B38HGrk2ADk7gKWQ=; b=DwHFBE5/n97NIxlPX4DtzxPSqoAGGvIIewE8oIYcJcFtT0Mp8FY2VzKw+mT0ijgiuhRZF/ IfRQxVHU+2iirQBqMnyf7yMwlUlrBrYocZZGtznyi2HTRTt+e3q/49EIP5wH4jzKENgAA9 EkTOZymXUB+zZUTb+b2kRHVhSXORcDs= Received: from mail-lf1-f69.google.com (mail-lf1-f69.google.com [209.85.167.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-12-0_gMT_BIMFyW8_5snyAuaQ-1; Wed, 11 Feb 2026 03:13:34 -0500 X-MC-Unique: 0_gMT_BIMFyW8_5snyAuaQ-1 X-Mimecast-MFC-AGG-ID: 0_gMT_BIMFyW8_5snyAuaQ_1770797613 Received: by mail-lf1-f69.google.com with SMTP id 2adb3069b0e04-59e16827d49so3750587e87.0 for ; Wed, 11 Feb 2026 00:13:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1770797613; x=1771402413; 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=pN7sR3vsA193k+Zi8CXWZHG9IV1B38HGrk2ADk7gKWQ=; b=LeVHjd4eahYiCqNx3eD18MsSPqlvM0jccgSVK0hLVMhlcswjKZ6Wm/cqb+yebaZx9Y wBRsAhr9vvpghLLFuWqNPKXe0qVVnDene85znWmpmpx0oUsb/UrWrOzwx0yPF636yDfk aNMDBMAK6jsHqfVMlnGsi1CQFt80vI6yyryaSuKa3ybQptb6wxkp0nEenz42s6NhohzY BOdnDB6Mqvfi4cW+Z7Mc5Odd/Oi6/ioUmaK0OtqWtClRs0b6B6P217yc9m9DAi407/U/ NgBJ5zk0GHclDf6nY0WnK+ckmPMpE8ZnOw9SWBs7r0t1NzA0WyCyo/CN7BVgRPae9+Bf Rwwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770797613; x=1771402413; 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=pN7sR3vsA193k+Zi8CXWZHG9IV1B38HGrk2ADk7gKWQ=; b=r1TK/WVne6s+qSqSuGNnry6GrC5SeSuChRz6Yefy3dJK92fBL+K3VRFES7HTqCbHmT O/7XaJdny7NedtKqn6IjxY/7JtnENrV20bUtJilPAij0UMUIrHsQdiGDYaLib0GHV2Pr FLHLSeFNtgX0BUvKVIEosGQ1NV3WXnzmtYfe4fSZ3J93FskOfvXWosfI9YP/Ua7fsx64 X6zMsqvlXr3o2TYEIchaqJ4WDIDjrUcFgcaaAy3RAtICnpUJKYtu7HRqPSfLzgNwBKhE jlvvH3y1r8jttZLpc4I31noYs5Gcvfwa38VADiPtIztqG07aUjgNOUGp0qwrgF3pqDMY mgSw== X-Gm-Message-State: AOJu0YxwrAijLfOJVaOmQGNWu2X9QIZE7bAfP/jDljWqmxtLtCcU1ET2 qspboYz2bPVbmMrwuTeqOADZgIt9fv3n38Fs7z7QhLb3DhyC7SoBnt7Xo2p3WOZkDepSZznuQvP yBG2yTGSX7xc6VdyzL9csEt1YxtabTInlQn6w6W4FGcziqvZFSy85xq6e7E0BM2QD X-Gm-Gg: AZuq6aLVr3/Bbn7UhquaufLYN5Z5uBrDjVJ72RY/RpFlTpt1+kOq+wKdzmqy1kAcHyf 5KsHpGRXfqh4mtnsPgPgr39DpJ+58L+cPgla28v6GSfl/0jetENz30f6ioWP9aVZhDpG7xn9kf9 CWZcxZwoQu19BCQlBnvQkeYwkI0Zm9GyAEqvcFt/Mi0XX/Bw97yMGiCOYTX+IBKnmrH2tQcUeIy /ZDeOrH3rhXA+amVxD9zxDPDyS2XW+vBqaDnd2obY8kotgWuDaZfE2ejReA824uc7RtlHGsvkQ8 Y7mQVwijVbepEEebNpQf5d6wIN8GorN/EmJG6V+KNj9c1zeg3gBg48KPgO1ayaGb7BUMohjW+O8 sSFaaVmLyIKsDnzY+oY/Ikue5SV6DneWzm7K9 X-Received: by 2002:ac2:4bd2:0:b0:59e:4f8f:aa30 with SMTP id 2adb3069b0e04-59e5df4663emr419293e87.3.1770797612890; Wed, 11 Feb 2026 00:13:32 -0800 (PST) X-Received: by 2002:ac2:4bd2:0:b0:59e:4f8f:aa30 with SMTP id 2adb3069b0e04-59e5df4663emr419279e87.3.1770797612413; Wed, 11 Feb 2026 00:13:32 -0800 (PST) Received: from fedora (85-23-51-1.bb.dnainternet.fi. [85.23.51.1]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-59e5f568737sm188515e87.21.2026.02.11.00.13.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Feb 2026 00:13:32 -0800 (PST) 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 v5 2/6] mm: Add helper to convert HMM pfn to migrate pfn Date: Wed, 11 Feb 2026 10:12:57 +0200 Message-ID: <20260211081301.2940672-3-mpenttil@redhat.com> X-Mailer: git-send-email 2.50.0 In-Reply-To: <20260211081301.2940672-1-mpenttil@redhat.com> References: <20260211081301.2940672-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" in HMM side, so need a helper to transfer pfns to 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/hmm.c | 6 ---- mm/migrate_device.c | 69 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+), 9 deletions(-) diff --git a/include/linux/hmm.h b/include/linux/hmm.h index db75ffc949a7..b5418e318782 100644 --- a/include/linux/hmm.h +++ b/include/linux/hmm.h @@ -12,7 +12,7 @@ #include =20 struct mmu_interval_notifier; - +struct migrate_vma; /* * On output: * 0 - The page is faultable and a future call with=20 @@ -27,6 +27,7 @@ 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 - Migrate PTE installed * * On input: * 0 - Return the current state of the page, do not fault = it. @@ -34,6 +35,7 @@ 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 to device */ enum hmm_pfn_flags { /* Output fields and flags */ @@ -48,15 +50,25 @@ 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), }; =20 +enum { + /* These flags are carried from input-to-output */ + HMM_PFN_INOUT_FLAGS =3D HMM_PFN_DMA_MAPPED | HMM_PFN_P2PDMA | + HMM_PFN_P2PDMA_BUS, +}; + /* * hmm_pfn_to_page() - return struct page pointed to by a device entry * @@ -107,6 +119,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 the associated vma */ struct hmm_range { struct mmu_interval_notifier *notifier; @@ -117,6 +130,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 26ca00c325d9..8e6c28efd4f8 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 @@ -192,7 +193,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/hmm.c b/mm/hmm.c index 4ec74c18bef6..21ff99379836 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -41,12 +41,6 @@ enum { HMM_NEED_ALL_BITS =3D HMM_NEED_FAULT | HMM_NEED_WRITE_FAULT, }; =20 -enum { - /* These flags are carried from input-to-output */ - HMM_PFN_INOUT_FLAGS =3D HMM_PFN_DMA_MAPPED | HMM_PFN_P2PDMA | - HMM_PFN_P2PDMA_BUS, -}; - static int hmm_pfns_fill(unsigned long addr, unsigned long end, struct hmm_range *range, unsigned long cpu_flags) { diff --git a/mm/migrate_device.c b/mm/migrate_device.c index 23379663b1e1..c773a82ea1ed 100644 --- a/mm/migrate_device.c +++ b/mm/migrate_device.c @@ -1489,3 +1489,72 @@ 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 migrate_vma to be populated + * + * When collecting happens by hmm_range_fault(), this populates + * the migrate->src[] and migrate->dst[] using range->hmm_pfns[]. + * Also, migrate->cpages and migrate->npages get initialized. + */ +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]; + + pfn &=3D ~HMM_PFN_INOUT_FLAGS; + + /* + * + * Don't do migration if valid and migrate flags are not both set. + * + */ + if ((pfn & (HMM_PFN_VALID | HMM_PFN_MIGRATE)) !=3D + (HMM_PFN_VALID | HMM_PFN_MIGRATE)) { + migrate->src[i] =3D 0; + migrate->dst[i] =3D 0; + continue; + } + + migrate->cpages++; + + /* + * + * The zero page is encoded in a special way, valid and migrate is + * set, and pfn part is zero. Encode specially for migrate also. + * + */ + if (pfn =3D=3D (HMM_PFN_VALID|HMM_PFN_MIGRATE)) { + migrate->src[i] =3D MIGRATE_PFN_MIGRATE; + migrate->dst[i] =3D 0; + continue; + } + if (pfn =3D=3D (HMM_PFN_VALID|HMM_PFN_MIGRATE|HMM_PFN_COMPOUND)) { + migrate->src[i] =3D MIGRATE_PFN_MIGRATE|MIGRATE_PFN_COMPOUND; + migrate->dst[i] =3D 0; + continue; + } + + migrate->src[i] =3D migrate_pfn(page_to_pfn(hmm_pfn_to_page(pfn))) + | 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