# SPDX-License-Identifier: GPL-2.0-only

menu "Memory Management options"

#
# For some reason microblaze and nios2 hard code SWAP=n.  Hopefully we can
# add proper SWAP support to them, in which case this can be remove.
#
config ARCH_NO_SWAP
	bool

menuconfig SWAP
	bool "Support for paging of anonymous memory (swap)"
	depends on MMU && BLOCK && !ARCH_NO_SWAP
	default y
	help
	  This option allows you to choose whether you want to have support
	  for so called swap devices or swap files in your kernel that are
	  used to provide more virtual memory than the actual RAM present
	  in your computer.  If unsure say Y.

config ZSWAP
	bool "Compressed cache for swap pages"
	depends on SWAP
	select CRYPTO
	select ZSMALLOC
	help
	  A lightweight compressed cache for swap pages.  It takes
	  pages that are in the process of being swapped out and attempts to
	  compress them into a dynamically allocated RAM-based memory pool.
	  This can result in a significant I/O reduction on swap device and,
	  in the case where decompressing from RAM is faster than swap device
	  reads, can also improve workload performance.

config ZSWAP_DEFAULT_ON
	bool "Enable the compressed cache for swap pages by default"
	depends on ZSWAP
	help
	  If selected, the compressed cache for swap pages will be enabled
	  at boot, otherwise it will be disabled.

	  The selection made here can be overridden by using the kernel
	  command line 'zswap.enabled=' option.

config ZSWAP_SHRINKER_DEFAULT_ON
	bool "Shrink the zswap pool on memory pressure"
	depends on ZSWAP
	default n
	help
	  If selected, the zswap shrinker will be enabled, and the pages
	  stored in the zswap pool will become available for reclaim (i.e
	  written back to the backing swap device) on memory pressure.

	  This means that zswap writeback could happen even if the pool is
	  not yet full, or the cgroup zswap limit has not been reached,
	  reducing the chance that cold pages will reside in the zswap pool
	  and consume memory indefinitely.

choice
	prompt "Default compressor"
	depends on ZSWAP
	default ZSWAP_COMPRESSOR_DEFAULT_LZO
	help
	  Selects the default compression algorithm for the compressed cache
	  for swap pages.

	  For an overview what kind of performance can be expected from
	  a particular compression algorithm please refer to the benchmarks
	  available at the following LWN page:
	  https://lwn.net/Articles/751795/

	  If in doubt, select 'LZO'.

	  The selection made here can be overridden by using the kernel
	  command line 'zswap.compressor=' option.

config ZSWAP_COMPRESSOR_DEFAULT_DEFLATE
	bool "Deflate"
	select CRYPTO_DEFLATE
	help
	  Use the Deflate algorithm as the default compression algorithm.

config ZSWAP_COMPRESSOR_DEFAULT_LZO
	bool "LZO"
	select CRYPTO_LZO
	help
	  Use the LZO algorithm as the default compression algorithm.

config ZSWAP_COMPRESSOR_DEFAULT_842
	bool "842"
	select CRYPTO_842
	help
	  Use the 842 algorithm as the default compression algorithm.

config ZSWAP_COMPRESSOR_DEFAULT_LZ4
	bool "LZ4"
	select CRYPTO_LZ4
	help
	  Use the LZ4 algorithm as the default compression algorithm.

config ZSWAP_COMPRESSOR_DEFAULT_LZ4HC
	bool "LZ4HC"
	select CRYPTO_LZ4HC
	help
	  Use the LZ4HC algorithm as the default compression algorithm.

config ZSWAP_COMPRESSOR_DEFAULT_ZSTD
	bool "zstd"
	select CRYPTO_ZSTD
	help
	  Use the zstd algorithm as the default compression algorithm.
endchoice

config ZSWAP_COMPRESSOR_DEFAULT
       string
       depends on ZSWAP
       default "deflate" if ZSWAP_COMPRESSOR_DEFAULT_DEFLATE
       default "lzo" if ZSWAP_COMPRESSOR_DEFAULT_LZO
       default "842" if ZSWAP_COMPRESSOR_DEFAULT_842
       default "lz4" if ZSWAP_COMPRESSOR_DEFAULT_LZ4
       default "lz4hc" if ZSWAP_COMPRESSOR_DEFAULT_LZ4HC
       default "zstd" if ZSWAP_COMPRESSOR_DEFAULT_ZSTD
       default ""

config ZSMALLOC
	tristate

menu "Zsmalloc allocator options"
	depends on ZSMALLOC

comment "Zsmalloc is a common backend allocator for zswap & zram"

config ZSMALLOC_STAT
	bool "Export zsmalloc statistics"
	select DEBUG_FS
	help
	  This option enables code in the zsmalloc to collect various
	  statistics about what's happening in zsmalloc and exports that
	  information to userspace via debugfs.
	  If unsure, say N.

config ZSMALLOC_CHAIN_SIZE
	int "Maximum number of physical pages per-zspage"
	default 8
	range 4 16
	help
	  This option sets the upper limit on the number of physical pages
	  that a zmalloc page (zspage) can consist of. The optimal zspage
	  chain size is calculated for each size class during the
	  initialization of the pool.

	  Changing this option can alter the characteristics of size classes,
	  such as the number of pages per zspage and the number of objects
	  per zspage. This can also result in different configurations of
	  the pool, as zsmalloc merges size classes with similar
	  characteristics.

	  For more information, see zsmalloc documentation.

endmenu

menu "Slab allocator options"

config SLUB
	def_bool y
	select IRQ_WORK

config KVFREE_RCU_BATCHED
	def_bool y
	depends on !SLUB_TINY && !TINY_RCU
	depends on !RCU_STRICT_GRACE_PERIOD

config SLUB_TINY
	bool "Configure for minimal memory footprint"
	depends on EXPERT && !COMPILE_TEST
	select SLAB_MERGE_DEFAULT
	help
	   Configures the slab allocator in a way to achieve minimal memory
	   footprint, sacrificing scalability, debugging and other features.
	   This is intended only for the smallest system that had used the
	   SLOB allocator and is not recommended for systems with more than
	   16MB RAM.

	   If unsure, say N.

config SLAB_MERGE_DEFAULT
	bool "Allow slab caches to be merged"
	default y
	help
	  For reduced kernel memory fragmentation, slab caches can be
	  merged when they share the same size and other characteristics.
	  This carries a risk of kernel heap overflows being able to
	  overwrite objects from merged caches (and more easily control
	  cache layout), which makes such heap attacks easier to exploit
	  by attackers. By keeping caches unmerged, these kinds of exploits
	  can usually only damage objects in the same cache. To disable
	  merging at runtime, "slab_nomerge" can be passed on the kernel
	  command line.

