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, unsigned long nr_pages); 36 #else 37 static inline int link_mem_sections(int nid, unsigned long start_pfn, unsigned long nr_pages) 38 { 39 return 0; 40 } 41 #endif 42 43 extern void unregister_node(struct node *node); 44 #ifdef CONFIG_NUMA 45 /* Core of the node registration - only memory hotplug should use this */ 46 extern int __register_one_node(int nid); 47 48 /* Registers an online node */ 49 static inline int register_one_node(int nid) 50 { 51 int error = 0; 52 53 if (node_online(nid)) { 54 struct pglist_data *pgdat = NODE_DATA(nid); 55 56 error = __register_one_node(nid); 57 if (error) 58 return error; 59 /* link memory sections under this node */ 60 error = link_mem_sections(nid, pgdat->node_start_pfn, pgdat->node_spanned_pages); 61 } 62 63 return error; 64 } 65 66 extern void unregister_one_node(int nid); 67 extern int register_cpu_under_node(unsigned int cpu, unsigned int nid); 68 extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid); 69 extern int register_mem_sect_under_node(struct memory_block *mem_blk, 70 int nid, bool check_nid); 71 extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, 72 unsigned long phys_index); 73 74 #ifdef CONFIG_HUGETLBFS 75 extern void register_hugetlbfs_with_node(node_registration_func_t doregister, 76 node_registration_func_t unregister); 77 #endif 78 #else 79 static inline int __register_one_node(int nid) 80 { 81 return 0; 82 } 83 static inline int register_one_node(int nid) 84 { 85 return 0; 86 } 87 static inline int unregister_one_node(int nid) 88 { 89 return 0; 90 } 91 static inline int register_cpu_under_node(unsigned int cpu, unsigned int nid) 92 { 93 return 0; 94 } 95 static inline int unregister_cpu_under_node(unsigned int cpu, unsigned int nid) 96 { 97 return 0; 98 } 99 static inline int register_mem_sect_under_node(struct memory_block *mem_blk, 100 int nid, bool check_nid) 101 { 102 return 0; 103 } 104 static inline int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, 105 unsigned long phys_index) 106 { 107 return 0; 108 } 109 110 static inline void register_hugetlbfs_with_node(node_registration_func_t reg, 111 node_registration_func_t unreg) 112 { 113 } 114 #endif 115 116 #define to_node(device) container_of(device, struct node, dev) 117 118 #endif /* _LINUX_NODE_H_ */ 119