# Copyright (c) 2020 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
#
# Demand paging sample eviction algorithms

choice EVICTION_CHOICE
	prompt "Page frame eviction algorithms"
	default EVICTION_LRU if ARM64
	default EVICTION_NRU
	depends on DEMAND_PAGING

config EVICTION_CUSTOM
	bool "Custom eviction algorithm"
	imply EVICTION_TRACKING
	help
	  This option is chosen when the eviction algorithm will be implemented
	  by the application, instead of using one included in Zephyr.

config EVICTION_NRU
	bool "Not Recently Used (NRU) page eviction algorithm"
	help
	  This implements a Not Recently Used page eviction algorithm.
	  A periodic timer will clear the accessed state of all virtual pages.
	  When a page frame needs to be evicted, the algorithm will prefer to
	  evict page frames using an ascending order of priority:

	   - recently accessed, dirty
	   - recently accessed, clean
	   - not recently accessed, dirty
	   - not recently accessed, clean

config EVICTION_LRU
	bool "Least Recently Used (LRU) page eviction algorithm"
	select EVICTION_TRACKING
	help
	  This implements a Least Recently Used page eviction algorithm.
	  Usage is tracked based on MMU protection making pages unaccessible
	  and causing a fault when actually used, using such event to reorder
	  the page eviction queue. This is more efficient than the NRU
	  algorithm: all operations are O(1), the accessed flag is cleared on
	  one page at a time and only when there is a page eviction request.

endchoice

if EVICTION_NRU
config EVICTION_NRU_PERIOD
	int "Recently accessed period, in milliseconds"
	default 100
	help
	  A periodic timer will fire that clears the accessed state of all virtual
	  pages that are capable of being paged out. At eviction time, if a page
	  still has the accessed property, it will be considered as recently used.
endif # EVICTION_NRU

config EVICTION_TRACKING
	bool
	depends on ARCH_SUPPORTS_EVICTION_TRACKING
	help
	  Selected by eviction algorithms which needs page tracking and need to
	  implement the following functions: k_mem_paging_eviction_add(),
	  k_mem_paging_eviction_remove() and k_mem_paging_eviction_accessed().