config SLAB_FREELIST_RANDOM
	bool "Randomize slab freelist"
	depends on !SLUB_TINY
	help
	  Randomizes the freelist order used on creating new pages. This
	  security feature reduces the predictability of the kernel slab
	  allocator against heap overflows.

config SLAB_FREELIST_HARDENED
	bool "Harden slab freelist metadata"
	depends on !SLUB_TINY
	help
	  Many kernel heap attacks try to target slab cache metadata and
	  other infrastructure. This options makes minor performance
	  sacrifices to harden the kernel slab allocator against common
	  freelist exploit methods.

config SLAB_BUCKETS
	bool "Support allocation from separate kmalloc buckets"
	depends on !SLUB_TINY
	default SLAB_FREELIST_HARDENED
	help
	  Kernel heap attacks frequently depend on being able to create
	  specifically-sized allocations with user-controlled contents
	  that will be allocated into the same kmalloc bucket as a
	  target object. To avoid sharing these allocation buckets,
	  provide an explicitly separated set of buckets to be used for
	  user-controlled allocations. This may very slightly increase
	  memory fragmentation, though in practice it's only a handful
	  of extra pages since the bulk of user-controlled allocations
	  are relatively long-lived.

	  If unsure, say Y.

config SLUB_STATS
	default n
	bool "Enable performance statistics"
	depends on SYSFS && !SLUB_TINY
	help
	  The statistics are useful to debug slab allocation behavior in
	  order find ways to optimize the allocator. This should never be
	  enabled for production use since keeping statistics slows down
	  the allocator by a few percentage points. The slabinfo command
	  supports the determination of the most active slabs to figure
	  out which slabs are relevant to a particular load.
	  Try running: slabinfo -DA

config KMALLOC_PARTITION_CACHES
	depends on !SLUB_TINY
	bool "Partitioned slab caches for normal kmalloc"
	default RANDOM_KMALLOC_CACHES
	help
	  A hardening feature that creates multiple isolated copies of slab
	  caches for normal kmalloc allocations. This makes it more difficult
	  to exploit memory-safety vulnerabilities by attacking vulnerable
	  co-located memory objects. Several modes are provided.

	  Currently the number of copies is set to 16, a reasonably large value
	  that effectively diverges the memory objects allocated for different
	  subsystems or modules into different caches, at the expense of a
	  limited degree of memory and CPU overhead that relates to hardware
	  and system workload.

choice
	prompt "Partitioned slab cache mode"
	depends on KMALLOC_PARTITION_CACHES
	default KMALLOC_PARTITION_TYPED if CC_HAS_ALLOC_TOKEN
	default KMALLOC_PARTITION_RANDOM
	help
	  Selects the slab cache partitioning mode.

config KMALLOC_PARTITION_RANDOM
	bool "Randomize slab caches for normal kmalloc"
	help
	  Randomly pick a slab cache based on code address and a per-boot
	  random seed.

	  This makes it harder for attackers to predict object co-location.
	  The placement is random: while attackers don't know which kmalloc
	  cache an object will be allocated from, they might circumvent
	  the randomization by retrying attacks across multiple machines until
	  the target objects are co-located.

config KMALLOC_PARTITION_TYPED
	bool "Type based slab cache selection for normal kmalloc"
	depends on CC_HAS_ALLOC_TOKEN
	help
	  Rely on Clang's allocation tokens to choose a slab cache, where token
	  IDs are derived from the allocated type.

	  Unlike KMALLOC_PARTITION_RANDOM, cache assignment is deterministic based
	  on type, which guarantees that objects of certain types are not
	  placed in the same cache. This effectively mitigates certain classes
	  of exploits that probabilistic defenses like KMALLOC_PARTITION_RANDOM
	  only make harder but not impossible. However, this also means the
	  cache assignment is predictable.

	  Clang's default token ID calculation returns a bounded hash with
	  disjoint ranges for pointer-containing and pointerless objects: when
	  used as the slab cache index, this prevents buffer overflows on
	  primitive buffers from directly corrupting pointer-containing
	  objects.

	  The current effectiveness of Clang's type inference can be judged by
	  -Rpass=alloc-token, which provides diagnostics where (after dead-code
	  elimination) type inference failed.

	  Requires Clang 22 or later.

endchoice

config RANDOM_KMALLOC_CACHES
	bool
	transitional
	help
	  Transitional config for migration to KMALLOC_PARTITION_CACHES.

endmenu # Slab allocator options

config SHUFFLE_PAGE_ALLOCATOR
	bool "Page allocator randomization"
	default SLAB_FREELIST_RANDOM && ACPI_NUMA
	help
	  Randomization of the page allocator improves the average
	  utilization of a direct-mapped memory-side-cache. See section
	  5.2.27 Heterogeneous Memory Attribute Table (HMAT) in the ACPI
	  6.2a specification for an example of how a platform advertises
	  the presence of a memory-side-cache. There are also incidental
	  security benefits as it reduces the predictability of page
	  allocations to compliment SLAB_FREELIST_RANDOM, but the
	  default granularity of shuffling on the MAX_PAGE_ORDER i.e, 10th
	  order of pages is selected based on cache utilization benefits
	  on x86.

	  While the randomization improves cache utilization it may
	  negatively impact workloads on platforms without a cache. For
	  this reason, by default, the randomization is not enabled even
	  if SHUFFLE_PAGE_ALLOCATOR=y. The randomization may be force enabled
	  with the 'page_alloc.shuffle' kernel command line parameter.

	  Say Y if unsure.

config COMPAT_BRK
	bool "Disable heap randomization"
	default y
	help
	  Randomizing heap placement makes heap exploits harder, but it
	  also breaks ancient binaries (including anything libc5 based).
	  This option changes the bootup default to heap randomization
	  disabled, and can be overridden at runtime by setting
	  /proc/sys/kernel/randomize_va_space to 2.

	  On non-ancient distros (post-2000 ones) N is usually a safe choice.

config MMAP_ALLOW_UNINITIALIZED
	bool "Allow mmapped anonymous memory to be uninitialized"
	depends on EXPERT && !MMU
	default n
	help
	  Normally, and according to the Linux spec, anonymous memory obtained
	  from mmap() has its contents cleared before it is passed to
	  userspace.  Enabling this config option allows you to request that
	  mmap() skip that if it is given an MAP_UNINITIALIZED flag, thus
	  providing a huge performance boost.  If this option is not enabled,
	  then the flag will be ignored.

	  This is taken advantage of by uClibc's malloc(), and also by
	  ELF-FDPIC binfmt's brk and stack allocator.

	  Because of the obvious security issues, this option should only be
	  enabled on embedded devices where you control what is run in
	  userspace.  Since that isn't generally a problem on no-MMU systems,
	  it is normally safe to say Y here.

	  See Documentation/admin-guide/mm/nommu-mmap.rst for more information.

