Files
Michael Bestas f36e8c975f mm: Squashed revert of MGLRU backports
We have previously disabled MGLRU in defconfig, but now the actual
changes are causing conflicts with upstream kernel and breaking the
build. Rip out motorola's backports to fix it.

Revert "mm:vmscan:Update the page scan prioritiy"

This reverts commit edb74fec61.

Revert "mm: mglru fix on qcom baseline"

This reverts commit dc9d750ffe.

Revert "FROMLIST: mm: multi-gen LRU: design doc"

This reverts commit d3d2daf25e.

Revert "FROMLIST: mm: multi-gen LRU: admin guide"

This reverts commit a764ce0e0e.

Revert "FROMLIST: mm: multi-gen LRU: debugfs interface"

This reverts commit 0ed1bd23b9.

Revert "FROMLIST: mm: multi-gen LRU: thrashing prevention"

This reverts commit 73bbccfe48.

Revert "FROMLIST: mm: multi-gen LRU: kill switch"

This reverts commit a9ef9de5f8.

Revert "FROMLIST: mm: multi-gen LRU: optimize multiple memcgs"

This reverts commit 834be483c2.

Revert "FROMLIST: mm: multi-gen LRU: support page table walks"

This reverts commit 40f2a1fb74.

Revert "FROMLIST: mm: multi-gen LRU: exploit locality in rmap"

This reverts commit 6ad1e20b6f.

Revert "FROMLIST: mm: multi-gen LRU: minimal implementation"

This reverts commit 6a1feddd23.

Revert "FROMLIST: mm: multi-gen LRU: groundwork"

This reverts commit 81b0532ae5.

Revert "FROMLIST: mm: x86: add CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG"

This reverts commit 62f7a9e8c9.

Revert "FROMLIST: mm: x86, arm64: add arch_has_hw_pte_young()"

This reverts commit d024618471.

Revert "BACKPORT: include/linux/mm_inline.h: fold page_lru_base_type() into its sole caller"

This reverts commit d527bf664c.

Revert "UPSTREAM: mm: VM_BUG_ON lru page flags"

This reverts commit 044fa650a0.

Revert "BACKPORT: mm: add __clear_page_lru_flags() to replace page_off_lru()"

This reverts commit 7bb98cd997.

Revert "BACKPORT: mm/swap.c: don't pass "enum lru_list" to del_page_from_lru_list()"

This reverts commit d2b8328404.

Revert "UPSTREAM: mm/swap.c: don't pass "enum lru_list" to trace_mm_lru_insertion()"

This reverts commit 73deefe8e0.

Revert "BACKPORT: mm: don't pass "enum lru_list" to lru list addition functions"

This reverts commit cf21693b5f.

Revert "BACKPORT: include/linux/mm_inline.h: shuffle lru list addition and deletion functions"

This reverts commit 146fe87b58.

Revert "BACKPORT: mm/vmscan.c: use add_page_to_lru_list()"

This reverts commit f2635ff884.

Revert "BACKPORT: mm: use self-explanatory macros rather than "2""

This reverts commit 2acc85af94.

Revert "BACKPORT: mm: remove superfluous __ClearPageActive()"

This reverts commit 9a5dbac637.

Revert "BACKPORT: mm/swapcache: support to handle the shadow entries"

This reverts commit 41f9ce4a59.

Revert "UPSTREAM: mm/vmscan.c: use update_lru_size() in update_lru_sizes()"

This reverts commit 9cce3ee5a3.

Revert "UPSTREAM: arm64: cpufeature: introduce helper cpu_has_hw_af()"

This reverts commit 7360b99ad2.

Revert "UPSTREAM: mm: replace list_move_tail() with add_page_to_lru_list_tail()"

This reverts commit f1e989bead.

Change-Id: I21068ef69f87d4596efc7858882e2726a57e85ec
2026-08-15 19:16:50 +03:00

193 lines
4.8 KiB
C

