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 nr_pages, bool check_nid); 37 #else 38 static inline int link_mem_sections(int nid, unsigned long start_pfn, 39 unsigned long nr_pages, bool check_nid) 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 58 error = __register_one_node(nid); 59 if (error) 60 return error; 61 /* link memory sections under this node */ 62 error = link_mem_sections(nid, pgdat->node_start_pfn, pgdat->node_spanned_pages, true); 63 } 64 65 return error; 66 } 67 68 extern void unregister_one_node(int nid); 69 extern int register_cpu_under_node(unsigned int cpu, unsigned int nid); 70 extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid); 71 extern int register_mem_sect_under_node(struct memory_block *mem_blk, 72 int nid, bool check_nid); 73 extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, 74 unsigned long phys_index); 75 76 #ifdef CONFIG_HUGETLBFS 77 extern void register_hugetlbfs_with_node(node_registration_func_t doregister, 78 node_registration_func_t unregister); 79 #endif 80 #else 81 static inline int __register_one_node(int nid) 82 { 83 return 0; 84 } 85 static inline int register_one_node(int nid) 86 { 87 return 0; 88 } 89 static inline int unregister_one_node(int nid) 90 { 91 return 0; 92 } 93 static inline int register_cpu_under_node(unsigned int cpu, unsigned int nid) 94 { 95 return 0; 96 } 97 static inline int unregister_cpu_under_node(unsigned int cpu, unsigned int nid) 98 { 99 return 0; 100 } 101 static inline int register_mem_sect_under_node(struct memory_block *mem_blk, 102 int nid, bool check_nid) 103 { 104 return 0; 105 } 106 static inline int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, 107 unsigned long phys_index) 108 { 109 return 0; 110 } 111 112 static inline void register_hugetlbfs_with_node(node_registration_func_t reg, 113 node_registration_func_t unreg) 114 { 115 } 116 #endif 117 118 #define to_node(device) container_of(device, struct node, dev) 119 120 #endif /* _LINUX_NODE_H_ */ 121