config SELECT_MEMORY_MODEL
	def_bool y
	depends on ARCH_SELECT_MEMORY_MODEL

choice
	prompt "Memory model"
	depends on SELECT_MEMORY_MODEL
	default SPARSEMEM_MANUAL if ARCH_SPARSEMEM_DEFAULT
	default FLATMEM_MANUAL
	help
	  This option allows you to change some of the ways that
	  Linux manages its memory internally. Most users will
	  only have one option here selected by the architecture
	  configuration. This is normal.

config FLATMEM_MANUAL
	bool "Flat Memory"
	depends on !NUMA
	depends on !ARCH_SPARSEMEM_ENABLE || ARCH_FLATMEM_ENABLE
	help
	  This option is best suited for non-NUMA systems with
	  flat address space. The FLATMEM is the most efficient
	  system in terms of performance and resource consumption
	  and it is the best option for smaller systems.

	  For systems that have holes in their physical address
	  spaces and for features like NUMA and memory hotplug,
	  choose "Sparse Memory".

	  If unsure, choose this option (Flat Memory) over any other.

config SPARSEMEM_MANUAL
	bool "Sparse Memory"
	depends on ARCH_SPARSEMEM_ENABLE
	help
	  This will be the only option for some systems, including
	  memory hot-plug systems.  This is normal.

	  This option provides efficient support for systems with
	  holes is their physical address space and allows memory
	  hot-plug and hot-remove.

	  If unsure, choose "Flat Memory" over this option.

endchoice

config SPARSEMEM
	def_bool y
	depends on (!SELECT_MEMORY_MODEL && ARCH_SPARSEMEM_ENABLE) || SPARSEMEM_MANUAL

config FLATMEM
	def_bool y
	depends on !NUMA
	depends on !SPARSEMEM || FLATMEM_MANUAL

#
# SPARSEMEM_EXTREME (which is the default) does some bootmem
# allocations when sparse_init() is called.  If this cannot
# be done on your architecture, select this option.  However,
# statically allocating the mem_section[] array can potentially
# consume vast quantities of .bss, so be careful.
#
# This option will also potentially produce smaller runtime code
# with gcc 3.4 and later.
#
config SPARSEMEM_STATIC
	bool

#
# Architecture platforms which require a two level mem_section in SPARSEMEM
# must select this option. This is usually for architecture platforms with
# an extremely sparse physical address space.
#
config SPARSEMEM_EXTREME
	def_bool y
	depends on SPARSEMEM && !SPARSEMEM_STATIC

config SPARSEMEM_VMEMMAP_ENABLE
	bool

config SPARSEMEM_VMEMMAP
	def_bool y
	depends on SPARSEMEM && SPARSEMEM_VMEMMAP_ENABLE
	help
	  SPARSEMEM_VMEMMAP uses a virtually mapped memmap to optimise
	  pfn_to_page and page_to_pfn operations.  This is the most
	  efficient option when sufficient kernel resources are available.

config SPARSEMEM_VMEMMAP_PREINIT
	bool
#
# Select this config option from the architecture Kconfig, if it is preferred
# to enable the feature of HugeTLB/dev_dax vmemmap optimization.
#
config ARCH_WANT_OPTIMIZE_DAX_VMEMMAP
	bool

config ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP
	bool

config ARCH_WANT_HUGETLB_VMEMMAP_PREINIT
	bool

config HAVE_MEMBLOCK_PHYS_MAP
	bool

config HAVE_GUP_FAST
	depends on MMU
	bool

# Enable memblock support for scratch memory which is needed for kexec handover
config MEMBLOCK_KHO_SCRATCH
	bool

# Don't discard allocated memory used to track "memory" and "reserved" memblocks
# after early boot, so it can still be used to test for validity of memory.
# Also, memblocks are updated with memory hot(un)plug.
config ARCH_KEEP_MEMBLOCK
	bool

# Keep arch NUMA mapping infrastructure post-init.
config NUMA_KEEP_MEMINFO
	bool

config MEMORY_ISOLATION
	bool

# IORESOURCE_SYSTEM_RAM regions in the kernel resource tree that are marked
# IORESOURCE_EXCLUSIVE cannot be mapped to user space, for example, via
# /dev/mem.
config EXCLUSIVE_SYSTEM_RAM
	def_bool y
	depends on !DEVMEM || STRICT_DEVMEM

config ARCH_ENABLE_MEMORY_HOTPLUG
	bool

# eventually, we can have this option just 'select SPARSEMEM'
menuconfig MEMORY_HOTPLUG
	bool "Memory hotplug"
	select MEMORY_ISOLATION
	depends on SPARSEMEM_VMEMMAP
	depends on ARCH_ENABLE_MEMORY_HOTPLUG
	depends on 64BIT
	select NUMA_KEEP_MEMINFO if NUMA

if MEMORY_HOTPLUG

choice
	prompt "Memory Hotplug Default Online Type"
	default MHP_DEFAULT_ONLINE_TYPE_OFFLINE
	help
	  Default memory type for hotplugged memory.

	  This option sets the default policy setting for memory hotplug
	  onlining policy (/sys/devices/system/memory/auto_online_blocks) which
	  determines what happens to newly added memory regions. Policy setting
	  can always be changed at runtime.

	  The default is 'offline'.

	  Select offline to defer onlining to drivers and user policy.
	  Select auto to let the kernel choose what zones to utilize.
	  Select online_kernel to generally allow kernel usage of this memory.
	  Select online_movable to generally disallow kernel usage of this memory.

	  Example kernel usage would be page structs and page tables.

	  See Documentation/admin-guide/mm/memory-hotplug.rst for more information.

config MHP_DEFAULT_ONLINE_TYPE_OFFLINE
	bool "offline"
	help
	  Hotplugged memory will not be onlined by default.
	  Choose this for systems with drivers and user policy that
	  handle onlining of hotplug memory policy.

config MHP_DEFAULT_ONLINE_TYPE_ONLINE_AUTO
	bool "auto"
	help
	  Select this if you want the kernel to automatically online
	  hotplugged memory into the zone it thinks is reasonable.
	  This memory may be utilized for kernel data.

