LCOV - code coverage report
Current view: top level - include/linux - node.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 9 9 100.0 %
Date: 2021-04-22 12:43:58 Functions: 1 1 100.0 %

          Line data    Source code
       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/list.h>
      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
      83             : 
      84             : struct node {
      85             :         struct device   dev;
      86             :         struct list_head access_list;
      87             : 
      88             : #if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) && defined(CONFIG_HUGETLBFS)
      89             :         struct work_struct      node_work;
      90             : #endif
      91             : #ifdef CONFIG_HMEM_REPORTING
      92             :         struct list_head cache_attrs;
      93             :         struct device *cache_dev;
      94             : #endif
      95             : };
      96             : 
      97             : struct memory_block;
      98             : extern struct node *node_devices[];
      99             : typedef  void (*node_registration_func_t)(struct node *);
     100             : 
     101             : #if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) && defined(CONFIG_NUMA)
     102             : void link_mem_sections(int nid, unsigned long start_pfn,
     103             :                        unsigned long end_pfn,
     104             :                        enum meminit_context context);
     105             : #else
     106             : static inline void link_mem_sections(int nid, unsigned long start_pfn,
     107             :                                      unsigned long end_pfn,
     108             :                                      enum meminit_context context)
     109             : {
     110             : }
     111             : #endif
     112             : 
     113             : extern void unregister_node(struct node *node);
     114             : #ifdef CONFIG_NUMA
     115             : /* Core of the node registration - only memory hotplug should use this */
     116             : extern int __register_one_node(int nid);
     117             : 
     118             : /* Registers an online node */
     119           1 : static inline int register_one_node(int nid)
     120             : {
     121           1 :         int error = 0;
     122             : 
     123           1 :         if (node_online(nid)) {
     124           1 :                 struct pglist_data *pgdat = NODE_DATA(nid);
     125           1 :                 unsigned long start_pfn = pgdat->node_start_pfn;
     126           1 :                 unsigned long end_pfn = start_pfn + pgdat->node_spanned_pages;
     127             : 
     128           1 :                 error = __register_one_node(nid);
     129           1 :                 if (error)
     130             :                         return error;
     131             :                 /* link memory sections under this node */
     132           1 :                 link_mem_sections(nid, start_pfn, end_pfn, MEMINIT_EARLY);
     133             :         }
     134             : 
     135             :         return error;
     136             : }
     137             : 
     138             : extern void unregister_one_node(int nid);
     139             : extern int register_cpu_under_node(unsigned int cpu, unsigned int nid);
     140             : extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid);
     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);
     146             : 
     147             : #ifdef CONFIG_HUGETLBFS
     148             : extern void register_hugetlbfs_with_node(node_registration_func_t doregister,
     149             :                                          node_registration_func_t unregister);
     150             : #endif
     151             : #else
     152             : static inline int __register_one_node(int nid)
     153             : {
     154             :         return 0;
     155             : }
     156             : static inline int register_one_node(int nid)
     157             : {
     158             :         return 0;
     159             : }
     160             : static inline int unregister_one_node(int nid)
     161             : {
     162             :         return 0;
     163             : }
     164             : static inline int register_cpu_under_node(unsigned int cpu, unsigned int nid)
     165             : {
     166             :         return 0;
     167             : }
     168             : static inline int unregister_cpu_under_node(unsigned int cpu, unsigned int nid)
     169             : {
     170             :         return 0;
     171             : }
     172             : static inline void unregister_memory_block_under_nodes(struct memory_block *mem_blk)
     173             : {
     174             : }
     175             : 
     176             : static inline void register_hugetlbfs_with_node(node_registration_func_t reg,
     177             :                                                 node_registration_func_t unreg)
     178             : {
     179             : }
     180             : #endif
     181             : 
     182             : #define to_node(device) container_of(device, struct node, dev)
     183             : 
     184             : #endif /* _LINUX_NODE_H_ */

Generated by: LCOV version 1.14