Commit c3f2d783 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'mm-hotfixes-stable-2024-08-17-19-34' of...

Merge tag 'mm-hotfixes-stable-2024-08-17-19-34' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm

Pull misc fixes from Andrew Morton:
 "16 hotfixes. All except one are for MM. 10 of these are cc:stable and
  the others pertain to post-6.10 issues.

  As usual with these merges, singletons and doubletons all over the
  place, no identifiable-by-me theme. Please see the lovingly curated
  changelogs to get the skinny"

* tag 'mm-hotfixes-stable-2024-08-17-19-34' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm:
  mm/migrate: fix deadlock in migrate_pages_batch() on large folios
  alloc_tag: mark pages reserved during CMA activation as not tagged
  alloc_tag: introduce clear_page_tag_ref() helper function
  crash: fix riscv64 crash memory reserve dead loop
  selftests: memfd_secret: don't build memfd_secret test on unsupported arches
  mm: fix endless reclaim on machines with unaccepted memory
  selftests/mm: compaction_test: fix off by one in check_compaction()
  mm/numa: no task_numa_fault() call if PMD is changed
  mm/numa: no task_numa_fault() call if PTE is changed
  mm/vmalloc: fix page mapping if vm_area_alloc_pages() with high order fallback to order 0
  mm/memory-failure: use raw_spinlock_t in struct memory_failure_cpu
  mm: don't account memmap per-node
  mm: add system wide stats items category
  mm: don't account memmap on failure
  mm/hugetlb: fix hugetlb vs. core-mm PT locking
  mseal: fix is_madv_discard()
parents 810996a3 2e6506e1
Loading
Loading
Loading
Loading
+30 −3
Original line number Diff line number Diff line
@@ -944,10 +944,37 @@ static inline bool htlb_allow_alloc_fallback(int reason)
static inline spinlock_t *huge_pte_lockptr(struct hstate *h,
					   struct mm_struct *mm, pte_t *pte)
{
	if (huge_page_size(h) == PMD_SIZE)
	const unsigned long size = huge_page_size(h);

	VM_WARN_ON(size == PAGE_SIZE);

	/*
	 * hugetlb must use the exact same PT locks as core-mm page table
	 * walkers would. When modifying a PTE table, hugetlb must take the
	 * PTE PT lock, when modifying a PMD table, hugetlb must take the PMD
	 * PT lock etc.
	 *
	 * The expectation is that any hugetlb folio smaller than a PMD is
	 * always mapped into a single PTE table and that any hugetlb folio
	 * smaller than a PUD (but at least as big as a PMD) is always mapped
	 * into a single PMD table.
	 *
	 * If that does not hold for an architecture, then that architecture
	 * must disable split PT locks such that all *_lockptr() functions
	 * will give us the same result: the per-MM PT lock.
	 *
	 * Note that with e.g., CONFIG_PGTABLE_LEVELS=2 where
	 * PGDIR_SIZE==P4D_SIZE==PUD_SIZE==PMD_SIZE, we'd use pud_lockptr()
	 * and core-mm would use pmd_lockptr(). However, in such configurations
	 * split PMD locks are disabled -- they don't make sense on a single
	 * PGDIR page table -- and the end result is the same.
	 */
	if (size >= PUD_SIZE)
		return pud_lockptr(mm, (pud_t *) pte);
	else if (size >= PMD_SIZE || IS_ENABLED(CONFIG_HIGHPTE))
		return pmd_lockptr(mm, (pmd_t *) pte);
	VM_BUG_ON(huge_page_size(h) == PAGE_SIZE);
	return &mm->page_table_lock;
	/* pte_alloc_huge() only applies with !CONFIG_HIGHPTE */
	return ptep_lockptr(mm, pte);
}

#ifndef hugepages_supported
+11 −0
Original line number Diff line number Diff line
@@ -2920,6 +2920,13 @@ static inline spinlock_t *pte_lockptr(struct mm_struct *mm, pmd_t *pmd)
	return ptlock_ptr(page_ptdesc(pmd_page(*pmd)));
}

static inline spinlock_t *ptep_lockptr(struct mm_struct *mm, pte_t *pte)
{
	BUILD_BUG_ON(IS_ENABLED(CONFIG_HIGHPTE));
	BUILD_BUG_ON(MAX_PTRS_PER_PTE * sizeof(pte_t) > PAGE_SIZE);
	return ptlock_ptr(virt_to_ptdesc(pte));
}