config MHP_DEFAULT_ONLINE_TYPE_ONLINE_KERNEL
	bool "kernel"
	help
	  Select this if you want the kernel to automatically online
	  hotplugged memory into a zone capable of being used for kernel
	  data. This typically means ZONE_NORMAL.

config MHP_DEFAULT_ONLINE_TYPE_ONLINE_MOVABLE
	bool "movable"
	help
	  Select this if you want the kernel to automatically online
	  hotplug memory into ZONE_MOVABLE. This memory will generally
	  not be utilized for kernel data.

	  This should only be used when the admin knows sufficient
	  ZONE_NORMAL memory is available to describe hotplug memory,
	  otherwise hotplug memory may fail to online. For example,
	  sufficient kernel-capable memory (ZONE_NORMAL) must be
	  available to allocate page structs to describe ZONE_MOVABLE.

endchoice

config MEMORY_HOTREMOVE
	bool "Allow for memory hot remove"
	select MIGRATION

config MHP_MEMMAP_ON_MEMORY
	def_bool y
	depends on ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE

endif # MEMORY_HOTPLUG

config ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE
       bool

# Heavily threaded applications may benefit from splitting the mm-wide
# page_table_lock, so that faults on different parts of the user address
# space can be handled with less contention: split it at this NR_CPUS.
# Default to 4 for wider testing, though 8 might be more appropriate.
# ARM's adjust_pte (unused if VIPT) depends on mm-wide page_table_lock.
# PA-RISC 7xxx's spinlock_t would enlarge struct page from 32 to 44 bytes.
# SPARC32 allocates multiple pte tables within a single page, and therefore
# a per-page lock leads to problems when multiple tables need to be locked
# at the same time (e.g. copy_page_range()).
# DEBUG_SPINLOCK and DEBUG_LOCK_ALLOC spinlock_t also enlarge struct page.
#
config SPLIT_PTE_PTLOCKS
	def_bool y
	depends on MMU
	depends on SMP
	depends on NR_CPUS >= 4
	depends on !ARM || CPU_CACHE_VIPT
	depends on !PARISC || PA20
	depends on !SPARC32
	depends on !UML

config ARCH_ENABLE_SPLIT_PMD_PTLOCK
	bool

config SPLIT_PMD_PTLOCKS
	def_bool y
	depends on SPLIT_PTE_PTLOCKS && ARCH_ENABLE_SPLIT_PMD_PTLOCK

#
# support for memory balloon
config BALLOON
	bool

#
# support for memory balloon page migration
config BALLOON_MIGRATION
	bool "Allow for balloon memory migration"
	default y
	depends on MIGRATION && BALLOON
	help
	  Allow for migration of pages inflated in a memory balloon such that
	  they can be allocated from memory areas only available for movable
	  allocations (e.g., ZONE_MOVABLE, CMA) and such that they can be
	  migrated for memory defragmentation purposes by memory compaction.

#
# support for memory compaction
config COMPACTION
	bool "Allow for memory compaction"
	default y
	select MIGRATION
	depends on MMU
	help
	  Compaction is the only memory management component to form
	  high order (larger physically contiguous) memory blocks
	  reliably. The page allocator relies on compaction heavily and
	  the lack of the feature can lead to unexpected OOM killer
	  invocations for high order memory requests. You shouldn't
	  disable this option unless there really is a strong reason for
	  it and then we would be really interested to hear about that at
	  linux-mm@kvack.org.

config COMPACT_UNEVICTABLE_DEFAULT
	int
	depends on COMPACTION
	default 0 if PREEMPT_RT
	default 1

#
# support for free page reporting
config PAGE_REPORTING
	bool "Free page reporting"
	help
	  Free page reporting allows for the incremental acquisition of
	  free pages from the buddy allocator for the purpose of reporting
	  those pages to another entity, such as a hypervisor, so that the
	  memory can be freed within the host for other uses.

config NUMA_MIGRATION
	bool "NUMA page migration"
	default y
	depends on NUMA && MMU
	select MIGRATION
	help
	  Support the migration of pages to other NUMA nodes, available to
	  user space through interfaces like migrate_pages(), move_pages(),
	  and mbind(). Selecting this option also enables support for page
	  demotion for memory tiering.

config MIGRATION
	bool
	depends on MMU

config DEVICE_MIGRATION
	def_bool MIGRATION && ZONE_DEVICE

config ARCH_ENABLE_HUGEPAGE_MIGRATION
	bool

config ARCH_HAS_PMD_SOFTLEAVES
	bool

config HUGETLB_PAGE_SIZE_VARIABLE
	def_bool n
	help
	  Allows the pageblock_order value to be dynamic instead of just standard
	  HUGETLB_PAGE_ORDER when there are multiple HugeTLB page sizes available
	  on a platform.

	  Note that the pageblock_order cannot exceed MAX_PAGE_ORDER and will be
	  clamped down to MAX_PAGE_ORDER.

config CONTIG_ALLOC
	def_bool (MEMORY_ISOLATION && COMPACTION) || CMA

config PCP_BATCH_SCALE_MAX
	int "Maximum scale factor of PCP (Per-CPU pageset) batch allocate/free"
	default 5
	range 0 6
	help
	  In page allocator, PCP (Per-CPU pageset) is refilled and drained in
	  batches.  The batch number is scaled automatically to improve page
	  allocation/free throughput.  But too large scale factor may hurt
	  latency.  This option sets the upper limit of scale factor to limit
	  the maximum latency.

config PHYS_ADDR_T_64BIT
	def_bool 64BIT

config MMU_NOTIFIER
	bool
	select INTERVAL_TREE

config KSM
	bool "Enable KSM for page merging"
	depends on MMU
	select XXHASH
	help
	  Enable Kernel Samepage Merging: KSM periodically scans those areas
	  of an application's address space that an app has advised may be
	  mergeable.  When it finds pages of identical content, it replaces
	  the many instances by a single page with that content, so
	  saving memory until one or another app needs to modify the content.
	  Recommended for use with KVM, or with other duplicative applications.
	  See Documentation/mm/ksm.rst for more information: KSM is inactive
	  until a program has madvised that an area is MADV_MERGEABLE, and
	  root has set /sys/kernel/mm/ksm/run to 1 (if CONFIG_SYSFS is set).

config DEFAULT_MMAP_MIN_ADDR
	int "Low address space to protect from user allocation"
	depends on MMU
	default 4096
	help
	  This is the portion of low virtual memory which should be protected
	  from userspace allocation.  Keeping a user from writing to low pages
	  can help reduce the impact of kernel NULL pointer bugs.

	  For most arm64, ppc64 and x86 users with lots of address space
	  a value of 65536 is reasonable and should cause no problems.
	  On arm and other archs it should not be higher than 32768.
	  Programs which use vm86 functionality or have some need to map
	  this low address space will need CAP_SYS_RAWIO or disable this
	  protection by setting the value to 0.

	  This value can be changed after boot using the
	  /proc/sys/vm/mmap_min_addr tunable.