/*
* mm_init.c - Memory initialisation verification and debugging
*
* Copyright 2008 IBM Corporation, 2008
* Author Mel Gorman <mel@csn.ul.ie>
*
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/kobject.h>
#include <linux/export.h>
#include <linux/memory.h>
#include <linux/notifier.h>
#include <linux/sched.h>
#include "internal.h"
#ifdef CONFIG_DEBUG_MEMORY_INIT
int __meminitdata mminit_loglevel;
#ifndef SECTIONS_SHIFT
#define SECTIONS_SHIFT 0
#endif
/* The zonelists are simply reported, validation is manual. */
void __init mminit_verify_zonelist(void)
{
int nid;
if (mminit_loglevel < MMINIT_VERIFY)
return;
for_each_online_node(nid) {
pg_data_t *pgdat = NODE_DATA(nid);
struct zone *zone;
struct zoneref *z;
struct zonelist *zonelist;
int i, listid, zoneid;
BUG_ON(MAX_ZONELISTS > 2);
for (i = 0; i < MAX_ZONELISTS * MAX_NR_ZONES; i++) {
/* Identify the zone and nodelist */
zoneid = i % MAX_NR_ZONES;
listid = i / MAX_NR_ZONES;
zonelist = &pgdat->node_zonelists[listid];
zone = &pgdat->node_zones[zoneid];
if (!populated_zone(zone))
continue;
/* Print information about the zonelist */
printk(KERN_DEBUG "mminit::zonelist %s %d:%s = ",
listid > 0 ? "thisnode" : "general", nid,
zone->name);
/* Iterate the zonelist */
for_each_zone_zonelist(zone, z, zonelist, zoneid)
pr_cont("%d:%s ", zone_to_nid(zone), zone->name);
pr_cont("\n");
}
}
}
void __init mminit_verify_pageflags_layout(void)
{
int shift, width;
unsigned long or_mask, add_mask;
shift = 8 * sizeof(unsigned long);
width = shift - SECTIONS_WIDTH - NODES_WIDTH - ZONES_WIDTH - LAST_CPUPID_SHIFT;
mminit_dprintk(MMINIT_TRACE, "pageflags_layout_widths",
"Section %d Node %d Zone %d Lastcpupid %d Flags %d\n",
SECTIONS_WIDTH,
NODES_WIDTH,
ZONES_WIDTH,
LAST_CPUPID_WIDTH,
NR_PAGEFLAGS);
mminit_dprintk(MMINIT_TRACE, "pageflags_layout_shifts",
"Section %d Node %d Zone %d Lastcpupid %d\n",
SECTIONS_SHIFT,
NODES_SHIFT,
ZONES_SHIFT,
LAST_CPUPID_SHIFT);
mminit_dprintk(MMINIT_TRACE, "pageflags_layout_pgshifts",
"Section %lu Node %lu Zone %lu Lastcpupid %lu\n",
(unsigned long)SECTIONS_PGSHIFT,
(unsigned long)NODES_PGSHIFT,
(unsigned long)ZONES_PGSHIFT,
(unsigned long)LAST_CPUPID_PGSHIFT);
mminit_dprintk(MMINIT_TRACE, "pageflags_layout_nodezoneid",
"Node/Zone ID: %lu -> %lu\n",
(unsigned long)(ZONEID_PGOFF + ZONEID_SHIFT),
(unsigned long)ZONEID_PGOFF);
mminit_dprintk(MMINIT_TRACE, "pageflags_layout_usage",
"location: %d -> %d layout %d -> %d unused %d -> %d page-flags\n",
shift, width, width, NR_PAGEFLAGS, NR_PAGEFLAGS, 0);
#ifdef NODE_NOT_IN_PAGE_FLAGS
mminit_dprintk(MMINIT_TRACE, "pageflags_layout_nodeflags",
"Node not in page flags");
#endif
#ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS
mminit_dprintk(MMINIT_TRACE, "pageflags_layout_nodeflags",
"Last cpupid not in page flags");
#endif
if (SECTIONS_WIDTH) {
shift -= SECTIONS_WIDTH;
BUG_ON(shift != SECTIONS_PGSHIFT);
}
if (NODES_WIDTH) {
shift -= NODES_WIDTH;
BUG_ON(shift != NODES_PGSHIFT);
}
if (ZONES_WIDTH) {
shift -= ZONES_WIDTH;
BUG_ON(shift != ZONES_PGSHIFT);
}
/* Check for bitmask overlaps */
or_mask = (ZONES_MASK << ZONES_PGSHIFT) |
(NODES_MASK << NODES_PGSHIFT) |
(SECTIONS_MASK << SECTIONS_PGSHIFT);
add_mask = (ZONES_MASK << ZONES_PGSHIFT) +
(NODES_MASK << NODES_PGSHIFT) +
(SECTIONS_MASK << SECTIONS_PGSHIFT);
BUG_ON(or_mask != add_mask);
}
static __init int set_mminit_loglevel(char *str)
{
get_option(&str, &mminit_loglevel);
return 0;
}
early_param("mminit_loglevel", set_mminit_loglevel);
#endif /* CONFIG_DEBUG_MEMORY_INIT */
struct kobject *mm_kobj;
EXPORT_SYMBOL_GPL(mm_kobj);
#ifdef CONFIG_SMP
s32 vm_committed_as_batch = 32;
static void __meminit mm_compute_batch(void)
{
u64 memsized_batch;
s32 nr = num_present_cpus();
s32 batch = max_t(s32, nr*2, 32);
/* batch size set to 0.4% of (total memory/#cpus), or max int32 */
memsized_batch = min_t(u64, (totalram_pages/nr)/256, 0x7fffffff);
vm_committed_as_batch = max_t(s32, memsized_batch, batch);
}
static int __meminit mm_compute_batch_notifier(struct notifier_block *self,
unsigned long action, void *arg)
{
switch (action) {
case MEM_ONLINE:
case MEM_OFFLINE:
mm_compute_batch();
default:
break;
}
return NOTIFY_OK;
}
static struct notifier_block compute_batch_nb __meminitdata = {
.notifier_call = mm_compute_batch_notifier,
.priority = IPC_CALLBACK_PRI, /* use lowest priority */
};
static int __init mm_compute_batch_init(void)
{
mm_compute_batch();
register_hotmemory_notifier(&compute_batch_nb);
return 0;
}
__initcall(mm_compute_batch_init);
#endif
static int __init mm_sysfs_init(void)
{
mm_kobj = kobject_create_and_add("mm", kernel_kobj);
if (!mm_kobj)
return -ENOMEM;
return 0;
}
postcore_initcall(mm_sysfs_init);