at v6.10 153 lines 4.0 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef _LINUX_MEMORY_TIERS_H 3#define _LINUX_MEMORY_TIERS_H 4 5#include <linux/types.h> 6#include <linux/nodemask.h> 7#include <linux/kref.h> 8#include <linux/mmzone.h> 9#include <linux/notifier.h> 10/* 11 * Each tier cover a abstrace distance chunk size of 128 12 */ 13#define MEMTIER_CHUNK_BITS 7 14#define MEMTIER_CHUNK_SIZE (1 << MEMTIER_CHUNK_BITS) 15/* 16 * Smaller abstract distance values imply faster (higher) memory tiers. Offset 17 * the DRAM adistance so that we can accommodate devices with a slightly lower 18 * adistance value (slightly faster) than default DRAM adistance to be part of 19 * the same memory tier. 20 */ 21#define MEMTIER_ADISTANCE_DRAM ((4 * MEMTIER_CHUNK_SIZE) + (MEMTIER_CHUNK_SIZE >> 1)) 22 23struct memory_tier; 24struct memory_dev_type { 25 /* list of memory types that are part of same tier as this type */ 26 struct list_head tier_sibling; 27 /* list of memory types that are managed by one driver */ 28 struct list_head list; 29 /* abstract distance for this specific memory type */ 30 int adistance; 31 /* Nodes of same abstract distance */ 32 nodemask_t nodes; 33 struct kref kref; 34}; 35 36struct access_coordinate; 37 38#ifdef CONFIG_NUMA 39extern bool numa_demotion_enabled; 40extern struct memory_dev_type *default_dram_type; 41struct memory_dev_type *alloc_memory_type(int adistance); 42void put_memory_type(struct memory_dev_type *memtype); 43void init_node_memory_type(int node, struct memory_dev_type *default_type); 44void clear_node_memory_type(int node, struct memory_dev_type *memtype); 45int register_mt_adistance_algorithm(struct notifier_block *nb); 46int unregister_mt_adistance_algorithm(struct notifier_block *nb); 47int mt_calc_adistance(int node, int *adist); 48int mt_set_default_dram_perf(int nid, struct access_coordinate *perf, 49 const char *source); 50int mt_perf_to_adistance(struct access_coordinate *perf, int *adist); 51struct memory_dev_type *mt_find_alloc_memory_type(int adist, 52 struct list_head *memory_types); 53void mt_put_memory_types(struct list_head *memory_types); 54#ifdef CONFIG_MIGRATION 55int next_demotion_node(int node); 56void node_get_allowed_targets(pg_data_t *pgdat, nodemask_t *targets); 57bool node_is_toptier(int node); 58#else 59static inline int next_demotion_node(int node) 60{ 61 return NUMA_NO_NODE; 62} 63 64static inline void node_get_allowed_targets(pg_data_t *pgdat, nodemask_t *targets) 65{ 66 *targets = NODE_MASK_NONE; 67} 68 69static inline bool node_is_toptier(int node) 70{ 71 return true; 72} 73#endif 74 75#else 76 77#define numa_demotion_enabled false 78#define default_dram_type NULL 79/* 80 * CONFIG_NUMA implementation returns non NULL error. 81 */ 82static inline struct memory_dev_type *alloc_memory_type(int adistance) 83{ 84 return NULL; 85} 86 87static inline void put_memory_type(struct memory_dev_type *memtype) 88{ 89 90} 91 92static inline void init_node_memory_type(int node, struct memory_dev_type *default_type) 93{ 94 95} 96 97static inline void clear_node_memory_type(int node, struct memory_dev_type *memtype) 98{ 99 100} 101 102static inline int next_demotion_node(int node) 103{ 104 return NUMA_NO_NODE; 105} 106 107static inline void node_get_allowed_targets(pg_data_t *pgdat, nodemask_t *targets) 108{ 109 *targets = NODE_MASK_NONE; 110} 111 112static inline bool node_is_toptier(int node) 113{ 114 return true; 115} 116 117static inline int register_mt_adistance_algorithm(struct notifier_block *nb) 118{ 119 return 0; 120} 121 122static inline int unregister_mt_adistance_algorithm(struct notifier_block *nb) 123{ 124 return 0; 125} 126 127static inline int mt_calc_adistance(int node, int *adist) 128{ 129 return NOTIFY_DONE; 130} 131 132static inline int mt_set_default_dram_perf(int nid, struct access_coordinate *perf, 133 const char *source) 134{ 135 return -EIO; 136} 137 138static inline int mt_perf_to_adistance(struct access_coordinate *perf, int *adist) 139{ 140 return -EIO; 141} 142 143static inline struct memory_dev_type *mt_find_alloc_memory_type(int adist, 144 struct list_head *memory_types) 145{ 146 return NULL; 147} 148 149static inline void mt_put_memory_types(struct list_head *memory_types) 150{ 151} 152#endif /* CONFIG_NUMA */ 153#endif /* _LINUX_MEMORY_TIERS_H */