config ARCH_SUPPORTS_MEMORY_FAILURE
	bool

config MEMORY_FAILURE
	depends on MMU
	depends on ARCH_SUPPORTS_MEMORY_FAILURE
	bool "Enable recovery from hardware memory errors"
	select INTERVAL_TREE
	select MIGRATION
	help
	  Enables code to recover from some memory failures on systems
	  with MCA recovery. This allows a system to continue running
	  even when some of its memory has uncorrected errors. This requires
	  special hardware support and typically ECC memory.

config HWPOISON_INJECT
	tristate "HWPoison pages injector"
	depends on MEMORY_FAILURE && DEBUG_KERNEL && PROC_FS
	select PROC_PAGE_MONITOR

config NOMMU_INITIAL_TRIM_EXCESS
	int "Turn on mmap() excess space trimming before booting"
	depends on !MMU
	default 1
	help
	  The NOMMU mmap() frequently needs to allocate large contiguous chunks
	  of memory on which to store mappings, but it can only ask the system
	  allocator for chunks in 2^N*PAGE_SIZE amounts - which is frequently
	  more than it requires.  To deal with this, mmap() is able to trim off
	  the excess and return it to the allocator.

	  If trimming is enabled, the excess is trimmed off and returned to the
	  system allocator, which can cause extra fragmentation, particularly
	  if there are a lot of transient processes.

	  If trimming is disabled, the excess is kept, but not used, which for
	  long-term mappings means that the space is wasted.

	  Trimming can be dynamically controlled through a sysctl option
	  (/proc/sys/vm/nr_trim_pages) which specifies the minimum number of
	  excess pages there must be before trimming should occur, or zero if
	  no trimming is to occur.

	  This option specifies the initial value of this option.  The default
	  of 1 says that all excess pages should be trimmed.

	  See Documentation/admin-guide/mm/nommu-mmap.rst for more information.

config ARCH_WANT_GENERAL_HUGETLB
	bool

config ARCH_WANTS_THP_SWAP
	def_bool n

config PERSISTENT_HUGE_ZERO_FOLIO
	bool "Allocate a PMD sized folio for zeroing"
	depends on TRANSPARENT_HUGEPAGE
	help
	  Enable this option to reduce the runtime refcounting overhead
	  of the huge zero folio and expand the places in the kernel
	  that can use huge zero folios. For instance, block I/O benefits
	  from access to large folios for zeroing memory.

	  With this option enabled, the huge zero folio is allocated
	  once and never freed. One full huge page's worth of memory shall
	  be used.

	  Say Y if your system has lots of memory. Say N if you are
	  memory constrained.

config MM_ID
	def_bool n

menuconfig TRANSPARENT_HUGEPAGE
	bool "Transparent Hugepage Support"
	depends on HAVE_ARCH_TRANSPARENT_HUGEPAGE && !PREEMPT_RT
	select COMPACTION
	select XARRAY_MULTI
	select MM_ID
	help
	  Transparent Hugepages allows the kernel to use huge pages and
	  huge tlb transparently to the applications whenever possible.
	  This feature can improve computing performance to certain
	  applications by speeding up page faults during memory
	  allocation, by reducing the number of tlb misses and by speeding
	  up the pagetable walking.

	  If memory constrained on embedded, you may want to say N.

if TRANSPARENT_HUGEPAGE

choice
	prompt "Transparent Hugepage Support sysfs defaults"
	default TRANSPARENT_HUGEPAGE_ALWAYS
	help
	  Selects the sysfs defaults for Transparent Hugepage Support.

	config TRANSPARENT_HUGEPAGE_ALWAYS
		bool "always"
	help
	  Enabling Transparent Hugepage always, can increase the
	  memory footprint of applications without a guaranteed
	  benefit but it will work automatically for all applications.

	config TRANSPARENT_HUGEPAGE_MADVISE
		bool "madvise"
	help
	  Enabling Transparent Hugepage madvise, will only provide a
	  performance improvement benefit to the applications using
	  madvise(MADV_HUGEPAGE) but it won't risk to increase the
	  memory footprint of applications without a guaranteed
	  benefit.

	config TRANSPARENT_HUGEPAGE_NEVER
		bool "never"
	help
	  Disable Transparent Hugepage by default. It can still be
	  enabled at runtime via sysfs.
endchoice

choice
	prompt "Shmem hugepage allocation defaults"
	default TRANSPARENT_HUGEPAGE_SHMEM_HUGE_NEVER
	help
	  Selects the hugepage allocation policy defaults for
	  the internal shmem mount.

	  The selection made here can be overridden by using the kernel
	  command line 'transparent_hugepage_shmem=' option.

	config TRANSPARENT_HUGEPAGE_SHMEM_HUGE_NEVER
		bool "never"
	help
	  Disable hugepage allocation for shmem mount by default. It can
	  still be enabled with the kernel command line
	  'transparent_hugepage_shmem=' option or at runtime via sysfs
	  knob. Note that madvise(MADV_COLLAPSE) can still cause
	  transparent huge pages to be obtained even if this mode is
	  specified.

	config TRANSPARENT_HUGEPAGE_SHMEM_HUGE_ALWAYS
		bool "always"
	help
	  Always attempt to allocate hugepage for shmem mount, can
	  increase the memory footprint of applications without a
	  guaranteed benefit but it will work automatically for all
	  applications.

	config TRANSPARENT_HUGEPAGE_SHMEM_HUGE_WITHIN_SIZE
		bool "within_size"
	help
	  Enable hugepage allocation for shmem mount if the allocation
	  will be fully within the i_size. This configuration also takes
	  into account any madvise(MADV_HUGEPAGE) hints that may be
	  provided by the applications.

	config TRANSPARENT_HUGEPAGE_SHMEM_HUGE_ADVISE
		bool "advise"
	help
	  Enable hugepage allocation for the shmem mount exclusively when
	  applications supply the madvise(MADV_HUGEPAGE) hint.
	  This ensures that hugepages are used only in response to explicit
	  requests from applications.
endchoice

