1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * include/linux/node.h - generic node definition 4 * 5 * This is mainly for topological representation. We define the 6 * basic 'struct node' here, which can be embedded in per-arch 7 * definitions of processors. 8 * 9 * Basic handling of the devices is done in drivers/base/node.c 10 * and system devices are handled in drivers/base/sys.c. 11 * 12 * Nodes are exported via driverfs in the class/node/devices/ 13 * directory. 14 */ 15 #ifndef _LINUX_NODE_H_ 16 #define _LINUX_NODE_H_ 17 18 #include <linux/device.h> 19 #include <linux/cpumask.h> 20 #include <linux/workqueue.h> 21 22 struct node { 23 struct device dev; 24 25 #if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) && defined(CONFIG_HUGETLBFS) 26 struct work_struct node_work; 27 #endif 28 }; 29 30 struct memory_block; 31 extern struct node *node_devices[]; 32 typedef void (*node_registration_func_t)(struct node *); 33 34 #if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) && defined(CONFIG_NUMA) 35 extern int link_mem_sections(int nid, unsigned long start_pfn, 36 unsigned long end_pfn); 37 #else 38 static inline int link_mem_sections(int nid, unsigned long start_pfn, 39 unsigned long end_pfn) 40 { 41 return 0; 42 } 43 #endif 44 45 extern void unregister_node(struct node *node); 46 #ifdef CONFIG_NUMA 47 /* Core of the node registration - only memory hotplug should use this */ 48 extern int __register_one_node(int nid); 49 50 /* Registers an online node */ 51 static inline int register_one_node(int nid) 52 { 53 int error = 0; 54 55 if (node_online(nid)) { 56 struct pglist_data *pgdat = NODE_DATA(nid); 57 unsigned long start_pfn = pgdat->node_start_pfn; 58 unsigned long end_pfn = start_pfn + pgdat->node_spanned_pages; 59 60 error = __register_one_node(nid); 61 if (error) 62 return error; 63 /* link memory sections under this node */ 64 error = link_mem_sections(nid, start_pfn, end_pfn); 65 } 66 67 return error; 68 } 69 70 extern void unregister_one_node(int nid); 71 extern int register_cpu_under_node(unsigned int cpu, unsigned int nid); 72 extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid); 73 extern int register_mem_sect_under_node(struct memory_block *mem_blk, 74 void *arg); 75 extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, 76 unsigned long phys_index); 77 78 #ifdef CONFIG_HUGETLBFS 79 extern void register_hugetlbfs_with_node(node_registration_func_t doregister, 80 node_registration_func_t unregister); 81 #endif 82 #else 83 static inline int __register_one_node(int nid) 84 { 85 return 0; 86 } 87 static inline int register_one_node(int nid) 88 { 89 return 0; 90 } 91 static inline int unregister_one_node(int nid) 92 { 93 return 0; 94 } 95 static inline int register_cpu_under_node(unsigned int cpu, unsigned int nid) 96 { 97 return 0; 98 } 99 static inline int unregister_cpu_under_node(unsigned int cpu, unsigned int nid) 100 { 101 return 0; 102 } 103 static inline int register_mem_sect_under_node(struct memory_block *mem_blk, 104 void *arg) 105 { 106 return 0; 107 } 108 static inline int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, 109 unsigned long phys_index) 110 { 111 return 0; 112 } 113 114 static inline void register_hugetlbfs_with_node(node_registration_func_t reg, 115 node_registration_func_t unreg) 116 { 117 } 118 #endif 119 120 #define to_node(device) container_of(device, struct node, dev) 121 122 #endif /* _LINUX_NODE_H_ */ 123