Arukonda Rahul
a398265301
docs: ABI: zram: fix spelling mistakes
...
Fix spelling mistakes in the zram sysfs ABI documentation.
Link: https://lore.kernel.org/20260707165131.4408-1-rahularukonda2@gmail.com
Signed-off-by: Arukonda Rahul <rahularukonda2@gmail.com >
Reviewed-by: Sergey Senozhatsky <senozhatsky@chromium.org >
Cc: Minchan Kim <minchan@kernel.org >
Cc: Richard Chang <richardycc@google.com >
Cc: Jonathan Corbet <corbet@lwn.net >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:46 -07:00
Dev Jain
399cfd133f
mm/mprotect: use huge_ptep_get() for hugetlb
...
prot_none_hugetlb_entry() is the hugetlb callback for the early
mprotect(PROT_NONE) PFN permission walk on x86.
The callback passes the decoded PFN to pfn_modify_allowed(). For a
hugetlb callback, the pte pointer refers to a hugetlb entry. On
architectures where hugetlb entries need huge_ptep_get(), reading that
entry with ptep_get() can make the permission check use the wrong PFN.
Use huge_ptep_get() before decoding the hugetlb PFN.
Currently there is no path which can trigger a bug: huge_ptep_get() is a
simple ptep_get() for x86, and the prot_none walk occurs only for x86.
So no need to backport - use the correct helper anyways.
[akpm@linux-foundation.org: s/EACCESS/EACCES/]
Link: https://lore.kernel.org/20260703114202.365553-7-dev.jain@arm.com
Fixes: 42e4089c78 ("x86/speculation/l1tf: Disallow non privileged high MMIO PROT_NONE mappings")
Signed-off-by: Dev Jain <dev.jain@arm.com >
Reviewed-by: Muchun Song <muchun.song@linux.dev >
Acked-by: David Hildenbrand (Arm) <david@kernel.org >
Cc: Alistair Popple <apopple@nvidia.com >
Cc: Andi Kleen <ak@linux.intel.com >
Cc: Anshuman Khandual <anshuman.khandual@arm.com >
Cc: Byungchul Park <byungchul@sk.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dave Hansen <dave.hansen@intel.com >
Cc: Gregory Price <gourry@gourry.net >
Cc: Harry Yoo <harry@kernel.org >
Cc: "Huang, Ying" <ying.huang@linux.alibaba.com >
Cc: Jann Horn <jannh@google.com >
Cc: Josh Poimboeuf <jpoimboe@kernel.org >
Cc: Joshua Hahn <joshua.hahnjy@gmail.com >
Cc: Jun'ichi "Nick" Nomura <j-nomura@ce.jp.nec.com >
Cc: Kiryl Shutsemau <kas@kernel.org >
Cc: Lance Yang <lance.yang@linux.dev >
Cc: Liam R. Howlett <liam@infradead.org >
Cc: Lorenzo Stoakes <ljs@kernel.org >
Cc: Matthew Brost <matthew.brost@intel.com >
Cc: Mel Gorman <mel@csn.ul.ie >
Cc: Naoya Horiguchi <nao.horiguchi@gmail.com >
Cc: Oscar Salvador <osalvador@suse.de >
Cc: Pedro Falcato <pfalcato@suse.de >
Cc: Rakie Kim <rakie.kim@sk.com >
Cc: Ralph Campbell <rcampbell@nvidia.com >
Cc: Rik van Riel <riel@surriel.com >
Cc: Ryan Roberts <ryan.roberts@arm.com >
Cc: Vlastimil Babka <vbabka@kernel.org >
Cc: Will Deacon <will@kernel.org >
Cc: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:46 -07:00
Dev Jain
e87df0d5d6
mm/page_vma_mapped: use huge_ptep_get() for hugetlb
...
check_pte() is the final validation step in page_vma_mapped_walk(). It
reads pvmw->pte with ptep_get() to decide whether the entry maps the PFN
range being walked. For hugetlb VMAs, that pointer refers to a hugetlb
entry.
On arches which provide their own huge_ptep_get() to dereference a huge
pte pointer, accessing via ptep_get() would cause pte_pfn(), pte_present()
etc to misbehave.
It is not clear whether this has a trivially visible effect to userspace.
Use huge_ptep_get() to dereference a huge pte pointer.
Link: https://lore.kernel.org/20260703114202.365553-6-dev.jain@arm.com
Fixes: ace71a19ce ("mm: introduce page_vma_mapped_walk()")
Signed-off-by: Dev Jain <dev.jain@arm.com >
Acked-by: David Hildenbrand (Arm) <david@kernel.org >
Reviewed-by: Muchun Song <muchun.song@linux.dev >
Cc: Alistair Popple <apopple@nvidia.com >
Cc: Andi Kleen <ak@linux.intel.com >
Cc: Anshuman Khandual <anshuman.khandual@arm.com >
Cc: Byungchul Park <byungchul@sk.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dave Hansen <dave.hansen@intel.com >
Cc: Gregory Price <gourry@gourry.net >
Cc: Harry Yoo <harry@kernel.org >
Cc: "Huang, Ying" <ying.huang@linux.alibaba.com >
Cc: Jann Horn <jannh@google.com >
Cc: Josh Poimboeuf <jpoimboe@kernel.org >
Cc: Joshua Hahn <joshua.hahnjy@gmail.com >
Cc: Jun'ichi "Nick" Nomura <j-nomura@ce.jp.nec.com >
Cc: Kiryl Shutsemau <kas@kernel.org >
Cc: Lance Yang <lance.yang@linux.dev >
Cc: Liam R. Howlett <liam@infradead.org >
Cc: Lorenzo Stoakes <ljs@kernel.org >
Cc: Matthew Brost <matthew.brost@intel.com >
Cc: Mel Gorman <mel@csn.ul.ie >
Cc: Naoya Horiguchi <nao.horiguchi@gmail.com >
Cc: Oscar Salvador <osalvador@suse.de >
Cc: Pedro Falcato <pfalcato@suse.de >
Cc: Rakie Kim <rakie.kim@sk.com >
Cc: Ralph Campbell <rcampbell@nvidia.com >
Cc: Rik van Riel <riel@surriel.com >
Cc: Ryan Roberts <ryan.roberts@arm.com >
Cc: Vlastimil Babka <vbabka@kernel.org >
Cc: Will Deacon <will@kernel.org >
Cc: Zi Yan <ziy@nvidia.com >
Cc: <stable@vger.kernel.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:45 -07:00
Dev Jain
ac1ec50d71
mm/migrate: use huge_ptep_get() in remove_migration_pte()
...
remove_migration_pte() converts migration entries back to present PTEs
after folio migration completes. For hugetlb folios,
page_vma_mapped_walk() returns the pte pointer to the hugetlb folio in
pvmw.pte, but the code reads it with ptep_get().
On arches which provide their own huge_ptep_get() to dereference a huge
pte pointer, accessing via ptep_get() would cause pte_pfn(),
pte_present() etc to misbehave.
It is not clear whether this has a trivially visible effect to userspace.
Use huge_ptep_get() to dereference a huge pte pointer.
Link: https://lore.kernel.org/20260703114202.365553-5-dev.jain@arm.com
Fixes: 290408d4a2 ("hugetlb: hugepage migration core")
Signed-off-by: Dev Jain <dev.jain@arm.com >
Acked-by: Muchun Song <muchun.song@linux.dev >
Acked-by: David Hildenbrand (Arm) <david@kernel.org >
Cc: Alistair Popple <apopple@nvidia.com >
Cc: Andi Kleen <ak@linux.intel.com >
Cc: Anshuman Khandual <anshuman.khandual@arm.com >
Cc: Byungchul Park <byungchul@sk.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dave Hansen <dave.hansen@intel.com >
Cc: Gregory Price <gourry@gourry.net >
Cc: Harry Yoo <harry@kernel.org >
Cc: "Huang, Ying" <ying.huang@linux.alibaba.com >
Cc: Jann Horn <jannh@google.com >
Cc: Josh Poimboeuf <jpoimboe@kernel.org >
Cc: Joshua Hahn <joshua.hahnjy@gmail.com >
Cc: Jun'ichi "Nick" Nomura <j-nomura@ce.jp.nec.com >
Cc: Kiryl Shutsemau <kas@kernel.org >
Cc: Lance Yang <lance.yang@linux.dev >
Cc: Liam R. Howlett <liam@infradead.org >
Cc: Lorenzo Stoakes <ljs@kernel.org >
Cc: Matthew Brost <matthew.brost@intel.com >
Cc: Mel Gorman <mel@csn.ul.ie >
Cc: Naoya Horiguchi <nao.horiguchi@gmail.com >
Cc: Oscar Salvador <osalvador@suse.de >
Cc: Pedro Falcato <pfalcato@suse.de >
Cc: Rakie Kim <rakie.kim@sk.com >
Cc: Ralph Campbell <rcampbell@nvidia.com >
Cc: Rik van Riel <riel@surriel.com >
Cc: Ryan Roberts <ryan.roberts@arm.com >
Cc: Vlastimil Babka <vbabka@kernel.org >
Cc: Will Deacon <will@kernel.org >
Cc: Zi Yan <ziy@nvidia.com >
Cc: <stable@vger.kernel.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:45 -07:00
Dev Jain
9be12ffa78
mm/rmap: use huge_ptep_get() in try_to_migrate_one()
...
try_to_migrate_one() is used by folio migration to replace a present
mapping with a migration entry. For hugetlb folios, page_vma_mapped_walk()
returns the pte pointer to the hugetlb folio in pvmw.pte, but the code
reads the huge pte entry with ptep_get().
On arches which provide their own huge_ptep_get() to dereference a huge
pte pointer, accessing via ptep_get() would cause pte_pfn(), pte_present()
etc to misbehave.
It is not clear whether this has a trivially visible effect to userspace.
Use huge_ptep_get() to dereference a huge pte pointer.
Commit a98a2f0c8c copied the bug from try_to_unmap_one into
try_to_migrate_one.
[akpm@linux-foundation.org: coding-style cleanups]
Link: https://lore.kernel.org/20260703114202.365553-4-dev.jain@arm.com
Fixes: a98a2f0c8c ("mm/rmap: split migration into its own function")
Signed-off-by: Dev Jain <dev.jain@arm.com >
Acked-by: Muchun Song <muchun.song@linux.dev >
Acked-by: David Hildenbrand (Arm) <david@kernel.org >
Cc: Alistair Popple <apopple@nvidia.com >
Cc: Andi Kleen <ak@linux.intel.com >
Cc: Anshuman Khandual <anshuman.khandual@arm.com >
Cc: Byungchul Park <byungchul@sk.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dave Hansen <dave.hansen@intel.com >
Cc: Gregory Price <gourry@gourry.net >
Cc: Harry Yoo <harry@kernel.org >
Cc: "Huang, Ying" <ying.huang@linux.alibaba.com >
Cc: Jann Horn <jannh@google.com >
Cc: Josh Poimboeuf <jpoimboe@kernel.org >
Cc: Joshua Hahn <joshua.hahnjy@gmail.com >
Cc: Jun'ichi "Nick" Nomura <j-nomura@ce.jp.nec.com >
Cc: Kiryl Shutsemau <kas@kernel.org >
Cc: Lance Yang <lance.yang@linux.dev >
Cc: Liam R. Howlett <liam@infradead.org >
Cc: Lorenzo Stoakes <ljs@kernel.org >
Cc: Matthew Brost <matthew.brost@intel.com >
Cc: Mel Gorman <mel@csn.ul.ie >
Cc: Naoya Horiguchi <nao.horiguchi@gmail.com >
Cc: Oscar Salvador <osalvador@suse.de >
Cc: Pedro Falcato <pfalcato@suse.de >
Cc: Rakie Kim <rakie.kim@sk.com >
Cc: Ralph Campbell <rcampbell@nvidia.com >
Cc: Rik van Riel <riel@surriel.com >
Cc: Ryan Roberts <ryan.roberts@arm.com >
Cc: Vlastimil Babka <vbabka@kernel.org >
Cc: Will Deacon <will@kernel.org >
Cc: Zi Yan <ziy@nvidia.com >
Cc: <stable@vger.kernel.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:45 -07:00
Dev Jain
f5407e9b69
mm/rmap: use huge_ptep_get() in try_to_unmap_one()
...
Patch series "Fix incorrect access of hugetlb pte entries", v3.
There are various places which use ptep_get() to get the pte entry
corresponding to a hugetlb folio. Some arches (like s390) have special
handling to compute the pteval, so they provide huge_ptep_get(). Use this
helper consistently.
Additionally, some code paths may provide huge_ptep_get with an unaligned
address. This is a problem on arm64 (I checked other arches and it looks
fine for them), which is fixed in patch 1. The fix is made to be
backport-friendly: the cleaner fix would be to perhaps pass the hstate to
huge_ptep_get() - that is wider churn and we can do that later.
This patch (of 5):
try_to_unmap_one() handles hugetlb folios when memory failure needs to
replace a poisoned hugetlb mapping with a hwpoison entry. In that case
page_vma_mapped_walk() returns the pte pointer to the hugetlb folio in
pvmw.pte, but the code reads it with ptep_get().
On arches which provide their own huge_ptep_get() to dereference a huge
pte pointer, accessing via ptep_get() would cause pte_pfn(), pte_present()
etc to misbehave.
It is not clear whether this has a trivially visible effect to userspace.
Just use huge_ptep_get() for dereferencing a huge pte pointer.
Link: https://lore.kernel.org/20260703114202.365553-1-dev.jain@arm.com
Link: https://lore.kernel.org/20260703114202.365553-3-dev.jain@arm.com
Fixes: c7ab0d2fdc ("mm: convert try_to_unmap_one() to use page_vma_mapped_walk()")
Signed-off-by: Dev Jain <dev.jain@arm.com >
Reported-by: David Hildenbrand <david@kernel.org >
Reviewed-by: Muchun Song <muchun.song@linux.dev >
Acked-by: David Hildenbrand (Arm) <david@kernel.org >
Cc: Alistair Popple <apopple@nvidia.com >
Cc: Andi Kleen <ak@linux.intel.com >
Cc: Anshuman Khandual <anshuman.khandual@arm.com >
Cc: Byungchul Park <byungchul@sk.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dave Hansen <dave.hansen@intel.com >
Cc: Gregory Price <gourry@gourry.net >
Cc: Harry Yoo <harry@kernel.org >
Cc: "Huang, Ying" <ying.huang@linux.alibaba.com >
Cc: Jann Horn <jannh@google.com >
Cc: Josh Poimboeuf <jpoimboe@kernel.org >
Cc: Joshua Hahn <joshua.hahnjy@gmail.com >
Cc: Jun'ichi "Nick" Nomura <j-nomura@ce.jp.nec.com >
Cc: Kiryl Shutsemau <kas@kernel.org >
Cc: Lance Yang <lance.yang@linux.dev >
Cc: Liam R. Howlett <liam@infradead.org >
Cc: Lorenzo Stoakes <ljs@kernel.org >
Cc: Matthew Brost <matthew.brost@intel.com >
Cc: Mel Gorman <mel@csn.ul.ie >
Cc: Naoya Horiguchi <nao.horiguchi@gmail.com >
Cc: Oscar Salvador <osalvador@suse.de >
Cc: Pedro Falcato <pfalcato@suse.de >
Cc: Rakie Kim <rakie.kim@sk.com >
Cc: Ralph Campbell <rcampbell@nvidia.com >
Cc: Rik van Riel <riel@surriel.com >
Cc: Ryan Roberts <ryan.roberts@arm.com >
Cc: Vlastimil Babka <vbabka@kernel.org >
Cc: Will Deacon <will@kernel.org >
Cc: Zi Yan <ziy@nvidia.com >
Cc: <stable@vger.kernel.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:45 -07:00
Brendan Jackman
3a01af8281
mm: factor out can_spin_trylock()
...
Deduplicate checks for whether the current context is safe for
spin_trylock().
Does this function really belong in mm/internal.h or is it generic? Not
sure. If someone ends up duplicating this logic elsewhere in the kernel,
that would be a shame. But if it goes in some generic header, someone
treats it as documentation about where it's guaranteed safe to
spin_trylock(), and then it emerges that there are other subtle
preconditions that didn't affect the mm usecase, that would be worse. So,
just be conservative and keep it local.
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-18-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Suggested-by: Harry Yoo <harry@kernel.org >
Link: https://lore.kernel.org/all/397859cb-b127-4cc6-9c71-044afc99bf0c@kernel.org/
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Reviewed-by: Harry Yoo (Oracle) <harry@kernel.org >
Reviewed-by: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:44 -07:00
Brendan Jackman
5df11ba0eb
mm/page_alloc: drop alloc_flags arg from alloc_flags_cma()
...
To align the style with other alloc_flags_*() functions, drop this
additive argument and just have the callers do that themselves.
Note you can't always freely or alloc_flags like these callers do (because
of the WMARK bits that encode an enum) but this is fine for ALLOC_CMA,
just like it's fine for e.g. ALLOC_NON_BLOCK returned by
alloc_flags_nonblocking() and or'd by its caller.
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-17-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Suggested-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Link: https://lore.kernel.org/all/5dcdd1ef-21ad-4ed0-9e8a-0e5cf96b4392@kernel.org/
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Reviewed-by: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:44 -07:00
Vlastimil Babka (SUSE)
01c69ef56d
mm: remove the __GFP_NO_OBJ_EXT flag
...
All users of the flag are converted to SLAB_ALLOC_NO_RECURSE or
ALLOC_NO_CODETAG (from __GFP_NO_CODETAG which reused the NO_OBJ_EXT bit).
Free up the flag bit.
[Rebased onto __GFP_NO_CODETAG removal]
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-16-c87b714e19d3@google.com
Signed-off-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Acked-by: Hao Ge <hao.ge@linux.dev >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:44 -07:00
Brendan Jackman
6372aac4d4
mm: replace __GFP_NO_CODETAG with ALLOC_NO_CODETAG
...
Now that alloc_pages has an entrypoint that allows passing alloc_flags, we
can take advantage of this to start removing GFP flags that are only used
for mm-internal stuff.
This requires also plumbing the alloc_flags into some more of the
allocator code, in particular __alloc_pages[_noprof]() gets an alloc_flags
arg to go along with its callees, and we now need to pass those flags
deeper into the allocator so they can reach the alloc_tag code.
While moving the flag definition into page_alloc.h, also update the
comment per Hao's suggestion.
No functional change intended.
Link: https://lore.kernel.org/all/b4916118-3537-4e19-8bc8-1d103dd0d225@linux.dev/
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-15-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Tested-by: Hao Ge <hao.ge@linux.dev >
Acked-by: Hao Ge <hao.ge@linux.dev >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:44 -07:00
Brendan Jackman
a4f6c0f83d
mm: move __alloc_pages() to mm/page_alloc.h
...
It's no longer used outside of mm/.
Since this means __alloc_pages_noprof() is no longer visible from gfp.h,
this also means moving the definition of alloc_pages_node_noprof into
the .c file.
Also remove references to this API from the documentation tree -
referring to the specific function name was already questionable but
now the function is not even public it definitely seems wrong.
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-14-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Reviewed-by: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:43 -07:00
Brendan Jackman
bcdd8d43a7
mm: remove __alloc_pages_node()
...
There were only a few users, which have been removed. The only advantage
of this API over alloc_pages_node() is avoiding a single conditional
branch. The disadvantages are:
1. More API surface, more sources of confusion, more maintenance.
2. Worse impact of CPU hotplug bugs: most users of __alloc_pages_node()
were using the result of cpu_to_node(); if the CPU gets hotplugged
out this will return NUMA_NO_NODE. If one of these paths fails to
protect against a concurrent hotplug then page_alloc.c will use
NUMA_NO_NODE as an index into NODE_DATA() and cause some horrible
memory corruption or other. With alloc_pages_node(), the code might
just work fine.
Ulterior motive: this frees up the __* variants of the allocator APIs to
serve specifically for use as mm-internal API.
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-13-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Reviewed-by: Suren Baghdasaryan <surenb@google.com >
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Reviewed-by: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:43 -07:00
Brendan Jackman
679e5aa1a2
net/funeth: switch to higher-level allocator API
...
The difference between __alloc_pages_node() and alloc_pages_node() is
that the latter allows you to pass NUMA_NO_NODE.
The former is going away and the latter works fine here so switch over.
No functional change intended.
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-12-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Reviewed-by: Suren Baghdasaryan <surenb@google.com >
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Reviewed-by: Zi Yan <ziy@nvidia.com >
Cc: Dimitris Michailidis <dmichail@fungible.com >
Cc: Andrew Lunn <andrew+netdev@lunn.ch >
Cc: "David S. Miller" <davem@davemloft.net >
Cc: Eric Dumazet <edumazet@google.com >
Cc: Jakub Kicinski <kuba@kernel.org >
Cc: Paolo Abeni <pabeni@redhat.com >
Assisted-by: Gemini:unknown-version
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:43 -07:00
Brendan Jackman
579c6de3de
sgi-xp: use higher-level allocator API
...
The difference between __alloc_pages_node() and alloc_pages_node() is
that the latter allows you to pass NUMA_NO_NODE.
The former is going away and the latter works fine here so switch over.
No functional change intended.
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-11-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
Reviewed-by: Suren Baghdasaryan <surenb@google.com >
Acked-by: Steve Wahl <steve.wahl@hpe.com >
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Reviewed-by: Zi Yan <ziy@nvidia.com >
Cc: Robin Holt <robinmholt@gmail.com >
Cc: Steve Wahl <steve.wahl@hpe.com >
Cc: Arnd Bergmann <arnd@arndb.de >
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
Assisted-by: Gemini:unknown-model
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:42 -07:00
Brendan Jackman
9b5b281f21
x86/virt: use higher-level allocator API
...
The difference between __alloc_pages_node() and alloc_pages_node() is
that the latter allows you to pass NUMA_NO_NODE.
The former is going away and the latter works fine here so switch over.
No functional change intended.
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-10-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Reviewed-by: Suren Baghdasaryan <surenb@google.com >
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Reviewed-by: Zi Yan <ziy@nvidia.com >
Cc: Thomas Gleixner <tglx@kernel.org >
Cc: Ingo Molnar <mingo@redhat.com >
Cc: Borislav Petkov <bp@alien8.de >
Cc: Dave Hansen <dave.hansen@linux.intel.com >
Cc: "H. Peter Anvin" <hpa@zytor.com >
Assisted-by: Gemini:unknown-version
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:42 -07:00
Brendan Jackman
bfceae3fd1
KVM: VMX: use higher-level allocator API
...
The difference between __alloc_pages_node() and alloc_pages_node() is
that the latter allows you to pass NUMA_NO_NODE.
The former is going away and the latter works fine here so switch over.
No functional change intended.
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-9-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Reviewed-by: Suren Baghdasaryan <surenb@google.com >
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Reviewed-by: Zi Yan <ziy@nvidia.com >
Cc: Sean Christopherson <seanjc@google.com >
Cc: Paolo Bonzini <pbonzini@redhat.com >
Assisted-by: Gemini:unknown-version
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:42 -07:00
Brendan Jackman
ca74a82522
perf/x86/intel: use higher-level allocator API
...
The difference between __alloc_pages_node() and alloc_pages_node() is that
the latter allows you to pass NUMA_NO_NODE.
The former is going away and the latter works fine here so switch over.
No functional change intended.
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-8-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Reviewed-by: Suren Baghdasaryan <surenb@google.com >
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Reviewed-by: Zi Yan <ziy@nvidia.com >
Cc: Peter Zijlstra <peterz@infradead.org >
Cc: Ingo Molnar <mingo@redhat.com >
Cc: Arnaldo Carvalho de Melo <acme@kernel.org >
Cc: Namhyung Kim <namhyung@kernel.org >
Cc: Mark Rutland <mark.rutland@arm.com >
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com >
Cc: Jiri Olsa <jolsa@kernel.org >
Cc: Ian Rogers <irogers@google.com >
Cc: Adrian Hunter <adrian.hunter@intel.com >
Cc: James Clark <james.clark@linaro.org >
Assisted-by: Gemini:unknown-version
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:42 -07:00
Brendan Jackman
6f414dbf21
mm: move some stuff to mm/page_alloc.h
...
Some of this stuff in the public header is only used internally so shrink
the scope to avoid silently growing new users.
drain_local_pages() is still used from kernel/power/snapshot.c so that
needs to stay behind.
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-7-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Reviewed-by: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:41 -07:00
Brendan Jackman
ba26999e7c
mm/page_alloc: relax GFP WARN in nolock allocs
...
This WARN forbids setting other flags than __GFP_ACCOUNT but we
unconditionally set the ones in gfp_nolock so they are certainly fine for
the caller to set.
There are other GFP flags that are almost certainly fine to set here;
Willy noted GFP_HIGHMEM, GFP_DMA, GFP_MOVABLE and GFP_HARDWALL. But,
nolock allocation is rather special, so be conservative to try and ensure
we have a chance to think carefully before nontrivial new usecases arise.
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-6-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Suggested-by: Matthew Wilcox <willy@infradead.org >
Link: https://lore.kernel.org/linux-mm/ajS96fWbG4dzP3u3@casper.infradead.org/
Reviewed-by: Suren Baghdasaryan <surenb@google.com >
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Acked-by: Harry Yoo (Oracle) <harry@kernel.org >
Acked-by: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:41 -07:00
Brendan Jackman
2fc4c1d51d
mm/page_alloc: unify __alloc_frozen_pages[_nolock]_noprof()
...
Currently the core allocator code is controlled by ALLOC_NOLOCK, but the
main entry point function is significantly different from the normal
__alloc_frozen_pages_nolock(), this is tiring when reading the code.
Plumb the ALLOC_NOLOCK control one layer up in the call stack: create an
alloc_flags argument to __alloc_frozen_pages_nolock() (which is only
exposed to mm/) and then turn the nolock variant into a thin wrapper that
just sets that flag (as well as handling NUMA_NO_NODE, similar to how some
of the wrappers in gfp.h do).
For consistency, set ALLOC_WMARK_MIN explicitly in fastpath_alloc_flags
for the new ALLOC_NOLOCK path. This was already "done" silently in
__alloc_frozen_pages_nolock_noprof(): ALLOC_WMARK_MIN is 0.
Rationale that this doesn't change anything:
1. Simple bits: A bunch of the nolock-specific handling is just moved to
the new alloc_order_allowed(), alloc_nolock_allowed() and
gfp_nolock.
2. __alloc_frozen_pages_noprof() has some extra logic that wasn't
previously in the nolock variant:
a. Application of gfp_allowed_mask; this only affects early boot,
only flags that affect the slowpath get changed here, and the
nolock allocation path isn't allowed to the GFP_BOOT_MASK flags.
b. Application of current_gfp_context() - also only affects the
slowpath
3. The slowpath itself: this is now just explicitly skipped under
!ALLOC_NOLOCK.
Ulterior motive: adding an alloc_flags arg to the allocator's mm-internal
entrypoint can later be used to do more allocation customisation without
needing to create new GFP flags.
No functional change intended.
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-5-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Acked-by: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:41 -07:00
Brendan Jackman
d0850de699
mm: split out internal page_alloc.h
...
internal.h is a bit bloated, seems like time for a page_alloc.h.
Where it wasn't obvious, the heuristic for deciding what goes into this
new header was "does it support/correspond to a definition in
mm/page_alloc.c?"
Only need to include it from ~20 .c files out of ~150 so this does seem
like a genuine reduction in scopes, which is nice. And there's no
circular internal.h<->page_alloc.h dependency, so it seems worthwhile to
split this up before that inevitably emerges!
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-4-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Suggested-by: "David Hildenbrand (Arm)" <david@kernel.org >
Link: https://lore.kernel.org/all/41e92bab-6882-401a-8de9-154adbdcfb36@kernel.org/
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Acked-by: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:41 -07:00
Brendan Jackman
2666382a4f
mm: name some args in a function declaration
...
Checkpatch complains about this, a later patch will move the code, fix it
so that checkpatch doesn't complain about that patch. Do it in a separate
patch so the "move the code" patch is trivial to review using Git's diff
colouring.
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-3-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Reviewed-by: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:40 -07:00
Brendan Jackman
4b2b50a9f8
mm/page_alloc: some renames to clarify alloc_flags scopes
...
It's pretty confusing that:
- The slowpath and fastpath have a totally distinct set of alloc_flags.
- gfp_to_alloc_flags() sounds generic but it only influences the
slowpath.
Rename some variables to highlight which alloc_flags are
fastpath-specific. Rename gfp_to_alloc_flags() to highlight that it's
slowpath-specific.
gfp_to_alloc_flags_cma() and gfp_to_alloc_flags_nonblocking() currently
have perfectly harmless names, but to keep the naming consistent also
rename those to the alloc_flags_*() pattern (which already exists for
alloc_flags_nofragment()).
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-2-c87b714e19d3@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Acked-by: JP Kobryn <jp.kobryn@linux.dev >
Reviewed-by: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:40 -07:00
Brendan Jackman
03eaf4c445
mm/page_alloc: rename ALLOC_TRYLOCK -> ALLOC_NOLOCK
...
Patch series "mm: Some cleanups for page allocator APIs", v5.
Some tweaks and cleanups for page allocator entrypoint and flags. This is
motivated by preparation for __GFP_UNMAPPED [1] (which will probably
become ALLOC_UNMAPPED in its next iteration), but all this is supposed to
be an improvement to the codebase in its own right: unifying code paths,
reducing API surface, and removing GFP flags.
This started with unifying __alloc_frozen_pages[_nolock]_noprof() and
expanded from there.
Unifying the nolock allocator entrypoint with the normal allocator
entrypoint means adding an alloc_flags argument to the later (only exposed
within mm/). This presents an opportunity to take advantage of that arg
to remove some GFP flags, if we add that alloc_flags arg a bit more
broadly to allocator entrypoints.
To distinguish between mm-internal and "public" allocator entrypoints, it
makes sense to use the __ prefix. There are already some public APIs with
that prefix. For *alloc_pages*, just removing those variants seems like a
nice cleanup anyway, so do that. For get_free_pages, the "__" variant is
the _only_ variant and it's very widely used, so it doesn't seem
worthwhile to modify that. Therefore, scope this "__" change specifically
to the *alloc_pages* API, which means we leave the *folio_alloc* API
untouched too, even though that could probably be cleaned up if so
desired.
This patch (of 18):
It's confusing that the function is called "nolock" but the flag is called
"trylock", align them.
The function's terminology is more visible and has more mindshare so use that.
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-0-c87b714e19d3@google.com
Link: https://lore.kernel.org/20260703-alloc-trylock-v5-1-c87b714e19d3@google.com
Link: https://lore.kernel.org/linux-mm/2399b3ad-4eac-4a14-94c3-27e9f07972a1@kernel.org/
Link: https://lore.kernel.org/all/20260320-page_alloc-unmapped-v2-0-28bf1bd54f41@google.com/ [1]
Signed-off-by: Brendan Jackman <jackmanb@google.com >
Suggested-by: "Vlastimil Babka (SUSE)" <vbabka@kernel.org >
Reviewed-by: Suren Baghdasaryan <surenb@google.com >
Reviewed-by: Harry Yoo (Oracle) <harry@kernel.org >
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org >
Acked-by: Zi Yan <ziy@nvidia.com >
Cc: Adrian Hunter <adrian.hunter@intel.com >
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com >
Cc: Alexei Starovoitov <ast@kernel.org >
Cc: Alistair Popple <apopple@nvidia.com >
Cc: Arnaldo Carvalho de Melo <acme@kernel.org >
Cc: Arnd Bergmann <arnd@arndb.de >
Cc: "Borislav Petkov (AMD)" <bp@alien8.de >
Cc: Byungchul Park <byungchul@sk.com >
Cc: David Hildenbrand <david@kernel.org >
Cc: David Rientjes <rientjes@google.com >
Cc: David S. Miller <davem@davemloft.net >
Cc: Dimitris Michailidis <dmichail@fungible.com >
Cc: Eric Dumazet <edumazet@google.com >
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
Cc: Gregory Price <gourry@gourry.net >
Cc: Harry Yoo <harry@kernel.org >
Cc: "H. Peter Anvin" <hpa@zytor.com >
Cc: "Huang, Ying" <ying.huang@linux.alibaba.com >
Cc: Ian Rogers <irogers@google.com >
Cc: Ingo Molnar <mingo@redhat.com >
Cc: Jakub Kacinski <kuba@kernel.org >
Cc: James Clark <james.clark@linaro.org >
Cc: Jiri Olsa <jolsa@kernel.org >
Cc: Johannes Weiner <hannes@cmpxchg.org >
Cc: Joshua Hahn <joshua.hahnjy@gmail.com >
Cc: Liam R. Howlett <liam@infradead.org >
Cc: Lorenzo Stoakes <ljs@kernel.org >
Cc: Marc Rutland <mark.rutland@arm.com >
Cc: Matthew Brost <matthew.brost@intel.com >
Cc: Matthew Wilcox (Oracle) <willy@infradead.org >
Cc: Michal Hocko <mhocko@suse.com >
Cc: Mike Rapoport <rppt@kernel.org >
Cc: Muchun Song <muchun.song@linux.dev >
Cc: Namhyung kim <namhyung@kernel.org >
Cc: Oscar Salvador <osalvador@suse.de >
Cc: Paolo Abeni <pabeni@redhat.com >
Cc: Paolo Bonzini <pbonzini@redhat.com >
Cc: Peter Zijlstra <peterz@infradead.org >
Cc: Rakie Kim <rakie.kim@sk.com >
Cc: Reiji Watanabe <reijiw@google.com >
Cc: Robin Holt <robinmholt@gmail.com >
Cc: Roman Gushchin <roman.gushchin@linux.dev >
Cc: Sean Christopherson <seanjc@google.com >
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de >
Cc: Steven Rostedt <rostedt@goodmis.org >
Cc: Steve Wahl <steve.wahl@hpe.com >
Cc: Suren Baghdasaryan <surenb@google.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:40 -07:00
SJ Park
a9298dd669
mm/damon/sysfs-schemes: set probe hits as pseudo moving sums
...
DAMON sysfs interface exposes damon_region->probe_hits via probe hit
files. Because the counters are completed only at the end of the
aggregation interval, users can show incomplete values if they requested
the file content update (update_schemes_tried_regions command) in the
middle of an aggregation interval. Set the value as the pseudo moving sum
value of the counter, similar to that for nr_accesses.
Link: https://lore.kernel.org/20260703170605.94472-4-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:39 -07:00
SJ Park
2ec26dd341
mm/damon/core: introduce damon_probe_hits_mvsum()
...
Implement a function for getting a reasonable best effort quality pseudo
moving sums of probe_hits on demands. It reuses the internal function for
the pseudo moving sum for data access frequency (nr_accesses).
Link: https://lore.kernel.org/20260703170605.94472-3-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:39 -07:00
SJ Park
aa497a270f
mm/damon: add damon_region->last_probe_hits
...
Patch series "mm/damon: provide pseudo moving sum probe_hits".
Data attribute counters (probe_hits) of DAMON are managed in the classical
way. The counter value is accumulated every sampling interval, gets the
complete view at the end of the aggregation interval, and is reset when
the next aggregation interval starts. Hence, the complete view can be
retrieved only once per aggregation interval, which can be quite long.
With the suggested intervals autotuning setup, it becomes 2-4 seconds in
common real production systems. It can span up to 200 seconds in theory.
This will restrict online monitoring use case of DAMON.
Actually DAMON is already providing online monitoring of probe_hits.
DAMON sysfs interface exposes the values via schemes tried regions
directory files. However, due to the above mentioned limitation, it
usually shows only partially accumulated hit counters and therefore not
useful.
DAMOS is not using probe_hits at the moment. In the future, using it can
further strengthen DAMOS. However, a recommended setup of DAMOS is
utilizing sampling/aggregation intervals auto-tuning, and having its own
DAMOS apply_interval (1 second is mostly recommended). In the setup,
DAMOS will nearly always show incompletely accumulated probe_hits, which
will not really be useful.
Data frequency counter (nr_accesses) of DAMON solves this problem using
the pseudo moving sum value. The infrastructure is not limited to
nr_accesses but general sampling based counters. Maintain and provide the
pseudo moving sum of probe_hits similar to nr_accesses, using the
infrastructure.
Tests
=====
On an idle system, I ran DAMON with an attribute probe filter for
non-anonymous page, using DAMON user-space tool, damo [1], like below.
$ sudo ./damo start --probe_filter allow non anon
Because the system is idle, nearly all memory is not an anonymous page but
a free page, so the probe_hits are expected to be nearly always full. In
this setup, since the sampling interval is 5ms and the aggregation
interval is 100ms, the counter value is expected to always be near 20.
On kernels not having this series, if we retrieve the probe hits in an
arbitrary time that is likely not aligned to the aggregation interval, the
values are usually much lower than the expectation like below. This is
because the tool is showing the incompletely aggregated values.
$ sudo ./damo report access --format append region "probe_hits: <probe hits>"
heatmap: 00000000000000000000000000000000000000008999999711111111000000000000000000000000
# min/max temperatures: -1,630,000,000, 0, column size: 99.800 MiB
intervals: sample 5 ms aggr 100 ms (max access hz 200)
0 addr 4.000 KiB size 3.898 GiB access 0 hz age 16.300 s probe_hits: 11
1 addr 3.898 GiB size 77.859 MiB access 0 hz age 1.500 s probe_hits: 11
2 addr 3.974 GiB size 700.770 MiB access 0 hz age 0 ns probe_hits: 11
3 addr 4.659 GiB size 791.078 MiB access 0 hz age 13.700 s probe_hits: 11
4 addr 5.431 GiB size 1.472 GiB access 0 hz age 15.800 s probe_hits: 11
5 addr 6.903 GiB size 915.059 MiB access 0 hz age 15.300 s probe_hits: 11
memory bw estimate: 0 B per second
total size: 7.797 GiB
record DAMON intervals: sample 5 ms, aggr 100 ms
After applying this series, I was able to reliably show the expected
results like below.
$ sudo ./damo report access --format append region "probe_hits: <probe hits>"
heatmap: 00000000333333330000000166666665111111139999999855555555333333333333333444444444
intervals: sample 5 ms aggr 100 ms (max access hz 200)
0 addr 4.000 KiB size 790.496 MiB access 0 hz age 1 m 33.300 s probe_hits: 20
1 addr 790.500 MiB size 791.160 MiB access 0 hz age 1 m 15.400 s probe_hits: 19
2 addr 1.545 GiB size 792.316 MiB access 0 hz age 1 m 32.400 s probe_hits: 19
3 addr 2.318 GiB size 795.465 MiB access 0 hz age 1 m 2.600 s probe_hits: 19
4 addr 3.095 GiB size 797.102 MiB access 0 hz age 1 m 23.500 s probe_hits: 20
5 addr 3.874 GiB size 797.293 MiB access 0 hz age 47.900 s probe_hits: 20
6 addr 4.652 GiB size 787.516 MiB access 0 hz age 1 m 3.800 s probe_hits: 20
7 addr 5.421 GiB size 784.461 MiB access 0 hz age 1 m 14.400 s probe_hits: 19
8 addr 6.187 GiB size 795.621 MiB access 0 hz age 1 m 15.700 s probe_hits: 20
9 addr 6.964 GiB size 798.000 MiB access 0 hz age 1 m 10.200 s probe_hits: 20
10 addr 7.744 GiB size 54.566 MiB access 0 hz age 1 m 9.300 s probe_hits: 20
memory bw estimate: 0 B per second
total size: 7.797 GiB
record DAMON intervals: sample 5 ms, aggr 100 ms
FYI, 'damo report access' output format has changed on v3.3.0. Above
outputs can be reproduced on <3.3.0 versions of damo.
Patches Sequence
================
Patch 1 adds probe_hits counters for values that fully accumulated in the
last aggregation interval. This is required for using the moving sum
infrastructure. Patch 2 introduces a function for getting the moving sum
values on demand, using the infrastructure. Finally, patch 3 updates the
DAMON sysfs interface to expose the moving sum values to the schemes tried
regions directory.
This patch (of 3):
Add new damon_region filed, last_probe_hits. Maintain fully accumulated
probe_hits values from the last aggregation interval in the field.
Link: https://lore.kernel.org/20260703170605.94472-1-sj@kernel.org
Link: https://lore.kernel.org/20260703170605.94472-2-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:39 -07:00
Feng Tang
923a89a91a
mm/vmalloc: add alignment info in warning print as possible failure reason
...
When running 'fix_align_alloc_test' case of test_vmalloc module with
command:
insmod ./test_vmalloc.ko run_test_mask=64
It will fail, which is the expected result, as the case increment
the alignment parameter gradually to 64bit limit. And the dmesg has
warning msg:
"vmalloc_test/0: vmalloc error: size 4096, vm_struct allocation failed, mode:0xdc0(GFP_KERNEL|__GFP_ZERO), nodemask=(null),cpuset=/,mems_allowed=0"
It doesn't give the alignment info, which is the real reason for the
failure (not the 'size').
Add alignment info to the warning print to give the necessary hint
for possible failure reason, and the message will be:
"vmalloc_test/0: vmalloc error: size 4096, align 0x800000000000, vm_struct allocation failed, mode:0xdc0(GFP_KERNEL|__GFP_ZERO), nodemask=(null),cpuset=/,mems_allowed=0"
Link: https://lore.kernel.org/20260702112610.21589-1-feng.tang@linux.alibaba.com
Signed-off-by: Feng Tang <feng.tang@linux.alibaba.com >
Reviewed-by: Uladzislau Rezki (Sony) <urezki@gmail.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:39 -07:00
Ackerley Tng
5737df3826
mm: hugetlb: refactor out hugetlb_alloc_folio()
...
Refactor out hugetlb_alloc_folio() from alloc_hugetlb_folio(), which
handles allocation of a folio and memory and HugeTLB charging to cgroups.
This refactoring decouples the HugeTLB page allocation from VMAs,
specifically:
1. Reservations (as in resv_map) are stored in the vma
2. mpol is stored at vma->vm_policy
3. A vma must be used for allocation even if the pages are not meant to be
used by host process.
Without this coupling, VMAs are no longer a requirement for allocation.
This opens up the allocation routine for usage without VMAs, which will
allow guest_memfd to use HugeTLB as a more generic allocator of huge
pages, since guest_memfd memory may not have any associated VMAs by
design. In addition, direct allocations from HugeTLB could possibly be
refactored to avoid the use of a pseudo-VMA.
Also, this decouples HugeTLB page allocation from HugeTLBfs, where the
subpool is stored at the fs mount. This is also a requirement for
guest_memfd, where the plan is to have a subpool created per-fd and stored
on the inode.
Provide and use alloc_flags to allow more allocation knobs in future
without expanding the number of parameters in hugetlb_alloc_folio().
No functional change intended.
Link: https://lore.kernel.org/20260702-hugetlb-open-up-v4-6-d53cefcccf34@google.com
Signed-off-by: Ackerley Tng <ackerleytng@google.com >
Cc: Alistair Popple <apopple@nvidia.com >
Cc: Byungchul Park <byungchul@sk.com >
Cc: David Hildenbrand <david@kernel.org >
Cc: David Rientjes <rientjes@google.com >
Cc: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com >
Cc: Frank van der Linden <fvdl@google.com >
Cc: Gregory Price <gourry@gourry.net >
Cc: "Huang, Ying" <ying.huang@linux.alibaba.com >
Cc: James Houghton <jthoughton@google.com >
Cc: Jason Gunthorpe <jgg@ziepe.ca >
Cc: Jiaqi Yan <jiaqiyan@google.com >
Cc: Joshua Hahn <joshua.hahnjy@gmail.com >
Cc: Matthew Brost <matthew.brost@intel.com >
Cc: Michael Roth <michael.roth@amd.com >
Cc: Michal Hocko <mhocko@kernel.org >
Cc: Muchun Song <muchun.song@linux.dev >
Cc: Oscar Salvador <osalvador@suse.de >
Cc: Paolo Bonzini <pbonzini@redhat.com >
Cc: Pasha Tatashin <pasha.tatashin@soleen.com >
Cc: Peter Xu <peterx@redhat.com >
Cc: Pratyush Yadav <pratyush@kernel.org >
Cc: Rakie Kim <rakie.kim@sk.com >
Cc: Roman Gushchin <roman.gushchin@linux.dev >
Cc: Sean Christopherson <seanjc@google.com >
Cc: Shakeel Butt <shakeel.butt@linux.dev >
Cc: Shivank Garg <shivankg@amd.com >
Cc: Vishal Annapurve <vannapurve@google.com >
Cc: Yan Zhao <yan.y.zhao@intel.com >
Cc: Zi Yan <ziy@nvidia.com >
Cc: Qi Zheng <qi.zheng@linux.dev >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:38 -07:00
Ackerley Tng
177e1cbbb5
mm: hugetlb: move mem_cgroup_charge_hugetlb() earlier in allocation
...
Move mem_cgroup_charge_hugetlb() earlier in the folio allocation process.
This change draws a cleaner line between memcg charging and the subsequent
hugetlb-specific reservation logic for VMAs and subpools.
While it would be ideal to make all accounting and reservations perfectly
symmetric, mem_cgroup_charge_hugetlb() is a complex operation that cannot
be performed under the hugetlb_lock. Moving the charge to this earlier
point ensures that memcg charging is handled before the code begins
manipulating subpool and VMA-specific state. These two types of
accounting will be separated in a future patch.
If mem_cgroup_charge_hugetlb() fails, the code now branches to
out_subpool_put to ensure the folio is freed and the subpool references
are handled correctly.
Link: https://lore.kernel.org/20260702-hugetlb-open-up-v4-5-d53cefcccf34@google.com
Signed-off-by: Ackerley Tng <ackerleytng@google.com >
Cc: Alistair Popple <apopple@nvidia.com >
Cc: Byungchul Park <byungchul@sk.com >
Cc: David Hildenbrand <david@kernel.org >
Cc: David Rientjes <rientjes@google.com >
Cc: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com >
Cc: Frank van der Linden <fvdl@google.com >
Cc: Gregory Price <gourry@gourry.net >
Cc: "Huang, Ying" <ying.huang@linux.alibaba.com >
Cc: James Houghton <jthoughton@google.com >
Cc: Jason Gunthorpe <jgg@ziepe.ca >
Cc: Jiaqi Yan <jiaqiyan@google.com >
Cc: Joshua Hahn <joshua.hahnjy@gmail.com >
Cc: Matthew Brost <matthew.brost@intel.com >
Cc: Michael Roth <michael.roth@amd.com >
Cc: Michal Hocko <mhocko@kernel.org >
Cc: Muchun Song <muchun.song@linux.dev >
Cc: Oscar Salvador <osalvador@suse.de >
Cc: Paolo Bonzini <pbonzini@redhat.com >
Cc: Pasha Tatashin <pasha.tatashin@soleen.com >
Cc: Peter Xu <peterx@redhat.com >
Cc: Pratyush Yadav <pratyush@kernel.org >
Cc: Qi Zheng <qi.zheng@linux.dev >
Cc: Rakie Kim <rakie.kim@sk.com >
Cc: Roman Gushchin <roman.gushchin@linux.dev >
Cc: Sean Christopherson <seanjc@google.com >
Cc: Shakeel Butt <shakeel.butt@linux.dev >
Cc: Shivank Garg <shivankg@amd.com >
Cc: Vishal Annapurve <vannapurve@google.com >
Cc: Yan Zhao <yan.y.zhao@intel.com >
Cc: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:38 -07:00
Ackerley Tng
564b2eeeb9
mm: hugetlb: use error variable in alloc_hugetlb_folio
...
Refactor alloc_hugetlb_folio to use a local variable for returning error
codes. Instead of returning ERR_PTR(-ENOSPC) at the end of the error
path, assign -ENOSPC to a return variable at each failure point and return
that variable at the end.
This allows the cleanup goto targets to be used with other errors in a
later patch.
No functional change intended.
Link: https://lore.kernel.org/20260702-hugetlb-open-up-v4-4-d53cefcccf34@google.com
Signed-off-by: Ackerley Tng <ackerleytng@google.com >
Cc: Alistair Popple <apopple@nvidia.com >
Cc: Byungchul Park <byungchul@sk.com >
Cc: David Hildenbrand <david@kernel.org >
Cc: David Rientjes <rientjes@google.com >
Cc: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com >
Cc: Frank van der Linden <fvdl@google.com >
Cc: Gregory Price <gourry@gourry.net >
Cc: "Huang, Ying" <ying.huang@linux.alibaba.com >
Cc: James Houghton <jthoughton@google.com >
Cc: Jason Gunthorpe <jgg@ziepe.ca >
Cc: Jiaqi Yan <jiaqiyan@google.com >
Cc: Joshua Hahn <joshua.hahnjy@gmail.com >
Cc: Matthew Brost <matthew.brost@intel.com >
Cc: Michael Roth <michael.roth@amd.com >
Cc: Michal Hocko <mhocko@kernel.org >
Cc: Muchun Song <muchun.song@linux.dev >
Cc: Oscar Salvador <osalvador@suse.de >
Cc: Paolo Bonzini <pbonzini@redhat.com >
Cc: Pasha Tatashin <pasha.tatashin@soleen.com >
Cc: Peter Xu <peterx@redhat.com >
Cc: Pratyush Yadav <pratyush@kernel.org >
Cc: Qi Zheng <qi.zheng@linux.dev >
Cc: Rakie Kim <rakie.kim@sk.com >
Cc: Roman Gushchin <roman.gushchin@linux.dev >
Cc: Sean Christopherson <seanjc@google.com >
Cc: Shakeel Butt <shakeel.butt@linux.dev >
Cc: Shivank Garg <shivankg@amd.com >
Cc: Vishal Annapurve <vannapurve@google.com >
Cc: Yan Zhao <yan.y.zhao@intel.com >
Cc: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:38 -07:00
Ackerley Tng
a492abe28b
mm: hugetlb: move mpol interpretation out of dequeue_hugetlb_folio_vma()
...
Move memory policy interpretation out of dequeue_hugetlb_folio_vma() and
into alloc_hugetlb_folio() to separate reading and interpretation of
memory policy from actual allocation.
Also rename dequeue_hugetlb_folio_vma() to
dequeue_hugetlb_folio_with_mpol() to remove association with vma and to
align with alloc_buddy_hugetlb_folio_with_mpol().
This will later allow memory policy to be interpreted outside of the
process of allocating a hugetlb folio entirely. This opens doors for
other callers of the HugeTLB folio allocation function, such as
guest_memfd, where memory may not always be mapped and hence may not have
an associated vma.
No functional change intended.
Link: https://lore.kernel.org/20260702-hugetlb-open-up-v4-3-d53cefcccf34@google.com
Signed-off-by: Ackerley Tng <ackerleytng@google.com >
Reviewed-by: James Houghton <jthoughton@google.com >
Cc: Alistair Popple <apopple@nvidia.com >
Cc: Byungchul Park <byungchul@sk.com >
Cc: David Hildenbrand <david@kernel.org >
Cc: David Rientjes <rientjes@google.com >
Cc: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com >
Cc: Frank van der Linden <fvdl@google.com >
Cc: Gregory Price <gourry@gourry.net >
Cc: "Huang, Ying" <ying.huang@linux.alibaba.com >
Cc: Jason Gunthorpe <jgg@ziepe.ca >
Cc: Jiaqi Yan <jiaqiyan@google.com >
Cc: Joshua Hahn <joshua.hahnjy@gmail.com >
Cc: Matthew Brost <matthew.brost@intel.com >
Cc: Michael Roth <michael.roth@amd.com >
Cc: Michal Hocko <mhocko@kernel.org >
Cc: Muchun Song <muchun.song@linux.dev >
Cc: Oscar Salvador <osalvador@suse.de >
Cc: Paolo Bonzini <pbonzini@redhat.com >
Cc: Pasha Tatashin <pasha.tatashin@soleen.com >
Cc: Peter Xu <peterx@redhat.com >
Cc: Pratyush Yadav <pratyush@kernel.org >
Cc: Qi Zheng <qi.zheng@linux.dev >
Cc: Rakie Kim <rakie.kim@sk.com >
Cc: Roman Gushchin <roman.gushchin@linux.dev >
Cc: Sean Christopherson <seanjc@google.com >
Cc: Shakeel Butt <shakeel.butt@linux.dev >
Cc: Shivank Garg <shivankg@amd.com >
Cc: Vishal Annapurve <vannapurve@google.com >
Cc: Yan Zhao <yan.y.zhao@intel.com >
Cc: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:38 -07:00
Ackerley Tng
66a4e9e11e
mm: hugetlb: move mpol interpretation out of alloc_buddy_hugetlb_folio_with_mpol()
...
Move memory policy interpretation out of
alloc_buddy_hugetlb_folio_with_mpol() and into alloc_hugetlb_folio() to
separate reading and interpretation of memory policy from actual
allocation.
This will later allow memory policy to be interpreted outside of the
process of allocating a hugetlb folio entirely. This opens doors for
other callers of the HugeTLB folio allocation function, such as
guest_memfd, where memory may not always be mapped and hence may not have
an associated vma.
Introduce struct mempolicy_interpreted to hold all the components of an
interpreted memory policy.
Rename alloc_buddy_hugetlb_folio_with_mpol() to
alloc_buddy_hugetlb_folio() since the function no longer interprets memory
policy.
No functional change intended.
Link: https://lore.kernel.org/20260702-hugetlb-open-up-v4-2-d53cefcccf34@google.com
Signed-off-by: Ackerley Tng <ackerleytng@google.com >
Reviewed-by: James Houghton <jthoughton@google.com >
Acked-by: Oscar Salvador <osalvador@suse.de >
Cc: Alistair Popple <apopple@nvidia.com >
Cc: Byungchul Park <byungchul@sk.com >
Cc: David Hildenbrand <david@kernel.org >
Cc: David Rientjes <rientjes@google.com >
Cc: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com >
Cc: Frank van der Linden <fvdl@google.com >
Cc: Gregory Price <gourry@gourry.net >
Cc: "Huang, Ying" <ying.huang@linux.alibaba.com >
Cc: Jason Gunthorpe <jgg@ziepe.ca >
Cc: Jiaqi Yan <jiaqiyan@google.com >
Cc: Joshua Hahn <joshua.hahnjy@gmail.com >
Cc: Matthew Brost <matthew.brost@intel.com >
Cc: Michael Roth <michael.roth@amd.com >
Cc: Michal Hocko <mhocko@kernel.org >
Cc: Muchun Song <muchun.song@linux.dev >
Cc: Paolo Bonzini <pbonzini@redhat.com >
Cc: Pasha Tatashin <pasha.tatashin@soleen.com >
Cc: Peter Xu <peterx@redhat.com >
Cc: Pratyush Yadav <pratyush@kernel.org >
Cc: Qi Zheng <qi.zheng@linux.dev >
Cc: Rakie Kim <rakie.kim@sk.com >
Cc: Roman Gushchin <roman.gushchin@linux.dev >
Cc: Sean Christopherson <seanjc@google.com >
Cc: Shakeel Butt <shakeel.butt@linux.dev >
Cc: Shivank Garg <shivankg@amd.com >
Cc: Vishal Annapurve <vannapurve@google.com >
Cc: Yan Zhao <yan.y.zhao@intel.com >
Cc: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:37 -07:00
Ackerley Tng
8881961968
mm: hugetlb: consolidate interpretation of gbl_chg within alloc_hugetlb_folio()
...
Patch series "Open HugeTLB allocation routine for more generic use", v4.
The motivation for this patch series is guest_memfd, which would like to
use HugeTLB as a generic source of huge pages but not adopt HugeTLB's
reservation at mmap() time.
By refactoring alloc_hugetlb_folio() and some dependent functions, there
is now an option to allocate HugeTLB folios without providing a VMA.
Specifically, HugeTLB allocation used to be dependent on the VMA to
1. Look up reservations in the resv_map
2. Get mpol, stored at vma->vm_policy
This refactoring provides hugetlb_alloc_folio(), which focuses on just the
allocation itself, and associated memory and HugeTLB charging (cgroups).
alloc_hugetlb_folio() still handles reservations in the resv_map and
subpools.
Regarding naming, I'm definitely open to alternative names :) I chose
hugetlb_alloc_folio() because I'm seeing this function as a general
allocation function that is provided by the HugeTLB subsystem (hence the
hugetlb_ prefix). I'm intending for alloc_hugetlb_folio() to be later
refactored as a static function for use just by HugeTLB, and HugeTLBfs
should probably use hugetlb_alloc_folio() directly.
To see how hugetlb_alloc_folio() is used by guest_memfd, the most recent
patch series that uses this more generic HugeTLB allocation routine is at
[1], and a newer revision of that patch series is at [2].
Independently of guest_memfd, I believe this change is useful in
simplifying alloc_hugetlb_folio(). alloc_hugetlb_folio() was so coupled
to a VMA that even HugeTLBfs allocates HugeTLB folios using a pseudo-VMA.
This patch (of 6):
The dequeue_hugetlb_folio_vma() function currently handles the gbl_chg
parameter to determine if a folio can be dequeued based on global page
availability. This leaks reservation-specific logic into the dequeueing
path.
Relocate this logic to alloc_hugetlb_folio() so that
dequeue_hugetlb_folio_vma() focuses solely on selecting and dequeuing a
folio. In alloc_hugetlb_folio(), only attempt to dequeue a folio if a
reservation exists (gbl_chg == 0) or if there are available huge pages in
the global pool.
No functional change intended.
Link: https://lore.kernel.org/20260702-hugetlb-open-up-v4-0-d53cefcccf34@google.com
Link: https://lore.kernel.org/20260702-hugetlb-open-up-v4-1-d53cefcccf34@google.com
Link: https://lore.kernel.org/all/cover.1747264138.git.ackerleytng@google.com/T/ [1]
Link: https://github.com/googleprodkernel/linux-cc/tree/wip-gmem-conversions-hugetlb-restructuring-12-08-25 [2]
Link: https://lore.kernel.org/all/agqaUcVp_hwH-VXr@localhost.localdomain/ [3]
Link: https://sashiko.dev/#/patchset/20260518-hugetlb-open-up-v3-0-e14b302477f8@google.com [4]
Signed-off-by: Ackerley Tng <ackerleytng@google.com >
Reviewed-by: James Houghton <jthoughton@google.com >
Acked-by: Oscar Salvador <osalvador@suse.de >
Reviewed-by: Joshua Hahn <joshua.hahnjy@gmail.com >
Cc: Qi Zheng <qi.zheng@linux.dev >
Cc: Alistair Popple <apopple@nvidia.com >
Cc: Byungchul Park <byungchul@sk.com >
Cc: David Hildenbrand <david@kernel.org >
Cc: David Rientjes <rientjes@google.com >
Cc: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com >
Cc: Frank van der Linden <fvdl@google.com >
Cc: Gregory Price <gourry@gourry.net >
Cc: "Huang, Ying" <ying.huang@linux.alibaba.com >
Cc: Jason Gunthorpe <jgg@ziepe.ca >
Cc: Jiaqi Yan <jiaqiyan@google.com >
Cc: Matthew Brost <matthew.brost@intel.com >
Cc: Michael Roth <michael.roth@amd.com >
Cc: Michal Hocko <mhocko@kernel.org >
Cc: Muchun Song <muchun.song@linux.dev >
Cc: Paolo Bonzini <pbonzini@redhat.com >
Cc: Pasha Tatashin <pasha.tatashin@soleen.com >
Cc: Peter Xu <peterx@redhat.com >
Cc: Pratyush Yadav <pratyush@kernel.org >
Cc: Rakie Kim <rakie.kim@sk.com >
Cc: Roman Gushchin <roman.gushchin@linux.dev >
Cc: Sean Christopherson <seanjc@google.com >
Cc: Shakeel Butt <shakeel.butt@linux.dev >
Cc: Shivank Garg <shivankg@amd.com >
Cc: Vishal Annapurve <vannapurve@google.com >
Cc: Yan Zhao <yan.y.zhao@intel.com >
Cc: Zi Yan <ziy@nvidia.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:37 -07:00
Zhen Yan
d7a8934c07
mm: fix mapping_seek_hole_data() overflow on last page
...
A local unprivileged process can create a shmem/tmpfs file with i_size ==
LLONG_MAX using memfd_create() and fallocate(). If the last page is
present in the page cache, lseek(SEEK_HOLE) on that page returns
0x8000000000000000 as a successful offset, which is LLONG_MIN when stored
in loff_t.
The same file has readable data at the last byte, but SEEK_DATA from that
offset returns ENXIO.
The overflow is in mapping_seek_hole_data():
pos = round_up((u64)pos + 1, seek_size);
For the final page below LLONG_MAX, the next page boundary is
0x8000000000000000, which is then used as a signed file offset. When
assigned to the loff_t pos, this overflows to LLONG_MIN, so a subsequent
"pos > end" comparison does not catch it.
Keep mapping_seek_hole_data() inside its documented [start, end) search
range: compute round_up() into a u64 variable and compare against (u64)end
so the overflow is detected, then clamp pos to end when the rounded-up
value goes past the search limit.
Link: https://lore.kernel.org/20260630125047.703170-1-yanzhen20011121@163.com
Signed-off-by: Zhen Yan <yanzhen20011121@163.com >
Cc: Christian Brauner <brauner@kernel.org >
Cc: Hugh Dickins <hughd@google.com >
Cc: Jan Kara <jack@suse.cz >
Cc: Matthew Wilcox (Oracle) <willy@infradead.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:37 -07:00
SJ Park
a5edf881c9
mm/damon/core: remove damon_region->nr_accesses_bp
...
No code touches damon_region->nr_accesses_bp field. Remove it.
Link: https://lore.kernel.org/20260630040812.149729-19-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Cc: Brendan Higgins <brendan.higgins@linux.dev >
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org >
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com >
Cc: Shuah Khan <shuah@kernel.org >
Cc: Steven Rostedt <rostedt@goodmis.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:37 -07:00
SJ Park
9255add1fc
mm/damon/core: remove damon_moving_sum() and its unit test
...
damon_moving_sum() is no longer being called for real purpose but its unit
test. Testing a function that is not being used for real users makes no
sense. Remove the test and the function.
Link: https://lore.kernel.org/20260630040812.149729-18-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Cc: Brendan Higgins <brendan.higgins@linux.dev >
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org >
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com >
Cc: Shuah Khan <shuah@kernel.org >
Cc: Steven Rostedt <rostedt@goodmis.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:36 -07:00
SJ Park
5744423b46
mm/damon/vaddr: remove attrs param from __damon_va_check_access()
...
The function is not using attrs parameter. Remove it.
Link: https://lore.kernel.org/20260630040812.149729-17-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Cc: Brendan Higgins <brendan.higgins@linux.dev >
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org >
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com >
Cc: Shuah Khan <shuah@kernel.org >
Cc: Steven Rostedt <rostedt@goodmis.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:36 -07:00
SJ Park
74a03cad1b
mm/damon/paddr: remove attrs param from __damon_pa_check_access()
...
The function is not using the parameter. Remove it.
Link: https://lore.kernel.org/20260630040812.149729-16-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Cc: Brendan Higgins <brendan.higgins@linux.dev >
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org >
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com >
Cc: Shuah Khan <shuah@kernel.org >
Cc: Steven Rostedt <rostedt@goodmis.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:36 -07:00
SJ Park
3a61be80e8
mm/damon/core: remove attrs param from damon_update_region_access_rate()
...
damon_update_region_access_rate() is not using attrs parameter. Remove
it.
Link: https://lore.kernel.org/20260630040812.149729-15-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Cc: Brendan Higgins <brendan.higgins@linux.dev >
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org >
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com >
Cc: Shuah Khan <shuah@kernel.org >
Cc: Steven Rostedt <rostedt@goodmis.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:35 -07:00
SJ Park
8bd5540d8e
mm/damon/core: remove nr_accesses_bp setups and updates
...
DAMON core sets and updates nr_accesses_bp in multiple places. It
explains how delicate it is. The field is no more being used for any real
purpose, and replaced by a simpler function. Remove the setups and
updates.
Link: https://lore.kernel.org/20260630040812.149729-14-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Cc: Brendan Higgins <brendan.higgins@linux.dev >
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org >
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com >
Cc: Shuah Khan <shuah@kernel.org >
Cc: Steven Rostedt <rostedt@goodmis.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:35 -07:00
SJ Park
51bd0de225
selftests/damon/drgn_dump_damon_status: do not dump nr_accesses_bp
...
drgn_dump_damon_status is dumping nr_accesses_bp field for future use
case. nr_accesses_bp is not being used for a real purpose, though. Hence
there will be no future test for it. Do not dump it.
Link: https://lore.kernel.org/20260630040812.149729-13-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Cc: Brendan Higgins <brendan.higgins@linux.dev >
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org >
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com >
Cc: Shuah Khan <shuah@kernel.org >
Cc: Steven Rostedt <rostedt@goodmis.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:35 -07:00
SJ Park
ca7e1c3f06
mm/damon/tests/core-kunit: remove nr_accesses_bp setup and tests
...
DAMON core unit tests set up nr_accesses_bp for representing realistic
damon_region, and also test the field. nr_acceses_bp is no longer being
used for a real use case. Remove the setup and tests.
Link: https://lore.kernel.org/20260630040812.149729-12-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Cc: Brendan Higgins <brendan.higgins@linux.dev >
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org >
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com >
Cc: Shuah Khan <shuah@kernel.org >
Cc: Steven Rostedt <rostedt@goodmis.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:35 -07:00
SJ Park
5c1eece7c9
mm/damon/core: remove damon_verify_merge_regions_of()
...
damon_verify_merge_regions_of() is only for nr_accesses_bp validation.
But nr_accesses_bp is no more being used for a real purpose. Remove the
validation.
Link: https://lore.kernel.org/20260630040812.149729-11-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Cc: Brendan Higgins <brendan.higgins@linux.dev >
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org >
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com >
Cc: Shuah Khan <shuah@kernel.org >
Cc: Steven Rostedt <rostedt@goodmis.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:34 -07:00
SJ Park
e33eb22d71
mm/damon/core: remove damon_verify_reset_aggregated()
...
nr_accesses_bp is no longer being used in real use cases. Remove its
validation function.
Link: https://lore.kernel.org/20260630040812.149729-10-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Cc: Brendan Higgins <brendan.higgins@linux.dev >
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org >
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com >
Cc: Shuah Khan <shuah@kernel.org >
Cc: Steven Rostedt <rostedt@goodmis.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:34 -07:00
SJ Park
653902082c
mm/damon/core: remove damon_warn_fix_nr_accesses_corruption()
...
nr_accesses_bp is delicate. Once it is corrupted, the consequence is the
bad madness of DAMON monitoring results. From developments of features of
size, we historically found nr_accesses_bp can be corrupted by complicated
bugs that are not easy to debug. Hence we added a function for finding
the corruption and fixing it right away.
There are no more uses of nr_accesses_bp. Hence the function for
corruption detection and fix is no more needed. Rip it out.
Link: https://lore.kernel.org/20260630040812.149729-9-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Cc: Brendan Higgins <brendan.higgins@linux.dev >
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org >
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com >
Cc: Shuah Khan <shuah@kernel.org >
Cc: Steven Rostedt <rostedt@goodmis.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:34 -07:00
SJ Park
e4375bcf0f
mm/damon/sysfs-schemes: use damon_nr_accesses_mvsum() for damo regions
...
damon_nr_accesses_mvsum() returns a value same to nr_accesses_bp. Also
the function is more simple and therefore more tolerant to errors.
Execution of the function would be more expensive than the simple read of
the field, but because the function is quite simple, the overhead should
be negligible. Use it in the DAMON sysfs interface for scheme-tried
regions, instead of the nr_accesses_bp.
Link: https://lore.kernel.org/20260630040812.149729-8-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Cc: Brendan Higgins <brendan.higgins@linux.dev >
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org >
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com >
Cc: Shuah Khan <shuah@kernel.org >
Cc: Steven Rostedt <rostedt@goodmis.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:34 -07:00
SJ Park
bcea0202d4
mm/damon/core: use damon_nr_accesses_mvsum() for damos region tracing
...
damon_nr_accesses_mvsum() returns a value same to nr_accesses_bp. Also
the function is more simple and therefore more tolerant to errors.
Execution of the function would be more expensive than the simple read of
the field, but because the function is quite simple, the overhead should
be negligible. Use it in the DAMON region exporting trace points instead
of the nr_accesses_bp.
Link: https://lore.kernel.org/20260630040812.149729-7-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Cc: Brendan Higgins <brendan.higgins@linux.dev >
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org >
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com >
Cc: Shuah Khan <shuah@kernel.org >
Cc: Steven Rostedt <rostedt@goodmis.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:33 -07:00
SJ Park
8ea1a3a70a
mm/damon/core: use damon_nr_accesses_mvsum() in __damos_valid_target()
...
damon_nr_accesses_mvsum() returns a value same to nr_accesses_bp. Also
the function is more simple and therefore more tolerant to errors.
Execution of the function would be more expensive than the simple read of
the field, but because the function is quite simple, the overhead should
be negligible. Use it in __damos_valid_target() instead of the
nr_accesses_bp.
Link: https://lore.kernel.org/20260630040812.149729-6-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Cc: Brendan Higgins <brendan.higgins@linux.dev >
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org >
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com >
Cc: Shuah Khan <shuah@kernel.org >
Cc: Steven Rostedt <rostedt@goodmis.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:33 -07:00
SJ Park
1b43501d68
mm/damon/core: handle unreset nr_accesses in damon_nr_accesses_mvsum()
...
damon_set_attrs() works like reverting aggregations that were made so far
for this aggregation window. If this is the end of the aggregation,
however, kdamond_fn() will do the operations at the end of the aggregation
interval, using cached timestamps. For such operations that rely on
damon_region->nr_accesses, damon_update_monitoring_results() doesn't reset
the nr_accesses if it is called at the end of the aggregation window.
damon_nr_accesses_mvsum() works with fresh timestamps, though. The
nr_accesses that are not reset in this case can make the logic to
unnecessarily count nr_accesses, resulting in returning
higher-than-expected pseudo moving sum nr_accesses. No code is using
damon_nr_accesses_mvsum() yet, so this is not causing a real problem.
Following commits will add usage of the function, though. For safe
usages, calculate the pseudo moving sum without nr_accesses if the
remaining window is full.
Link: https://lore.kernel.org/20260630040812.149729-5-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org >
Cc: Brendan Higgins <brendan.higgins@linux.dev >
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org >
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com >
Cc: Shuah Khan <shuah@kernel.org >
Cc: Steven Rostedt <rostedt@goodmis.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2026-07-30 19:40:33 -07:00