| .. | .. |
|---|
| 17 | 17 | |
|---|
| 18 | 18 | #include <linux/device.h> |
|---|
| 19 | 19 | #include <linux/cpumask.h> |
|---|
| 20 | +#include <linux/list.h> |
|---|
| 20 | 21 | #include <linux/workqueue.h> |
|---|
| 22 | + |
|---|
| 23 | +/** |
|---|
| 24 | + * struct node_hmem_attrs - heterogeneous memory performance attributes |
|---|
| 25 | + * |
|---|
| 26 | + * @read_bandwidth: Read bandwidth in MB/s |
|---|
| 27 | + * @write_bandwidth: Write bandwidth in MB/s |
|---|
| 28 | + * @read_latency: Read latency in nanoseconds |
|---|
| 29 | + * @write_latency: Write latency in nanoseconds |
|---|
| 30 | + */ |
|---|
| 31 | +struct node_hmem_attrs { |
|---|
| 32 | + unsigned int read_bandwidth; |
|---|
| 33 | + unsigned int write_bandwidth; |
|---|
| 34 | + unsigned int read_latency; |
|---|
| 35 | + unsigned int write_latency; |
|---|
| 36 | +}; |
|---|
| 37 | + |
|---|
| 38 | +enum cache_indexing { |
|---|
| 39 | + NODE_CACHE_DIRECT_MAP, |
|---|
| 40 | + NODE_CACHE_INDEXED, |
|---|
| 41 | + NODE_CACHE_OTHER, |
|---|
| 42 | +}; |
|---|
| 43 | + |
|---|
| 44 | +enum cache_write_policy { |
|---|
| 45 | + NODE_CACHE_WRITE_BACK, |
|---|
| 46 | + NODE_CACHE_WRITE_THROUGH, |
|---|
| 47 | + NODE_CACHE_WRITE_OTHER, |
|---|
| 48 | +}; |
|---|
| 49 | + |
|---|
| 50 | +/** |
|---|
| 51 | + * struct node_cache_attrs - system memory caching attributes |
|---|
| 52 | + * |
|---|
| 53 | + * @indexing: The ways memory blocks may be placed in cache |
|---|
| 54 | + * @write_policy: Write back or write through policy |
|---|
| 55 | + * @size: Total size of cache in bytes |
|---|
| 56 | + * @line_size: Number of bytes fetched on a cache miss |
|---|
| 57 | + * @level: The cache hierarchy level |
|---|
| 58 | + */ |
|---|
| 59 | +struct node_cache_attrs { |
|---|
| 60 | + enum cache_indexing indexing; |
|---|
| 61 | + enum cache_write_policy write_policy; |
|---|
| 62 | + u64 size; |
|---|
| 63 | + u16 line_size; |
|---|
| 64 | + u8 level; |
|---|
| 65 | +}; |
|---|
| 66 | + |
|---|
| 67 | +#ifdef CONFIG_HMEM_REPORTING |
|---|
| 68 | +void node_add_cache(unsigned int nid, struct node_cache_attrs *cache_attrs); |
|---|
| 69 | +void node_set_perf_attrs(unsigned int nid, struct node_hmem_attrs *hmem_attrs, |
|---|
| 70 | + unsigned access); |
|---|
| 71 | +#else |
|---|
| 72 | +static inline void node_add_cache(unsigned int nid, |
|---|
| 73 | + struct node_cache_attrs *cache_attrs) |
|---|
| 74 | +{ |
|---|
| 75 | +} |
|---|
| 76 | + |
|---|
| 77 | +static inline void node_set_perf_attrs(unsigned int nid, |
|---|
| 78 | + struct node_hmem_attrs *hmem_attrs, |
|---|
| 79 | + unsigned access) |
|---|
| 80 | +{ |
|---|
| 81 | +} |
|---|
| 82 | +#endif |
|---|
| 21 | 83 | |
|---|
| 22 | 84 | struct node { |
|---|
| 23 | 85 | struct device dev; |
|---|
| 86 | + struct list_head access_list; |
|---|
| 24 | 87 | |
|---|
| 25 | 88 | #if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) && defined(CONFIG_HUGETLBFS) |
|---|
| 26 | 89 | struct work_struct node_work; |
|---|
| 90 | +#endif |
|---|
| 91 | +#ifdef CONFIG_HMEM_REPORTING |
|---|
| 92 | + struct list_head cache_attrs; |
|---|
| 93 | + struct device *cache_dev; |
|---|
| 27 | 94 | #endif |
|---|
| 28 | 95 | }; |
|---|
| 29 | 96 | |
|---|
| .. | .. |
|---|
| 32 | 99 | typedef void (*node_registration_func_t)(struct node *); |
|---|
| 33 | 100 | |
|---|
| 34 | 101 | #if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) && defined(CONFIG_NUMA) |
|---|
| 35 | | -int link_mem_sections(int nid, unsigned long start_pfn, |
|---|
| 36 | | - unsigned long end_pfn, |
|---|
| 37 | | - enum meminit_context context); |
|---|
| 102 | +void link_mem_sections(int nid, unsigned long start_pfn, |
|---|
| 103 | + unsigned long end_pfn, |
|---|
| 104 | + enum meminit_context context); |
|---|
| 38 | 105 | #else |
|---|
| 39 | | -static inline int link_mem_sections(int nid, unsigned long start_pfn, |
|---|
| 40 | | - unsigned long end_pfn, |
|---|
| 41 | | - enum meminit_context context) |
|---|
| 106 | +static inline void link_mem_sections(int nid, unsigned long start_pfn, |
|---|
| 107 | + unsigned long end_pfn, |
|---|
| 108 | + enum meminit_context context) |
|---|
| 42 | 109 | { |
|---|
| 43 | | - return 0; |
|---|
| 44 | 110 | } |
|---|
| 45 | 111 | #endif |
|---|
| 46 | 112 | |
|---|
| .. | .. |
|---|
| 63 | 129 | if (error) |
|---|
| 64 | 130 | return error; |
|---|
| 65 | 131 | /* link memory sections under this node */ |
|---|
| 66 | | - error = link_mem_sections(nid, start_pfn, end_pfn, |
|---|
| 67 | | - MEMINIT_EARLY); |
|---|
| 132 | + link_mem_sections(nid, start_pfn, end_pfn, MEMINIT_EARLY); |
|---|
| 68 | 133 | } |
|---|
| 69 | 134 | |
|---|
| 70 | 135 | return error; |
|---|
| .. | .. |
|---|
| 73 | 138 | extern void unregister_one_node(int nid); |
|---|
| 74 | 139 | extern int register_cpu_under_node(unsigned int cpu, unsigned int nid); |
|---|
| 75 | 140 | extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid); |
|---|
| 76 | | -extern int register_mem_sect_under_node(struct memory_block *mem_blk, |
|---|
| 77 | | - void *arg); |
|---|
| 78 | 141 | extern void unregister_memory_block_under_nodes(struct memory_block *mem_blk); |
|---|
| 142 | + |
|---|
| 143 | +extern int register_memory_node_under_compute_node(unsigned int mem_nid, |
|---|
| 144 | + unsigned int cpu_nid, |
|---|
| 145 | + unsigned access); |
|---|
| 79 | 146 | |
|---|
| 80 | 147 | #ifdef CONFIG_HUGETLBFS |
|---|
| 81 | 148 | extern void register_hugetlbfs_with_node(node_registration_func_t doregister, |
|---|
| .. | .. |
|---|
| 99 | 166 | return 0; |
|---|
| 100 | 167 | } |
|---|
| 101 | 168 | static inline int unregister_cpu_under_node(unsigned int cpu, unsigned int nid) |
|---|
| 102 | | -{ |
|---|
| 103 | | - return 0; |
|---|
| 104 | | -} |
|---|
| 105 | | -static inline int register_mem_sect_under_node(struct memory_block *mem_blk, |
|---|
| 106 | | - void *arg) |
|---|
| 107 | 169 | { |
|---|
| 108 | 170 | return 0; |
|---|
| 109 | 171 | } |
|---|