linux/include/linux/node.h
<<
>>
Prefs
   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
  22struct 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
  30struct memory_block;
  31extern struct node *node_devices[];
  32typedef  void (*node_registration_func_t)(struct node *);
  33
  34#if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) && defined(CONFIG_NUMA)
  35extern int link_mem_sections(int nid, unsigned long start_pfn,
  36                             unsigned long end_pfn);
  37#else
  38static inline int link_mem_sections(int nid, unsigned long start_pfn,
  39                                    unsigned long end_pfn)
  40{
  41        return 0;
  42}
  43#endif
  44
  45extern void unregister_node(struct node *node);
  46#ifdef CONFIG_NUMA
  47/* Core of the node registration - only memory hotplug should use this */
  48extern int __register_one_node(int nid);
  49
  50/* Registers an online node */
  51static 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
  70extern void unregister_one_node(int nid);
  71extern int register_cpu_under_node(unsigned int cpu, unsigned int nid);
  72extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid);
  73extern int register_mem_sect_under_node(struct memory_block *mem_blk,
  74                                                void *arg);
  75extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk,
  76                                           unsigned long phys_index);
  77
  78#ifdef CONFIG_HUGETLBFS
  79extern void register_hugetlbfs_with_node(node_registration_func_t doregister,
  80                                         node_registration_func_t unregister);
  81#endif
  82#else
  83static inline int __register_one_node(int nid)
  84{
  85        return 0;
  86}
  87static inline int register_one_node(int nid)
  88{
  89        return 0;
  90}
  91static inline int unregister_one_node(int nid)
  92{
  93        return 0;
  94}
  95static inline int register_cpu_under_node(unsigned int cpu, unsigned int nid)
  96{
  97        return 0;
  98}
  99static inline int unregister_cpu_under_node(unsigned int cpu, unsigned int nid)
 100{
 101        return 0;
 102}
 103static inline int register_mem_sect_under_node(struct memory_block *mem_blk,
 104                                                        void *arg)
 105{
 106        return 0;
 107}
 108static inline int unregister_mem_sect_under_nodes(struct memory_block *mem_blk,
 109                                                  unsigned long phys_index)
 110{
 111        return 0;
 112}
 113
 114static 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