choice
	prompt "Tmpfs hugepage allocation defaults"
	default TRANSPARENT_HUGEPAGE_TMPFS_HUGE_NEVER
	help
	  Selects the hugepage allocation policy defaults for
	  the tmpfs mount.

	  The selection made here can be overridden by using the kernel
	  command line 'transparent_hugepage_tmpfs=' option.

	config TRANSPARENT_HUGEPAGE_TMPFS_HUGE_NEVER
		bool "never"
	help
	  Disable hugepage allocation for tmpfs mount by default. It can
	  still be enabled with the kernel command line
	  'transparent_hugepage_tmpfs=' option. Note that
	  madvise(MADV_COLLAPSE) can still cause transparent huge pages
	  to be obtained even if this mode is specified.

	config TRANSPARENT_HUGEPAGE_TMPFS_HUGE_ALWAYS
		bool "always"
	help
	  Always attempt to allocate hugepage for tmpfs mount, can
	  increase the memory footprint of applications without a
	  guaranteed benefit but it will work automatically for all
	  applications.

	config TRANSPARENT_HUGEPAGE_TMPFS_HUGE_WITHIN_SIZE
		bool "within_size"
	help
	  Enable hugepage allocation for tmpfs mount if the allocation
	  will be fully within the i_size. This configuration also takes
	  into account any madvise(MADV_HUGEPAGE) hints that may be
	  provided by the applications.

	config TRANSPARENT_HUGEPAGE_TMPFS_HUGE_ADVISE
		bool "advise"
	help
	  Enable hugepage allocation for the tmpfs mount exclusively when
	  applications supply the madvise(MADV_HUGEPAGE) hint.
	  This ensures that hugepages are used only in response to explicit
	  requests from applications.
endchoice

config THP_SWAP
	def_bool y
	depends on ARCH_WANTS_THP_SWAP && SWAP && 64BIT
	help
	  Swap transparent huge pages in one piece, without splitting.
	  XXX: For now, swap cluster backing transparent huge page
	  will be split after swapout.

	  For selection by architectures with reasonable THP sizes.

config NO_PAGE_MAPCOUNT
	bool "No per-page mapcount (EXPERIMENTAL)"
	help
	  Do not maintain per-page mapcounts for pages part of larger
	  allocations, such as transparent huge pages.

	  When this config option is enabled, some interfaces that relied on
	  this information will rely on less-precise per-allocation information
	  instead: for example, using the average per-page mapcount in such
	  a large allocation instead of the per-page mapcount.

	  EXPERIMENTAL because the impact of some changes is still unclear.

endif # TRANSPARENT_HUGEPAGE

# simple helper to make the code a bit easier to read
config PAGE_MAPCOUNT
	def_bool !NO_PAGE_MAPCOUNT

#
# The architecture supports pgtable leaves that is larger than PAGE_SIZE
#
config PGTABLE_HAS_HUGE_LEAVES
	def_bool TRANSPARENT_HUGEPAGE || HUGETLB_PAGE

#
# We can end up creating gigantic folio.
#
config HAVE_GIGANTIC_FOLIOS
	def_bool (HUGETLB_PAGE && ARCH_HAS_GIGANTIC_PAGE) || \
		 (ZONE_DEVICE && HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD)

config ASYNC_KERNEL_PGTABLE_FREE
	def_bool n

# TODO: Allow to be enabled without THP
config ARCH_SUPPORTS_HUGE_PFNMAP
	def_bool n
	depends on TRANSPARENT_HUGEPAGE

config ARCH_SUPPORTS_PMD_PFNMAP
	def_bool y
	depends on ARCH_SUPPORTS_HUGE_PFNMAP && HAVE_ARCH_TRANSPARENT_HUGEPAGE

config ARCH_SUPPORTS_PUD_PFNMAP
	def_bool y
	depends on ARCH_SUPPORTS_HUGE_PFNMAP && HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD

#
# Architectures that always use weak definitions for percpu
# variables in modules should set this.
#
config ARCH_MODULE_NEEDS_WEAK_PER_CPU
       bool

#
# UP and nommu archs use km based percpu allocator
#
config NEED_PER_CPU_KM
	depends on !SMP || !MMU
	bool
	default y

config NEED_PER_CPU_EMBED_FIRST_CHUNK
	bool

config NEED_PER_CPU_PAGE_FIRST_CHUNK
	bool

config USE_PERCPU_NUMA_NODE_ID
	bool

config HAVE_SETUP_PER_CPU_AREA
	bool

config CMA
	bool "Contiguous Memory Allocator"
	depends on MMU
	select MIGRATION
	select MEMORY_ISOLATION
	help
	  This enables the Contiguous Memory Allocator which allows other
	  subsystems to allocate big physically-contiguous blocks of memory.
	  CMA reserves a region of memory and allows only movable pages to
	  be allocated from it. This way, the kernel can use the memory for
	  pagecache and when a subsystem requests for contiguous area, the
	  allocated pages are migrated away to serve the contiguous request.

	  If unsure, say "n".

config CMA_DEBUGFS
	bool "CMA debugfs interface"
	depends on CMA && DEBUG_FS
	help
	  Turns on the DebugFS interface for CMA.

config CMA_SYSFS
	bool "CMA information through sysfs interface"
	depends on CMA && SYSFS
	help
	  This option exposes some sysfs attributes to get information
	  from CMA.

config CMA_AREAS
	int "Maximum count of the CMA areas"
	depends on CMA
	default 20 if NUMA
	default 8
	help
	  CMA allows to create CMA areas for particular purpose, mainly,
	  used as device private area. This parameter sets the maximum
	  number of CMA area in the system.

	  If unsure, leave the default value "8" in UMA and "20" in NUMA.

#
# Select this config option from the architecture Kconfig, if available, to set
# the max page order for physically contiguous allocations.
#
config ARCH_FORCE_MAX_ORDER
	int

#
# When ARCH_FORCE_MAX_ORDER is not defined,
# the default page block order is MAX_PAGE_ORDER (10) as per
# include/linux/mmzone.h.
#
config PAGE_BLOCK_MAX_ORDER
	int "Page Block Order Upper Limit"
	range 1 10 if ARCH_FORCE_MAX_ORDER = 0
	default 10 if ARCH_FORCE_MAX_ORDER = 0
	range 1 ARCH_FORCE_MAX_ORDER if ARCH_FORCE_MAX_ORDER != 0
	default ARCH_FORCE_MAX_ORDER if ARCH_FORCE_MAX_ORDER != 0
	help
	  The page block order refers to the power of two number of pages that
	  are physically contiguous and can have a migrate type associated to
	  them. The maximum size of the page block order is at least limited by
	  ARCH_FORCE_MAX_ORDER/MAX_PAGE_ORDER.

	  This config adds a new upper limit of default page block
	  order when the page block order is required to be smaller than
	  ARCH_FORCE_MAX_ORDER/MAX_PAGE_ORDER or other limits
	  (see include/linux/pageblock-flags.h for details).

	  Reducing pageblock order can negatively impact THP generation
	  success rate. If your workloads use THP heavily, please use this
	  option with caution.

	  Don't change if unsure.

