mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
mm: introduce memdesc_flags_t
Patch series "Add and use memdesc_flags_t". At some point struct page will be separated from struct slab and struct folio. This is a step towards that by introducing a type for the 'flags' word of all three structures. This gives us a certain amount of type safety by establishing that some of these unsigned longs are different from other unsigned longs in that they contain things like node ID, section number and zone number in the upper bits. That lets us have functions that can be easily called by anyone who has a slab, folio or page (but not easily by anyone else) to get the node or zone. There's going to be some unusual merge problems with this as some odd bits of the kernel decide they want to print out the flags value or something similar by writing page->flags and now they'll need to write page->flags.f instead. That's most of the churn here. Maybe we should be removing these things from the debug output? This patch (of 11): Wrap the unsigned long flags in a typedef. In upcoming patches, this will provide a strong hint that you can't just pass a random unsigned long to functions which take this as an argument. [willy@infradead.org: s/flags/flags.f/ in several architectures] Link: https://lkml.kernel.org/r/aKMgPRLD-WnkPxYm@casper.infradead.org [nicola.vetrini@gmail.com: mips: fix compilation error] Link: https://lore.kernel.org/lkml/CA+G9fYvkpmqGr6wjBNHY=dRp71PLCoi2341JxOudi60yqaeUdg@mail.gmail.com/ Link: https://lkml.kernel.org/r/20250825214245.1838158-1-nicola.vetrini@gmail.com Link: https://lkml.kernel.org/r/20250805172307.1302730-1-willy@infradead.org Link: https://lkml.kernel.org/r/20250805172307.1302730-2-willy@infradead.org Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Acked-by: Zi Yan <ziy@nvidia.com> Cc: Shakeel Butt <shakeel.butt@linux.dev> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
4e915656a3
commit
53fbef56e0
+4
-4
@@ -704,7 +704,7 @@ static inline void arc_slc_enable(void)
|
||||
|
||||
void flush_dcache_folio(struct folio *folio)
|
||||
{
|
||||
clear_bit(PG_dc_clean, &folio->flags);
|
||||
clear_bit(PG_dc_clean, &folio->flags.f);
|
||||
return;
|
||||
}
|
||||
EXPORT_SYMBOL(flush_dcache_folio);
|
||||
@@ -889,8 +889,8 @@ void copy_user_highpage(struct page *to, struct page *from,
|
||||
|
||||
copy_page(kto, kfrom);
|
||||
|
||||
clear_bit(PG_dc_clean, &dst->flags);
|
||||
clear_bit(PG_dc_clean, &src->flags);
|
||||
clear_bit(PG_dc_clean, &dst->flags.f);
|
||||
clear_bit(PG_dc_clean, &src->flags.f);
|
||||
|
||||
kunmap_atomic(kto);
|
||||
kunmap_atomic(kfrom);
|
||||
@@ -900,7 +900,7 @@ void clear_user_page(void *to, unsigned long u_vaddr, struct page *page)
|
||||
{
|
||||
struct folio *folio = page_folio(page);
|
||||
clear_page(to);
|
||||
clear_bit(PG_dc_clean, &folio->flags);
|
||||
clear_bit(PG_dc_clean, &folio->flags.f);
|
||||
}
|
||||
EXPORT_SYMBOL(clear_user_page);
|
||||
|
||||
|
||||
+1
-1
@@ -488,7 +488,7 @@ void update_mmu_cache_range(struct vm_fault *vmf, struct vm_area_struct *vma,
|
||||
*/
|
||||
if (vma->vm_flags & VM_EXEC) {
|
||||
struct folio *folio = page_folio(page);
|
||||
int dirty = !test_and_set_bit(PG_dc_clean, &folio->flags);
|
||||
int dirty = !test_and_set_bit(PG_dc_clean, &folio->flags.f);
|
||||
if (dirty) {
|
||||
unsigned long offset = offset_in_folio(folio, paddr);
|
||||
nr = folio_nr_pages(folio);
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
static inline void arch_clear_hugetlb_flags(struct folio *folio)
|
||||
{
|
||||
clear_bit(PG_dcache_clean, &folio->flags);
|
||||
clear_bit(PG_dcache_clean, &folio->flags.f);
|
||||
}
|
||||
#define arch_clear_hugetlb_flags arch_clear_hugetlb_flags
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ void v4_mc_copy_user_highpage(struct page *to, struct page *from,
|
||||
struct folio *src = page_folio(from);
|
||||
void *kto = kmap_atomic(to);
|
||||
|
||||
if (!test_and_set_bit(PG_dcache_clean, &src->flags))
|
||||
if (!test_and_set_bit(PG_dcache_clean, &src->flags.f))
|
||||
__flush_dcache_folio(folio_flush_mapping(src), src);
|
||||
|
||||
raw_spin_lock(&minicache_lock);
|
||||
|
||||
@@ -73,7 +73,7 @@ static void v6_copy_user_highpage_aliasing(struct page *to,
|
||||
unsigned int offset = CACHE_COLOUR(vaddr);
|
||||
unsigned long kfrom, kto;
|
||||
|
||||
if (!test_and_set_bit(PG_dcache_clean, &src->flags))
|
||||
if (!test_and_set_bit(PG_dcache_clean, &src->flags.f))
|
||||
__flush_dcache_folio(folio_flush_mapping(src), src);
|
||||
|
||||
/* FIXME: not highmem safe */
|
||||
|
||||
@@ -87,7 +87,7 @@ void xscale_mc_copy_user_highpage(struct page *to, struct page *from,
|
||||
struct folio *src = page_folio(from);
|
||||
void *kto = kmap_atomic(to);
|
||||
|
||||
if (!test_and_set_bit(PG_dcache_clean, &src->flags))
|
||||
if (!test_and_set_bit(PG_dcache_clean, &src->flags.f))
|
||||
__flush_dcache_folio(folio_flush_mapping(src), src);
|
||||
|
||||
raw_spin_lock(&minicache_lock);
|
||||
|
||||
@@ -718,7 +718,7 @@ static void __dma_page_dev_to_cpu(struct page *page, unsigned long off,
|
||||
if (size < sz)
|
||||
break;
|
||||
if (!offset)
|
||||
set_bit(PG_dcache_clean, &folio->flags);
|
||||
set_bit(PG_dcache_clean, &folio->flags.f);
|
||||
offset = 0;
|
||||
size -= sz;
|
||||
if (!size)
|
||||
|
||||
@@ -203,7 +203,7 @@ void update_mmu_cache_range(struct vm_fault *vmf, struct vm_area_struct *vma,
|
||||
|
||||
folio = page_folio(pfn_to_page(pfn));
|
||||
mapping = folio_flush_mapping(folio);
|
||||
if (!test_and_set_bit(PG_dcache_clean, &folio->flags))
|
||||
if (!test_and_set_bit(PG_dcache_clean, &folio->flags.f))
|
||||
__flush_dcache_folio(mapping, folio);
|
||||
if (mapping) {
|
||||
if (cache_is_vivt())
|
||||
|
||||
+5
-5
@@ -304,7 +304,7 @@ void __sync_icache_dcache(pte_t pteval)
|
||||
else
|
||||
mapping = NULL;
|
||||
|
||||
if (!test_and_set_bit(PG_dcache_clean, &folio->flags))
|
||||
if (!test_and_set_bit(PG_dcache_clean, &folio->flags.f))
|
||||
__flush_dcache_folio(mapping, folio);
|
||||
|
||||
if (pte_exec(pteval))
|
||||
@@ -343,8 +343,8 @@ void flush_dcache_folio(struct folio *folio)
|
||||
return;
|
||||
|
||||
if (!cache_ops_need_broadcast() && cache_is_vipt_nonaliasing()) {
|
||||
if (test_bit(PG_dcache_clean, &folio->flags))
|
||||
clear_bit(PG_dcache_clean, &folio->flags);
|
||||
if (test_bit(PG_dcache_clean, &folio->flags.f))
|
||||
clear_bit(PG_dcache_clean, &folio->flags.f);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -352,14 +352,14 @@ void flush_dcache_folio(struct folio *folio)
|
||||
|
||||
if (!cache_ops_need_broadcast() &&
|
||||
mapping && !folio_mapped(folio))
|
||||
clear_bit(PG_dcache_clean, &folio->flags);
|
||||
clear_bit(PG_dcache_clean, &folio->flags.f);
|
||||
else {
|
||||
__flush_dcache_folio(mapping, folio);
|
||||
if (mapping && cache_is_vivt())
|
||||
__flush_dcache_aliases(mapping, folio);
|
||||
else if (mapping)
|
||||
__flush_icache_all();
|
||||
set_bit(PG_dcache_clean, &folio->flags);
|
||||
set_bit(PG_dcache_clean, &folio->flags.f);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(flush_dcache_folio);
|
||||
|
||||
@@ -21,12 +21,12 @@ extern bool arch_hugetlb_migration_supported(struct hstate *h);
|
||||
|
||||
static inline void arch_clear_hugetlb_flags(struct folio *folio)
|
||||
{
|
||||
clear_bit(PG_dcache_clean, &folio->flags);
|
||||
clear_bit(PG_dcache_clean, &folio->flags.f);
|
||||
|
||||
#ifdef CONFIG_ARM64_MTE
|
||||
if (system_supports_mte()) {
|
||||
clear_bit(PG_mte_tagged, &folio->flags);
|
||||
clear_bit(PG_mte_lock, &folio->flags);
|
||||
clear_bit(PG_mte_tagged, &folio->flags.f);
|
||||
clear_bit(PG_mte_lock, &folio->flags.f);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -48,12 +48,12 @@ static inline void set_page_mte_tagged(struct page *page)
|
||||
* before the page flags update.
|
||||
*/
|
||||
smp_wmb();
|
||||
set_bit(PG_mte_tagged, &page->flags);
|
||||
set_bit(PG_mte_tagged, &page->flags.f);
|
||||
}
|
||||
|
||||
static inline bool page_mte_tagged(struct page *page)
|
||||
{
|
||||
bool ret = test_bit(PG_mte_tagged, &page->flags);
|
||||
bool ret = test_bit(PG_mte_tagged, &page->flags.f);
|
||||
|
||||
VM_WARN_ON_ONCE(folio_test_hugetlb(page_folio(page)));
|
||||
|
||||
@@ -82,7 +82,7 @@ static inline bool try_page_mte_tagging(struct page *page)
|
||||
{
|
||||
VM_WARN_ON_ONCE(folio_test_hugetlb(page_folio(page)));
|
||||
|
||||
if (!test_and_set_bit(PG_mte_lock, &page->flags))
|
||||
if (!test_and_set_bit(PG_mte_lock, &page->flags.f))
|
||||
return true;
|
||||
|
||||
/*
|
||||
@@ -90,7 +90,7 @@ static inline bool try_page_mte_tagging(struct page *page)
|
||||
* already. Check if the PG_mte_tagged flag has been set or wait
|
||||
* otherwise.
|
||||
*/
|
||||
smp_cond_load_acquire(&page->flags, VAL & (1UL << PG_mte_tagged));
|
||||
smp_cond_load_acquire(&page->flags.f, VAL & (1UL << PG_mte_tagged));
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -173,13 +173,13 @@ static inline void folio_set_hugetlb_mte_tagged(struct folio *folio)
|
||||
* before the folio flags update.
|
||||
*/
|
||||
smp_wmb();
|
||||
set_bit(PG_mte_tagged, &folio->flags);
|
||||
set_bit(PG_mte_tagged, &folio->flags.f);
|
||||
|
||||
}
|
||||
|
||||
static inline bool folio_test_hugetlb_mte_tagged(struct folio *folio)
|
||||
{
|
||||
bool ret = test_bit(PG_mte_tagged, &folio->flags);
|
||||
bool ret = test_bit(PG_mte_tagged, &folio->flags.f);
|
||||
|
||||
VM_WARN_ON_ONCE(!folio_test_hugetlb(folio));
|
||||
|
||||
@@ -196,7 +196,7 @@ static inline bool folio_try_hugetlb_mte_tagging(struct folio *folio)
|
||||
{
|
||||
VM_WARN_ON_ONCE(!folio_test_hugetlb(folio));
|
||||
|
||||
if (!test_and_set_bit(PG_mte_lock, &folio->flags))
|
||||
if (!test_and_set_bit(PG_mte_lock, &folio->flags.f))
|
||||
return true;
|
||||
|
||||
/*
|
||||
@@ -204,7 +204,7 @@ static inline bool folio_try_hugetlb_mte_tagging(struct folio *folio)
|
||||
* already. Check if the PG_mte_tagged flag has been set or wait
|
||||
* otherwise.
|
||||
*/
|
||||
smp_cond_load_acquire(&folio->flags, VAL & (1UL << PG_mte_tagged));
|
||||
smp_cond_load_acquire(&folio->flags.f, VAL & (1UL << PG_mte_tagged));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -53,11 +53,11 @@ void __sync_icache_dcache(pte_t pte)
|
||||
{
|
||||
struct folio *folio = page_folio(pte_page(pte));
|
||||
|
||||
if (!test_bit(PG_dcache_clean, &folio->flags)) {
|
||||
if (!test_bit(PG_dcache_clean, &folio->flags.f)) {
|
||||
sync_icache_aliases((unsigned long)folio_address(folio),
|
||||
(unsigned long)folio_address(folio) +
|
||||
folio_size(folio));
|
||||
set_bit(PG_dcache_clean, &folio->flags);
|
||||
set_bit(PG_dcache_clean, &folio->flags.f);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__sync_icache_dcache);
|
||||
@@ -69,8 +69,8 @@ EXPORT_SYMBOL_GPL(__sync_icache_dcache);
|
||||
*/
|
||||
void flush_dcache_folio(struct folio *folio)
|
||||
{
|
||||
if (test_bit(PG_dcache_clean, &folio->flags))
|
||||
clear_bit(PG_dcache_clean, &folio->flags);
|
||||
if (test_bit(PG_dcache_clean, &folio->flags.f))
|
||||
clear_bit(PG_dcache_clean, &folio->flags.f);
|
||||
}
|
||||
EXPORT_SYMBOL(flush_dcache_folio);
|
||||
|
||||
|
||||
@@ -25,12 +25,12 @@ void flush_dcache_folio(struct folio *folio)
|
||||
mapping = folio_flush_mapping(folio);
|
||||
|
||||
if (mapping && !folio_mapped(folio))
|
||||
clear_bit(PG_dcache_clean, &folio->flags);
|
||||
clear_bit(PG_dcache_clean, &folio->flags.f);
|
||||
else {
|
||||
dcache_wbinv_all();
|
||||
if (mapping)
|
||||
icache_inv_all();
|
||||
set_bit(PG_dcache_clean, &folio->flags);
|
||||
set_bit(PG_dcache_clean, &folio->flags.f);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(flush_dcache_folio);
|
||||
@@ -56,7 +56,7 @@ void update_mmu_cache_range(struct vm_fault *vmf, struct vm_area_struct *vma,
|
||||
return;
|
||||
|
||||
folio = page_folio(pfn_to_page(pfn));
|
||||
if (!test_and_set_bit(PG_dcache_clean, &folio->flags))
|
||||
if (!test_and_set_bit(PG_dcache_clean, &folio->flags.f))
|
||||
dcache_wbinv_all();
|
||||
|
||||
if (folio_flush_mapping(folio)) {
|
||||
|
||||
@@ -37,11 +37,11 @@
|
||||
#define PG_dcache_dirty PG_arch_1
|
||||
|
||||
#define folio_test_dcache_dirty(folio) \
|
||||
test_bit(PG_dcache_dirty, &(folio)->flags)
|
||||
test_bit(PG_dcache_dirty, &(folio)->flags.f)
|
||||
#define folio_set_dcache_dirty(folio) \
|
||||
set_bit(PG_dcache_dirty, &(folio)->flags)
|
||||
set_bit(PG_dcache_dirty, &(folio)->flags.f)
|
||||
#define folio_clear_dcache_dirty(folio) \
|
||||
clear_bit(PG_dcache_dirty, &(folio)->flags)
|
||||
clear_bit(PG_dcache_dirty, &(folio)->flags.f)
|
||||
|
||||
extern void (*flush_cache_all)(void);
|
||||
extern void (*__flush_cache_all)(void);
|
||||
|
||||
@@ -187,7 +187,7 @@ void flush_dcache_folio(struct folio *folio)
|
||||
|
||||
/* Flush this page if there are aliases. */
|
||||
if (mapping && !mapping_mapped(mapping)) {
|
||||
clear_bit(PG_dcache_clean, &folio->flags);
|
||||
clear_bit(PG_dcache_clean, &folio->flags.f);
|
||||
} else {
|
||||
__flush_dcache_folio(folio);
|
||||
if (mapping) {
|
||||
@@ -195,7 +195,7 @@ void flush_dcache_folio(struct folio *folio)
|
||||
flush_aliases(mapping, folio);
|
||||
flush_icache_range(start, start + folio_size(folio));
|
||||
}
|
||||
set_bit(PG_dcache_clean, &folio->flags);
|
||||
set_bit(PG_dcache_clean, &folio->flags.f);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(flush_dcache_folio);
|
||||
@@ -227,7 +227,7 @@ void update_mmu_cache_range(struct vm_fault *vmf, struct vm_area_struct *vma,
|
||||
return;
|
||||
|
||||
folio = page_folio(pfn_to_page(pfn));
|
||||
if (!test_and_set_bit(PG_dcache_clean, &folio->flags))
|
||||
if (!test_and_set_bit(PG_dcache_clean, &folio->flags.f))
|
||||
__flush_dcache_folio(folio);
|
||||
|
||||
mapping = folio_flush_mapping(folio);
|
||||
|
||||
@@ -75,7 +75,7 @@ static inline void sync_icache_dcache(struct page *page)
|
||||
|
||||
static inline void flush_dcache_folio(struct folio *folio)
|
||||
{
|
||||
clear_bit(PG_dc_clean, &folio->flags);
|
||||
clear_bit(PG_dc_clean, &folio->flags.f);
|
||||
}
|
||||
#define flush_dcache_folio flush_dcache_folio
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ void update_cache(struct vm_area_struct *vma, unsigned long address,
|
||||
{
|
||||
unsigned long pfn = pte_val(*pte) >> PAGE_SHIFT;
|
||||
struct folio *folio = page_folio(pfn_to_page(pfn));
|
||||
int dirty = !test_and_set_bit(PG_dc_clean, &folio->flags);
|
||||
int dirty = !test_and_set_bit(PG_dc_clean, &folio->flags.f);
|
||||
|
||||
/*
|
||||
* Since icaches do not snoop for updated data on OpenRISC, we
|
||||
|
||||
@@ -122,10 +122,10 @@ void __update_cache(pte_t pte)
|
||||
pfn = folio_pfn(folio);
|
||||
nr = folio_nr_pages(folio);
|
||||
if (folio_flush_mapping(folio) &&
|
||||
test_bit(PG_dcache_dirty, &folio->flags)) {
|
||||
test_bit(PG_dcache_dirty, &folio->flags.f)) {
|
||||
while (nr--)
|
||||
flush_kernel_dcache_page_addr(pfn_va(pfn + nr));
|
||||
clear_bit(PG_dcache_dirty, &folio->flags);
|
||||
clear_bit(PG_dcache_dirty, &folio->flags.f);
|
||||
} else if (parisc_requires_coherency())
|
||||
while (nr--)
|
||||
flush_kernel_dcache_page_addr(pfn_va(pfn + nr));
|
||||
@@ -481,7 +481,7 @@ void flush_dcache_folio(struct folio *folio)
|
||||
pgoff_t pgoff;
|
||||
|
||||
if (mapping && !mapping_mapped(mapping)) {
|
||||
set_bit(PG_dcache_dirty, &folio->flags);
|
||||
set_bit(PG_dcache_dirty, &folio->flags.f);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -40,8 +40,8 @@ static inline void flush_dcache_folio(struct folio *folio)
|
||||
if (cpu_has_feature(CPU_FTR_COHERENT_ICACHE))
|
||||
return;
|
||||
/* avoid an atomic op if possible */
|
||||
if (test_bit(PG_dcache_clean, &folio->flags))
|
||||
clear_bit(PG_dcache_clean, &folio->flags);
|
||||
if (test_bit(PG_dcache_clean, &folio->flags.f))
|
||||
clear_bit(PG_dcache_clean, &folio->flags.f);
|
||||
}
|
||||
#define flush_dcache_folio flush_dcache_folio
|
||||
|
||||
|
||||
@@ -939,9 +939,9 @@ static inline void kvmppc_mmu_flush_icache(kvm_pfn_t pfn)
|
||||
|
||||
/* Clear i-cache for new pages */
|
||||
folio = page_folio(pfn_to_page(pfn));
|
||||
if (!test_bit(PG_dcache_clean, &folio->flags)) {
|
||||
if (!test_bit(PG_dcache_clean, &folio->flags.f)) {
|
||||
flush_dcache_icache_folio(folio);
|
||||
set_bit(PG_dcache_clean, &folio->flags);
|
||||
set_bit(PG_dcache_clean, &folio->flags.f);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user