mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Usama Arif <usama.arif@linux.dev>
To: Lance Yang <lance.yang@linux.dev>
Cc: Usama Arif <usama.arif@linux.dev>,
	akpm@linux-foundation.org, david@kernel.org, chrisl@kernel.org,
	kasong@tencent.com, ljs@kernel.org, ziy@nvidia.com,
	linux-mm@kvack.org, ying.huang@linux.alibaba.com,
	baoquan.he@linux.dev, willy@infradead.org, youngjun.park@lge.com,
	hannes@cmpxchg.org, riel@surriel.com, shakeel.butt@linux.dev,
	alex@ghiti.fr, kas@kernel.org, baohua@kernel.org,
	dev.jain@arm.com, baolin.wang@linux.alibaba.com,
	nico.pache@linux.dev, liam@infradead.org, ryan.roberts@arm.com,
	vbabka@kernel.org, linux-kernel@vger.kernel.org,
	nphamcs@gmail.com, shikemeng@huaweicloud.com, yosry@kernel.org,
	qi.zheng@linux.dev, luizcap@redhat.com, kernel-team@meta.com
Subject: Re: [PATCH v8 28/30] mm: handle PMD swap entry faults on swap-in
Date: Tue,  3 Nov 2026 07:27:20 -0800	[thread overview]
Message-ID: <20261103152721.2138301-1-usama.arif@linux.dev> (raw)
In-Reply-To: <20261004101942.37331-1-lance.yang@linux.dev>

On Sun,  4 Oct 2026 18:19:42 +0800 Lance Yang <lance.yang@linux.dev> wrote:

