xref: /openbmc/linux/mm/shuffle.h (revision 97500a4a54876d3d6d2d1b8419223eb4e69b32d8)
1e900a918SDan Williams // SPDX-License-Identifier: GPL-2.0
2e900a918SDan Williams // Copyright(c) 2018 Intel Corporation. All rights reserved.
3e900a918SDan Williams #ifndef _MM_SHUFFLE_H
4e900a918SDan Williams #define _MM_SHUFFLE_H
5e900a918SDan Williams #include <linux/jump_label.h>
6e900a918SDan Williams 
7e900a918SDan Williams /*
8e900a918SDan Williams  * SHUFFLE_ENABLE is called from the command line enabling path, or by
9e900a918SDan Williams  * platform-firmware enabling that indicates the presence of a
10e900a918SDan Williams  * direct-mapped memory-side-cache. SHUFFLE_FORCE_DISABLE is called from
11e900a918SDan Williams  * the command line path and overrides any previous or future
12e900a918SDan Williams  * SHUFFLE_ENABLE.
13e900a918SDan Williams  */
14e900a918SDan Williams enum mm_shuffle_ctl {
15e900a918SDan Williams 	SHUFFLE_ENABLE,
16e900a918SDan Williams 	SHUFFLE_FORCE_DISABLE,
17e900a918SDan Williams };
18e900a918SDan Williams 
19e900a918SDan Williams #define SHUFFLE_ORDER (MAX_ORDER-1)
20e900a918SDan Williams 
21e900a918SDan Williams #ifdef CONFIG_SHUFFLE_PAGE_ALLOCATOR
22e900a918SDan Williams DECLARE_STATIC_KEY_FALSE(page_alloc_shuffle_key);
23e900a918SDan Williams extern void page_alloc_shuffle(enum mm_shuffle_ctl ctl);
24e900a918SDan Williams extern void __shuffle_free_memory(pg_data_t *pgdat);
25e900a918SDan Williams static inline void shuffle_free_memory(pg_data_t *pgdat)
26e900a918SDan Williams {
27e900a918SDan Williams 	if (!static_branch_unlikely(&page_alloc_shuffle_key))
28e900a918SDan Williams 		return;
29e900a918SDan Williams 	__shuffle_free_memory(pgdat);
30e900a918SDan Williams }
31e900a918SDan Williams 
32e900a918SDan Williams extern void __shuffle_zone(struct zone *z);
33e900a918SDan Williams static inline void shuffle_zone(struct zone *z)
34e900a918SDan Williams {
35e900a918SDan Williams 	if (!static_branch_unlikely(&page_alloc_shuffle_key))
36e900a918SDan Williams 		return;
37e900a918SDan Williams 	__shuffle_zone(z);
38e900a918SDan Williams }
39*97500a4aSDan Williams 
40*97500a4aSDan Williams static inline bool is_shuffle_order(int order)
41*97500a4aSDan Williams {
42*97500a4aSDan Williams 	if (!static_branch_unlikely(&page_alloc_shuffle_key))
43*97500a4aSDan Williams 		return false;
44*97500a4aSDan Williams 	return order >= SHUFFLE_ORDER;
45*97500a4aSDan Williams }
46e900a918SDan Williams #else
47e900a918SDan Williams static inline void shuffle_free_memory(pg_data_t *pgdat)
48e900a918SDan Williams {
49e900a918SDan Williams }
50e900a918SDan Williams 
51e900a918SDan Williams static inline void shuffle_zone(struct zone *z)
52e900a918SDan Williams {
53e900a918SDan Williams }
54e900a918SDan Williams 
55e900a918SDan Williams static inline void page_alloc_shuffle(enum mm_shuffle_ctl ctl)
56e900a918SDan Williams {
57e900a918SDan Williams }
58*97500a4aSDan Williams 
59*97500a4aSDan Williams static inline bool is_shuffle_order(int order)
60*97500a4aSDan Williams {
61*97500a4aSDan Williams 	return false;
62*97500a4aSDan Williams }
63e900a918SDan Williams #endif
64e900a918SDan Williams #endif /* _MM_SHUFFLE_H */
65