config MEM_SOFT_DIRTY
	bool "Track memory changes"
	depends on CHECKPOINT_RESTORE && HAVE_ARCH_SOFT_DIRTY && PROC_FS
	select PROC_PAGE_MONITOR
	help
	  This option enables memory changes tracking by introducing a
	  soft-dirty bit on pte-s. This bit it set when someone writes
	  into a page just as regular dirty bit, but unlike the latter
	  it can be cleared by hands.

	  See Documentation/admin-guide/mm/soft-dirty.rst for more details.

config GENERIC_EARLY_IOREMAP
	bool

config STACK_MAX_DEFAULT_SIZE_MB
	int "Default maximum user stack size for 32-bit processes (MB)"
	default 100
	range 8 2048
	depends on STACK_GROWSUP && (!64BIT || COMPAT)
	help
	  This is the maximum stack size in Megabytes in the VM layout of 32-bit
	  user processes when the stack grows upwards (currently only on parisc
	  arch) when the RLIMIT_STACK hard limit is unlimited.

	  A sane initial value is 100 MB.

config DEFERRED_STRUCT_PAGE_INIT
	bool "Defer initialisation of struct pages to kthreads"
	depends on SPARSEMEM
	depends on !NEED_PER_CPU_KM
	depends on 64BIT
	depends on !KMSAN
	select PADATA
	help
	  Ordinarily all struct pages are initialised during early boot in a
	  single thread. On very large machines this can take a considerable
	  amount of time. If this option is set, large machines will bring up
	  a subset of memmap at boot and then initialise the rest in parallel.
	  This has a potential performance impact on tasks running early in the
	  lifetime of the system until these kthreads finish the
	  initialisation.

config PAGE_IDLE_FLAG
	bool
	select PAGE_EXTENSION if !64BIT
	help
	  This adds PG_idle and PG_young flags to 'struct page'.  PTE Accessed
	  bit writers can set the state of the bit in the flags so that PTE
	  Accessed bit readers may avoid disturbance.

config IDLE_PAGE_TRACKING
	bool "Enable idle page tracking"
	depends on SYSFS && MMU
	select PAGE_IDLE_FLAG
	help
	  This feature allows to estimate the amount of user pages that have
	  not been touched during a given period of time. This information can
	  be useful to tune memory cgroup limits and/or for job placement
	  within a compute cluster.

	  See Documentation/admin-guide/mm/idle_page_tracking.rst for
	  more details.

# Architectures which implement cpu_dcache_is_aliasing() to query
# whether the data caches are aliased (VIVT or VIPT with dcache
# aliasing) need to select this.
config ARCH_HAS_CPU_CACHE_ALIASING
	bool

config ARCH_HAS_CACHE_LINE_SIZE
	bool

config ARCH_HAS_CURRENT_STACK_POINTER
	bool
	help
	  In support of HARDENED_USERCOPY performing stack variable lifetime
	  checking, an architecture-agnostic way to find the stack pointer
	  is needed. Once an architecture defines an unsigned long global
	  register alias named "current_stack_pointer", this config can be
	  selected.

config ARCH_HAS_ZONE_DMA_SET
	bool

config ZONE_DMA
	bool "Support DMA zone" if ARCH_HAS_ZONE_DMA_SET
	default y if ARM64 || X86

config ZONE_DMA32
	bool "Support DMA32 zone" if ARCH_HAS_ZONE_DMA_SET
	depends on !X86_32
	default y if ARM64

config ZONE_DEVICE
	bool "Device memory (pmem, HMM, etc...) hotplug support"
	depends on MEMORY_HOTREMOVE
	select XARRAY_MULTI

	help
	  Device memory hotplug support allows for establishing pmem,
	  or other device driver discovered memory regions, in the
	  memmap. This allows pfn_to_page() lookups of otherwise
	  "device-physical" addresses which is needed for DAX, PCI_P2PDMA, and
	  DEVICE_PRIVATE features among others.

	  Enabling this option will reduce the entropy of x86 KASLR memory
	  regions. For example - on a 46 bit system, the entropy goes down
	  from 16 bits to 15 bits. The actual reduction in entropy depends
	  on the physical address bits, on processor features, kernel config
	  (5 level page table) and physical memory present on the system.

#
# Helpers to mirror range of the CPU page tables of a process into device page
# tables.
#
config HMM_MIRROR
	bool
	depends on MMU
	select MMU_NOTIFIER

config GET_FREE_REGION
	bool

config DEVICE_PRIVATE
	bool "Unaddressable device memory (GPU memory, ...)"
	depends on ZONE_DEVICE
	select GET_FREE_REGION

	help
	  Allows creation of struct pages to represent unaddressable device
	  memory; i.e., memory that is only accessible from the device (or
	  group of devices). You likely also want to select HMM_MIRROR.

config VMAP_PFN
	bool

config ARCH_USES_HIGH_VMA_FLAGS
	bool
config ARCH_HAS_PKEYS
	bool

config ARCH_USES_PG_ARCH_2
	bool
config ARCH_USES_PG_ARCH_3
	bool

config VM_EVENT_COUNTERS
	default y
	bool "Enable VM event counters for /proc/vmstat" if EXPERT
	help
	  VM event counters are needed for event counts to be shown.
	  This option allows the disabling of the VM event counters
	  on EXPERT systems.  /proc/vmstat will only show page counts
	  if VM event counters are disabled.

config PERCPU_STATS
	bool "Collect percpu memory statistics"
	help
	  This feature collects and exposes statistics via debugfs. The
	  information includes global and per chunk statistics, which can
	  be used to help understand percpu memory usage.

config GUP_TEST
	bool "Enable infrastructure for get_user_pages()-related unit tests"
	depends on DEBUG_FS
	help
	  Provides /sys/kernel/debug/gup_test, which in turn provides a way
	  to make ioctl calls that can launch kernel-based unit tests for
	  the get_user_pages*() and pin_user_pages*() family of API calls.

	  These tests include benchmark testing of the _fast variants of
	  get_user_pages*() and pin_user_pages*(), as well as smoke tests of
	  the non-_fast variants.

	  There is also a sub-test that allows running dump_page() on any
	  of up to eight pages (selected by command line args) within the
	  range of user-space addresses. These pages are either pinned via
	  pin_user_pages*(), or pinned via get_user_pages*(), as specified
	  by other command line arguments.

	  See tools/testing/selftests/mm/gup_test.c