> Hey Usama,
> 
> Not an expert on swap, so the below may be naive ...
> 
> On Fri, Oct 02, 2026 at 02:52:42AM -0700, Usama Arif wrote:
> [...]
> >+#ifdef CONFIG_THP_SWAP
> >+/**
> >+ * do_huge_pmd_swap_page() - Handle a fault on a PMD-level swap entry.
> >+ * @vmf: Fault context. vmf->orig_pmd contains the swap PMD.
> >+ *
> >+ * A PMD swap entry is a compact encoding for HPAGE_PMD_NR consecutive swap
> >+ * slots. If the swap cache still has one PMD-sized folio covering the range,
> >+ * map it directly at PMD level. If the range has been split into per-page
> >+ * cache state, or zswap may have per-page state for it, split the PMD swap
> >+ * entry and retry at PTE granularity.
> >+ *
> >+ * Return: VM_FAULT_* flags.
> >+ */
> >+vm_fault_t do_huge_pmd_swap_page(struct vm_fault *vmf)
> >+{
> >+	struct vm_area_struct *vma = vmf->vma;
> >+	struct mm_struct *mm = vma->vm_mm;
> >+	struct folio *folio;
> >+	struct page *page;
> >+	struct swap_info_struct *si;
> >+	unsigned long haddr = vmf->address & HPAGE_PMD_MASK;
> >+	softleaf_t entry;
> >+	swp_entry_t swp_entry;
> >+	pmd_t pmd;
> >+	vm_fault_t ret = 0;
> >+	bool exclusive, stable_writes, rwp_restore = false;
> >+	bool write = vmf->flags & FAULT_FLAG_WRITE;
> >+	rmap_t rmap_flags = RMAP_NONE;
> >+	enum swap_pmd_cache cache_state;
> >+
> >+	entry = softleaf_from_pmd(vmf->orig_pmd);
> >+	if (unlikely(!softleaf_is_swap(entry)))
> >+		return 0;
> >+
> >+	if (!thp_vma_allowable_order(vma, vma->vm_flags, TVA_PAGEFAULT,
> >+				     HPAGE_PMD_ORDER)) {
> >+		__split_huge_pmd(vma, vmf->pmd, haddr);
> >+		return 0;
> >+	}
> >+
> >+	swp_entry = entry;
> >+
> >+	/* Prevent swapoff from happening to us. */
> >+	si = get_swap_device(swp_entry);
> >+	if (IS_ERR_OR_NULL(si)) {
> >+		if (IS_ERR(si))
> >+			return VM_FAULT_SIGBUS;
> >+		return 0;
> >+	}
> >+
> >+	cache_state = swap_pmd_cache_lookup(swp_entry, &folio);
> >+	if (cache_state == SWAP_PMD_CACHE_SPLIT)
> >+		goto split_fallback;
> >+	if (!folio) {
> >+		/*
> >+		 * PMD swap entries encode ordinary per-page swap slots. If any
> >+		 * slot is in zswap, split and let the PTE swap path load the
> >+		 * range per page. Otherwise the range is all on disk and can be
> >+		 * read back as one PMD-sized folio.
> >+		 */
> >+		if (zswap_is_present(swp_entry, HPAGE_PMD_NR))
> >+			goto split_fallback;
> >+
> >+		folio = swapin_sync(swp_entry, GFP_HIGHUSER_MOVABLE,
> >+				    BIT(HPAGE_PMD_ORDER), vmf, NULL, 0);
> >+		if (IS_ERR_OR_NULL(folio))
> >+			goto split_fallback;
> >+
> >+		/* Had to read from swap area: Major fault */
> >+		ret = VM_FAULT_MAJOR;
> >+		count_vm_event(PGMAJFAULT);
> >+		count_memcg_event_mm(mm, PGMAJFAULT);
> >+	}
> >+
> >+	ret |= folio_lock_or_retry(folio, vmf);
> >+	if (ret & VM_FAULT_RETRY)
> >+		goto out_release;
> >+
> >+	/* Verify the folio is still in swap cache and matches our entry */
> >+	if (unlikely(!folio_matches_swap_entry(folio, swp_entry)))
> >+		goto out_page;
> >+
> >+	/*
> >+	 * Folio should be PMD-sized; if not (e.g. split in swap cache),
> >+	 * split the PMD swap entry and retry at PTE level.
> >+	 */
> >+	if (folio_nr_pages(folio) != HPAGE_PMD_NR)
> >+		goto unlock_split_fallback;
> >+
> >+	/*
> >+	 * A read that failed - a PMD-order zswap load that found per-page
> >+	 * state, or an I/O error - leaves the folio clean and not uptodate.
> >+	 * Fall back so the PTE retry reads each slot again rather than
> >+	 * returning SIGBUS for the whole range.
> >+	 */
> >+	if (unlikely(!folio_test_uptodate(folio)))
> >+		goto unlock_split_fallback;
> >+
> >+	/*
> >+	 * If any subpage is hardware-poisoned, split the PMD swap entry and
> >+	 * let the PTE swap-in path handle each page individually so
> >+	 * do_swap_page() can return VM_FAULT_HWPOISON for the poisoned
> >+	 * subpage rather than mapping the corrupted memory as one THP.
> >+	 */
> >+	if (unlikely(folio_has_hwpoisoned_subpage(folio)))
> >+		goto unlock_split_fallback;
> >+
> >+	page = folio_page(folio, 0);
> >+	arch_swap_restore(folio_swap(swp_entry, folio), folio);
> >+
> >+	folio_throttle_swaprate(folio, GFP_KERNEL);
> >+
> >+	/* Lock the PMD and verify it hasn't changed */
> >+	vmf->ptl = pmd_lock(mm, vmf->pmd);
> >+	if (unlikely(!pmd_same(vmf->orig_pmd, pmdp_get(vmf->pmd)))) {
> >+		spin_unlock(vmf->ptl);
> >+		goto out_page;
> >+	}
> >+
> >+	exclusive = pmd_swp_exclusive(vmf->orig_pmd);
> >+
> >+	/*
> >+	 * Some swap backends (e.g. zram) don't support concurrent page
> >+	 * modifications while under writeback. If we map exclusive on such
> >+	 * a backend while the folio is still under writeback, the writeback
> >+	 * may see partial modifications and corrupt the swap slot. Drop the
> >+	 * exclusive marker and only map R/O for that case; further GUP
> >+	 * references can't appear once the page is fully unmapped, so this
> >+	 * is safe.
> >+	 */
> >+	/* Lockless like do_swap_page(): SWP_STABLE_WRITES never changes. */
> >+	stable_writes = data_race(si->flags & SWP_STABLE_WRITES);
> >+	if (exclusive && folio_test_writeback(folio) && stable_writes)
> >+		exclusive = false;
> >+
> >+	/*
> >+	 * Set up the PMD mapping. Similar to do_swap_page() but at PMD level.
> >+	 */
> >+	add_mm_counter(mm, MM_ANONPAGES, HPAGE_PMD_NR);
> >+	add_mm_counter(mm, MM_SWAPENTS, -HPAGE_PMD_NR);
> >+
> >+	pmd = folio_mk_pmd(folio, vma->vm_page_prot);
> >+	pmd = pmd_mkyoung(pmd);
> >+
> >+	if (pmd_swp_soft_dirty(vmf->orig_pmd))
> >+		pmd = pmd_mksoft_dirty(pmd);
> >+	if (pmd_swp_uffd(vmf->orig_pmd))
> >+		pmd = pmd_mkuffd(pmd);
> >+	if (pmd_swp_uffd(vmf->orig_pmd) && userfaultfd_rwp(vma)) {
> >+		pmd = pmd_modify(pmd, PAGE_NONE);
> >+		rwp_restore = true;
> >+	}
> >+
> >+	/*
> >+	 * Check exclusivity to determine if we can map writable.
> >+	 */
> >+	if (exclusive) {
> >+		if (!rwp_restore && (vma->vm_flags & VM_WRITE) &&
> >+		    !userfaultfd_huge_pmd_wp(vma, pmd) &&
> >+		    !pmd_needs_soft_dirty_wp(vma, pmd)) {
> >+			pmd = pmd_mkwrite(pmd, vma);
> >+			if (write)
> >+				pmd = pmd_mkdirty(pmd);
> >+		}
> >+		rmap_flags |= RMAP_EXCLUSIVE;
> >+	}
> >+
> >+	flush_icache_pages(vma, page, HPAGE_PMD_NR);
> >+
> >+	if (!folio_test_anon(folio))
> >+		folio_add_new_anon_rmap(folio, vma, haddr, rmap_flags);
> >+	else
> >+		folio_add_anon_rmap_pmd(folio, page, vma, haddr, rmap_flags);
> >+
> >+	folio_put_swap(folio, NULL);
> >+
> >+	set_pmd_at(mm, haddr, vmf->pmd, pmd);
> >+	update_mmu_cache_pmd(vma, haddr, vmf->pmd);
> >+
> >+	/* Update orig_pmd for any follow-up wp_huge_pmd() below. */
> >+	vmf->orig_pmd = pmd;
> >+
> >+	/*
> >+	 * Conditionally try to free up the swap cache. Do it after mapping,
> >+	 * so raced page faults will likely see the folio in swap cache and
> >+	 * wait on the folio lock.
> >+	 */
> >+	if (should_try_to_free_swap(si, folio, vma, exclusive, vmf->flags))
> >+		folio_free_swap(folio);
> >+
> >+	spin_unlock(vmf->ptl);
> >+
> >+	folio_unlock(folio);
> >+	put_swap_device(si);
> >+
> >+	/*
> >+	 * If the write fault wasn't satisfied above (folio is shared without
> >+	 * exclusivity), call wp_huge_pmd() to handle COW or
> >+	 * userfaultfd-wp without forcing a second fault.
> >+	 *
> >+	 * wp_huge_pmd() may return VM_FAULT_FALLBACK if it had to split the
> >+	 * PMD; that's a normal outcome, and the natural PTE-level refault will
> >+	 * complete the COW. Mask it so callers (and the arch fault handler)
> >+	 * don't see VM_FAULT_FALLBACK as a fatal VM_FAULT_ERROR.
> >+	 */
> >+	if (write && !pmd_write(pmd) && !rwp_restore) {
> >+		vm_fault_t wp_ret = wp_huge_pmd(vmf);
> >+
> >+		wp_ret &= ~VM_FAULT_FALLBACK;
> >+		ret |= wp_ret;
> >+		if (ret & VM_FAULT_ERROR)
> >+			ret &= VM_FAULT_ERROR;
> >+	}
> >+
> >+	return ret;
> >+
> >+out_page:
> >+	folio_unlock(folio);
> >+out_release:
> >+	folio_put(folio);
> >+	put_swap_device(si);
> >+	return ret;
> >+
> >+unlock_split_fallback:
> >+	/*
> >+	 * PTE fallback cannot add a single-page rmap to a PMD-sized folio that
> >+	 * has never been mapped: do_swap_page() would hand the whole folio to
> >+	 * folio_add_new_anon_rmap() while installing one PTE. Nor can it do
> >+	 * anything useful with a folio that failed to read. Remove either from
> >+	 * the swap cache so each slot is read back into its own order-0 folio.
> >+	 * An uptodate anon swap-cache folio can be mapped one PTE at a time and
> >+	 * must stay cached, so that any poisoned subpage stays visible to
> >+	 * do_swap_page(). This mirrors unuse_pmd_entry().
> >+	 */
> >+	if (folio_matches_swap_entry(folio, swp_entry) &&
> >+	    (!folio_test_uptodate(folio) || !folio_test_anon(folio)))
> >+		swap_cache_del_folio(folio);
> >+	folio_unlock(folio);
> >+	folio_put(folio);
> 
> Requesting BIT(HPAGE_PMD_ORDER) doesn't prevent swapin_sync() from
> returning a cached order-0 folio ...

Agreed. swapin_sync() returns an existing cached folio without
restricting its order. A small zswap writeback folio can still need
its cache reference while I/O is pending.

This base retains zswap's allocation reference until after
swap_write_submit(), rather than dropping it before __swap_writeout().
After that reference is dropped, the cache reference can still be
needed for pending I/O, so the size-mismatch fix is still required.

> 
> struct folio *swapin_sync(swp_entry_t entry, gfp_t gfp, unsigned long orders,
> 			   struct vm_fault *vmf, struct mempolicy *mpol, pgoff_t ilx)
> {
> ...
> 	do {
> 		folio = swap_cache_get_folio(entry);
> 		if (folio)
> 			return folio;
> 		folio = __swap_cache_alloc_folio(entry, gfp, orders, vmf, mpol, ilx);
> 	} while (PTR_ERR(folio) == -EEXIST);
> 
> ...
> }
> 
> static int zswap_writeback_entry(struct zswap_entry *entry,
> 				 swp_entry_t swpentry)
> {
> ...
> 	folio = __swap_cache_alloc_folio(swpentry, GFP_KERNEL, BIT(0), NULL, mpol,
> 					 NO_INTERLEAVE_INDEX);
> ...
> 	if (IS_ERR(folio))
> 		return PTR_ERR(folio);
> ...
> 	if (!zswap_decompress(entry, folio)) {
> 		ret = -EIO;
> 		goto err;
> 	}
> 
> 	xa_erase(tree, offset);
> ...
> 	/* folio is up to date */
> 	folio_mark_uptodate(folio);
> 
> 	folio_set_dropbehind(folio);
> ...
> 	folio_put(folio);
> 
> 	/* start writeback */
> 	__swap_writeout(&ctx, folio);
> 	swap_write_submit(&ctx);
> 
> 	return 0;
> ...
> }
> 
> void __swap_writeout(struct swap_io_ctx *ctx, struct folio *folio)
> {
> 	VM_BUG_ON_FOLIO(!folio_test_swapcache(folio), folio);
> ...
> 	folio_start_writeback(folio);
> 	folio_unlock(folio);
> 	swap_add_folio(ctx, folio, WRITE);
> }
> 
> Say we hit the following race:
> 
> 1) swap_pmd_cache_lookup() finds the range empty, before zswap writeback
>    inserts its order-0 folio.
> 
> 2) zswap writeback puts that small folio in the swap cache at the first
>    slot, then erases the last zswap entry in the range.
> 
> 3) The fault thread checks zswap and gets false from zswap_is_present().
>    It then calls swapin_sync(), which returns that cached small folio.
> 
> 4) After __swap_writeout() unlocks the folio, the fault thread can lock
>    it while writeback is still pending. The folio isn't PMD-sized, so
>    we reach that cleanup ...
> 
> zswap has already dropped its allocation reference, and writeback itself
> doesn't hold one. So, without any other references, we're left with the
> swap-cache reference and our fault reference.
> 
> The folio is still !anon, so swap_cache_del_folio() removes the cache
> reference, then folio_put() drops ours. That can drop the last reference
> while I/O is still using the folio ... :(
> 
> So ... could we just unlock and put it on the size mismatch, then jump
> to split_fallback? That would keep the folio in the swap cache for
> do_swap_page().
> 

Done for next revision. Thanks for catching this!
A size mismatch now unlocks and puts the folio before jumping
to split_fallback. It stays in the swap cache for do_swap_page().
Only PMD-sized folios reach the cleanup that may delete a folio.

> Something like:
> 
> ---8<---
> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
> index 69721801cf9f..53c15bfdb0a1 100644
> --- a/mm/huge_memory.c
> +++ b/mm/huge_memory.c
> @@ -2507,9 +2507,14 @@ vm_fault_t do_huge_pmd_swap_page(struct vm_fault *vmf)
>  	/*
>  	 * Folio should be PMD-sized; if not (e.g. split in swap cache),
>  	 * split the PMD swap entry and retry at PTE level.
> +	 * Keep the folio cached: zswap writeback may still be in flight and
> +	 * relies on the swap-cache reference to keep it alive.
>  	 */
> -	if (folio_nr_pages(folio) != HPAGE_PMD_NR)
> -		goto unlock_split_fallback;
> +	if (folio_nr_pages(folio) != HPAGE_PMD_NR) {
> +		folio_unlock(folio);
> +		folio_put(folio);
> +		goto split_fallback;
> +	}
> 
>  	/*
>  	 * A read that failed - a PMD-order zswap load that found per-page
> @@ -2647,6 +2652,7 @@ vm_fault_t do_huge_pmd_swap_page(struct vm_fault *vmf)
> 
>  unlock_split_fallback:
>  	/*
> +	 * Only PMD-sized folios reach this cleanup.
>  	 * PTE fallback cannot add a single-page rmap to a PMD-sized folio that
>  	 * has never been mapped: do_swap_page() would hand the whole folio to
>  	 * folio_add_new_anon_rmap() while installing one PTE. Nor can it do
> --
> 
> Hopefully I didn't miss anything :D
> 
> >+split_fallback:
> >+	/*
> >+	 * Only split if the PMD is still the swap entry we were called for.
> >+	 * All the reasons we get here (allocation failure, zswap state, a
> >+	 * split or poisoned cached folio) were observed without the PMD lock,
> >+	 * so a racing thread may already have swapped the range back in as a
> >+	 * THP -- splitting that would silently demote a perfectly good huge
> >+	 * mapping.
> >+	 */
> >+	if (pmd_same(vmf->orig_pmd, pmdp_get_lockless(vmf->pmd)))
> >+		__split_huge_pmd(vma, vmf->pmd, haddr);
> >+	put_swap_device(si);
> >+	return 0;
> >+}
> >+#endif /* CONFIG_THP_SWAP */
> 
> [...]
> 
> Cheers, Lance
> 

  reply	other threads:[~2026-11-03 15:27 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-02  9:52 [PATCH v8 00/30] mm: PMD-level swap entries for anonymous THPs Usama Arif
2026-10-02  9:52 ` [PATCH v8 01/30] mm: rename pmd_to_softleaf_folio() to pmd_softleaf_to_folio() Usama Arif
2026-10-02  9:52 ` [PATCH v8 02/30] arm64: mm: add PMD swap-exclusive helpers Usama Arif
2026-10-02  9:52 ` [PATCH v8 03/30] loongarch: " Usama Arif
2026-10-02 14:17   ` Huacai Chen
2026-11-03 15:10     ` Usama Arif
2026-10-02  9:52 ` [PATCH v8 04/30] powerpc: " Usama Arif
2026-10-05  4:55   ` LEROY Christophe
2026-10-02  9:52 ` [PATCH v8 05/30] riscv: " Usama Arif
2026-10-02  9:52 ` [PATCH v8 06/30] s390: " Usama Arif
2026-10-02  9:52 ` [PATCH v8 07/30] x86: " Usama Arif
2026-10-05 20:14   ` Zi Yan
2026-11-03 21:54     ` Usama Arif
2026-10-02  9:52 ` [PATCH v8 08/30] mm: recognize PMD swap entries in the softleaf layer Usama Arif
2026-10-08  2:06   ` Zi Yan
2026-10-02  9:52 ` [PATCH v8 09/30] mm/debug_vm_pgtable: test PMD swap-exclusive helpers Usama Arif
2026-10-08  2:09   ` Zi Yan
2026-10-02  9:52 ` [PATCH v8 10/30] mm: make PMD migration-entry splitting explicit Usama Arif
2026-10-08  2:53   ` Zi Yan
2026-10-02  9:52 ` [PATCH v8 11/30] mm: split PMD swap entries into PTE swap entries Usama Arif
2026-10-09  2:16   ` Zi Yan
2026-10-02  9:52 ` [PATCH v8 12/30] mm/swap: allow duplicating a range of " Usama Arif
2026-10-02  9:52 ` [PATCH v8 13/30] mm: handle PMD swap entries in fork path Usama Arif
2026-10-09 17:40   ` Zi Yan
2026-10-02  9:52 ` [PATCH v8 14/30] mm: zswap: reject high-order swap cache allocations backed by zswap Usama Arif
2026-10-05 20:18   ` Yosry Ahmed
2026-10-02  9:52 ` [PATCH v8 15/30] mm: swap in PMD swap entries as whole THPs during swapoff Usama Arif
2026-10-09 19:09   ` Zi Yan
2026-10-02  9:52 ` [PATCH v8 16/30] fs/proc: account PMD swap entries in smaps Usama Arif
2026-10-02  9:52 ` [PATCH v8 17/30] mm: handle soft-dirty and uffd-wp on PMD swap entries Usama Arif
2026-10-02  9:52 ` [PATCH v8 18/30] mm/hmm: fault PMD swap entries on demand Usama Arif
2026-10-02  9:52 ` [PATCH v8 19/30] mm: free PMD swap entries in zap_huge_pmd() Usama Arif
2026-10-02  9:52 ` [PATCH v8 20/30] mm/madvise: free PMD swap entries with MADV_FREE Usama Arif
2026-10-02  9:52 ` [PATCH v8 21/30] mm/madvise: skip PMD swap entries for MADV_COLD and MADV_PAGEOUT Usama Arif
2026-10-02  9:52 ` [PATCH v8 22/30] mm/madvise: keep PMD swap entries whole for MADV_GUARD_INSTALL/REMOVE Usama Arif
2026-10-02  9:52 ` [PATCH v8 23/30] mm/mincore: report PMD swap-cache residency Usama Arif
2026-10-02  9:52 ` [PATCH v8 24/30] mm/khugepaged: treat PMD swap entries as mapped THPs Usama Arif
2026-10-02  9:52 ` [PATCH v8 25/30] mm: handle PMD swap entries in MADV_WILLNEED Usama Arif
2026-10-02  9:52 ` [PATCH v8 26/30] mm: handle PMD swap entries in UFFDIO_MOVE Usama Arif
2026-10-04  8:19   ` Lance Yang
2026-11-03 15:24     ` Usama Arif
2026-10-02  9:52 ` [PATCH v8 27/30] mm: don't PTE-batch a swap-in over a hardware-poisoned subpage Usama Arif
2026-10-02  9:52 ` [PATCH v8 28/30] mm: handle PMD swap entry faults on swap-in Usama Arif
2026-10-04 10:19   ` Lance Yang
2026-11-03 15:27     ` Usama Arif [this message]
2026-10-02  9:52 ` [PATCH v8 29/30] mm: install PMD swap entries on swap-out Usama Arif
2026-10-02  9:52 ` [PATCH v8 30/30] selftests/mm: add PMD swap entry tests Usama Arif
2026-10-08  2:47   ` Luiz Capitulino
2026-10-02 14:28 ` [PATCH v8 00/30] mm: PMD-level swap entries for anonymous THPs David Hildenbrand (Arm)
2026-10-02 15:13   ` Zi Yan
2026-10-04 12:39     ` Usama Arif
2026-10-04  3:08 ` Lance Yang
2026-11-03 15:14   ` Usama Arif
2026-10-08 15:21 ` Luiz Capitulino

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261103152721.2138301-1-usama.arif@linux.dev \
    --to=usama.arif@linux.dev \
    --cc=akpm@linux-foundation.org \
    --cc=alex@ghiti.fr \
    --cc=baohua@kernel.org \
    --cc=baolin.wang@linux.alibaba.com \
    --cc=baoquan.he@linux.dev \
    --cc=chrisl@kernel.org \
    --cc=david@kernel.org \
    --cc=dev.jain@arm.com \
    --cc=hannes@cmpxchg.org \
    --cc=kas@kernel.org \
    --cc=kasong@tencent.com \
    --cc=kernel-team@meta.com \
    --cc=lance.yang@linux.dev \
    --cc=liam@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=ljs@kernel.org \
    --cc=luizcap@redhat.com \
    --cc=nico.pache@linux.dev \
    --cc=nphamcs@gmail.com \
    --cc=qi.zheng@linux.dev \
    --cc=riel@surriel.com \
    --cc=ryan.roberts@arm.com \
    --cc=shakeel.butt@linux.dev \
    --cc=shikemeng@huaweicloud.com \
    --cc=vbabka@kernel.org \
    --cc=willy@infradead.org \
    --cc=ying.huang@linux.alibaba.com \
    --cc=yosry@kernel.org \
    --cc=youngjun.park@lge.com \
    --cc=ziy@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®