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