comment "GUP_TEST needs to have DEBUG_FS enabled"
	depends on !GUP_TEST && !DEBUG_FS

config GUP_GET_PXX_LOW_HIGH
	bool

config DMAPOOL_TEST
	tristate "Enable a module to run time tests on dma_pool"
	depends on HAS_DMA
	help
	  Provides a test module that will allocate and free many blocks of
	  various sizes and report how long it takes. This is intended to
	  provide a consistent way to measure how changes to the
	  dma_pool_alloc/free routines affect performance.

config ARCH_HAS_PTE_SPECIAL
	bool

config MAPPING_DIRTY_HELPERS
	bool

config KMAP_LOCAL
	bool

config KMAP_LOCAL_NON_LINEAR_PTE_ARRAY
	bool

config MEMFD_CREATE
	bool "Enable memfd_create() system call" if EXPERT

config SECRETMEM
	default y
	bool "Enable memfd_secret() system call" if EXPERT
	depends on ARCH_HAS_SET_DIRECT_MAP
	help
	  Enable the memfd_secret() system call with the ability to create
	  memory areas visible only in the context of the owning process and
	  not mapped to other processes and other kernel page tables.

config ANON_VMA_NAME
	bool "Anonymous VMA name support"
	depends on PROC_FS && ADVISE_SYSCALLS && MMU

	help
	  Allow naming anonymous virtual memory areas.

	  This feature allows assigning names to virtual memory areas. Assigned
	  names can be later retrieved from /proc/pid/maps and /proc/pid/smaps
	  and help identifying individual anonymous memory areas.
	  Assigning a name to anonymous virtual memory area might prevent that
	  area from being merged with adjacent virtual memory areas due to the
	  difference in their name.

config HAVE_ARCH_USERFAULTFD_WP
	bool
	help
	  Arch has userfaultfd write protection support

config HAVE_ARCH_USERFAULTFD_MINOR
	bool
	help
	  Arch has userfaultfd minor fault support

config USERFAULTFD_RWP
	def_bool y
	depends on 64BIT && ARCH_HAS_PTE_PROTNONE && HAVE_ARCH_USERFAULTFD_WP
	help
	  Userfaultfd read-write protection (UFFDIO_RWPROTECT) delivers a
	  userfaultfd notification on every access -- read or write -- to a
	  protected range, letting userspace observe the working set of a
	  process.

menuconfig USERFAULTFD
	bool "Enable userfaultfd() system call"
	depends on MMU
	help
	  Enable the userfaultfd() system call that allows to intercept and
	  handle page faults in userland.

config PTE_MARKER_UFFD_WP
	bool "Userfaultfd write protection support for shmem/hugetlbfs"
	default y
	depends on USERFAULTFD && HAVE_ARCH_USERFAULTFD_WP

	help
	  Allows to create marker PTEs for userfaultfd write protection
	  purposes.  It is required to enable userfaultfd write protection on
	  file-backed memory types like shmem and hugetlbfs.

# multi-gen LRU {
config LRU_GEN
	bool "Multi-Gen LRU"
	depends on MMU
	# make sure folio->flags has enough spare bits
	depends on 64BIT || !SPARSEMEM || SPARSEMEM_VMEMMAP
	help
	  A high performance LRU implementation to overcommit memory. See
	  Documentation/admin-guide/mm/multigen_lru.rst for details.

config LRU_GEN_ENABLED
	bool "Enable by default"
	depends on LRU_GEN
	help
	  This option enables the multi-gen LRU by default.

config LRU_GEN_STATS
	bool "Full stats for debugging"
	depends on LRU_GEN
	help
	  Do not enable this option unless you plan to look at historical stats
	  from evicted generations for debugging purpose.

	  This option has a per-memcg and per-node memory overhead.

config LRU_GEN_WALKS_MMU
	def_bool y
	depends on LRU_GEN && ARCH_HAS_HW_PTE_YOUNG
# }

config ARCH_SUPPORTS_PER_VMA_LOCK
       def_bool n

config PER_VMA_LOCK
	def_bool y
	depends on ARCH_SUPPORTS_PER_VMA_LOCK && MMU && SMP
	help
	  Allow per-vma locking during page fault handling.

	  This feature allows locking each virtual memory area separately when
	  handling page faults instead of taking mmap_lock.

config LOCK_MM_AND_FIND_VMA
	bool
	depends on !STACK_GROWSUP

config IOMMU_MM_DATA
	bool

config EXECMEM
	bool

config NUMA_MEMBLKS
	bool

config NUMA_EMU
	bool "NUMA emulation"
	depends on NUMA_MEMBLKS
	depends on X86 || GENERIC_ARCH_NUMA
	help
	  Enable NUMA emulation. A flat machine will be split
	  into virtual nodes when booted with "numa=fake=N", where N is the
	  number of nodes. This is only useful for debugging.

config GENERIC_ARCH_NUMA
	bool
	select NUMA_MEMBLKS
	help
	  Enable support for generic NUMA implementation. Currently, RISC-V
	  and ARM64 use it.

config ARCH_HAS_USER_SHADOW_STACK
	bool
	help
	  The architecture has hardware support for userspace shadow call
	  stacks (eg, x86 CET, arm64 GCS or RISC-V Zicfiss).

config HAVE_ARCH_TLB_REMOVE_TABLE
	def_bool n

config PT_RECLAIM
	def_bool y
	depends on MMU_GATHER_RCU_TABLE_FREE && !HAVE_ARCH_TLB_REMOVE_TABLE
	help
	  Try to reclaim empty user page table pages in paths other than munmap
	  and exit_mmap path.

	  Note: now only empty user PTE page table pages will be reclaimed.

config FIND_NORMAL_PAGE
	def_bool n

config ARCH_HAS_LAZY_MMU_MODE
	bool
	help
	  The architecture uses the lazy MMU mode. This allows changes to
	  MMU-related architectural state to be deferred until the mode is
	  exited. See <linux/pgtable.h> for details.

config LAZY_MMU_MODE_KUNIT_TEST
	tristate "KUnit tests for the lazy MMU mode" if !KUNIT_ALL_TESTS
	depends on ARCH_HAS_LAZY_MMU_MODE
	depends on KUNIT
	default KUNIT_ALL_TESTS
	help
	  Enable this option to check that the lazy MMU mode interface behaves
	  as expected. Only tests for the generic interface are included (not
	  architecture-specific behaviours).

	  If unsure, say N.

source "mm/damon/Kconfig"

endmenu