static inline bool ptlock_init(struct ptdesc *ptdesc)
{
	/*
@@ -2944,6 +2951,10 @@ static inline spinlock_t *pte_lockptr(struct mm_struct *mm, pmd_t *pmd)
{
	return &mm->page_table_lock;
}
static inline spinlock_t *ptep_lockptr(struct mm_struct *mm, pte_t *pte)
{
	return &mm->page_table_lock;
}
static inline void ptlock_cache_init(void) {}
static inline bool ptlock_init(struct ptdesc *ptdesc) { return true; }
static inline void ptlock_free(struct ptdesc *ptdesc) {}
+0 −2
Original line number Diff line number Diff line
@@ -220,8 +220,6 @@ enum node_stat_item {
	PGDEMOTE_KSWAPD,
	PGDEMOTE_DIRECT,
	PGDEMOTE_KHUGEPAGED,
	NR_MEMMAP, /* page metadata allocated through buddy allocator */
	NR_MEMMAP_BOOT, /* page metadata allocated through boot allocator */
	NR_VM_NODE_STAT_ITEMS
};

+13 −0
Original line number Diff line number Diff line
@@ -43,6 +43,18 @@ static inline void put_page_tag_ref(union codetag_ref *ref)
	page_ext_put(page_ext_from_codetag_ref(ref));
}

static inline void clear_page_tag_ref(struct page *page)
{
	if (mem_alloc_profiling_enabled()) {
		union codetag_ref *ref = get_page_tag_ref(page);

		if (ref) {
			set_codetag_empty(ref);
			put_page_tag_ref(ref);
		}
	}
}

static inline void pgalloc_tag_add(struct page *page, struct task_struct *task,
				   unsigned int nr)
{
@@ -126,6 +138,7 @@ static inline void pgalloc_tag_sub_pages(struct alloc_tag *tag, unsigned int nr)

static inline union codetag_ref *get_page_tag_ref(struct page *page) { return NULL; }
static inline void put_page_tag_ref(union codetag_ref *ref) {}
static inline void clear_page_tag_ref(struct page *page) {}
static inline void pgalloc_tag_add(struct page *page, struct task_struct *task,
				   unsigned int nr) {}
static inline void pgalloc_tag_sub(struct page *page, unsigned int nr) {}
+8 −14
Original line number Diff line number Diff line
@@ -34,10 +34,13 @@ struct reclaim_stat {
	unsigned nr_lazyfree_fail;
};

enum writeback_stat_item {
/* Stat data for system wide items */
enum vm_stat_item {
	NR_DIRTY_THRESHOLD,
	NR_DIRTY_BG_THRESHOLD,
	NR_VM_WRITEBACK_STAT_ITEMS,
	NR_MEMMAP_PAGES,	/* page metadata allocated through buddy allocator */
	NR_MEMMAP_BOOT_PAGES,	/* page metadata allocated through boot allocator */
	NR_VM_STAT_ITEMS,
};

#ifdef CONFIG_VM_EVENT_COUNTERS
@@ -514,21 +517,13 @@ static inline const char *lru_list_name(enum lru_list lru)
	return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
}

static inline const char *writeback_stat_name(enum writeback_stat_item item)
{
	return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
			   NR_VM_NUMA_EVENT_ITEMS +
			   NR_VM_NODE_STAT_ITEMS +
			   item];
}

#if defined(CONFIG_VM_EVENT_COUNTERS) || defined(CONFIG_MEMCG)
static inline const char *vm_event_name(enum vm_event_item item)
{
	return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
			   NR_VM_NUMA_EVENT_ITEMS +
			   NR_VM_NODE_STAT_ITEMS +
			   NR_VM_WRITEBACK_STAT_ITEMS +
			   NR_VM_STAT_ITEMS +
			   item];
}
#endif /* CONFIG_VM_EVENT_COUNTERS || CONFIG_MEMCG */
@@ -625,7 +620,6 @@ static inline void lruvec_stat_sub_folio(struct folio *folio,
	lruvec_stat_mod_folio(folio, idx, -folio_nr_pages(folio));
}

void __meminit mod_node_early_perpage_metadata(int nid, long delta);
void __meminit store_early_perpage_metadata(void);

void memmap_boot_pages_add(long delta);
void memmap_pages_add(long delta);
#endif /* _LINUX_VMSTAT_H */
Loading