LCOV - code coverage report
Current view: top level - include/linux - node.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 8 9 88.9 %
Date: 2022-04-01 14:17:54 Functions: 1 1 100.0 %
Branches: 2 4 50.0 %

           Branch data     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                 :            : extern int link_mem_sections(int nid, unsigned long start_pfn,
     103                 :            :                              unsigned long end_pfn);
     104                 :            : #else
     105                 :            : static inline int link_mem_sections(int nid, unsigned long start_pfn,
     106                 :            :                                     unsigned long end_pfn)
     107                 :            : {
     108                 :            :         return 0;
     109                 :            : }
     110                 :            : #endif
     111                 :            : 
     112                 :            : extern void unregister_node(struct node *node);
     113                 :            : #ifdef CONFIG_NUMA
     114                 :            : /* Core of the node registration - only memory hotplug should use this */
     115                 :            : extern int __register_one_node(int nid);
     116                 :            : 
     117                 :            : /* Registers an online node */
     118                 :         11 : static inline int register_one_node(int nid)
     119                 :            : {
     120                 :         11 :         int error = 0;
     121                 :            : 
     122         [ +  - ]:         11 :         if (node_online(nid)) {
     123                 :         11 :                 struct pglist_data *pgdat = NODE_DATA(nid);
     124                 :         11 :                 unsigned long start_pfn = pgdat->node_start_pfn;
     125                 :         11 :                 unsigned long end_pfn = start_pfn + pgdat->node_spanned_pages;
     126                 :            : 
     127                 :         11 :                 error = __register_one_node(nid);
     128         [ -  + ]:         11 :                 if (error)
     129                 :          0 :                         return error;
     130                 :            :                 /* link memory sections under this node */
     131                 :            :                 error = link_mem_sections(nid, start_pfn, end_pfn);
     132                 :            :         }
     133                 :            : 
     134                 :            :         return error;
     135                 :            : }
     136                 :            : 
     137                 :            : extern void unregister_one_node(int nid);
     138                 :            : extern int register_cpu_under_node(unsigned int cpu, unsigned int nid);
     139                 :            : extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid);
     140                 :            : extern void unregister_memory_block_under_nodes(struct memory_block *mem_blk);
     141                 :            : 
     142                 :            : extern int register_memory_node_under_compute_node(unsigned int mem_nid,
     143                 :            :                                                    unsigned int cpu_nid,
     144                 :            :                                                    unsigned access);
     145                 :            : 
     146                 :            : #ifdef CONFIG_HUGETLBFS
     147                 :            : extern void register_hugetlbfs_with_node(node_registration_func_t doregister,
     148                 :            :                                          node_registration_func_t unregister);
     149                 :            : #endif
     150                 :            : #else
     151                 :            : static inline int __register_one_node(int nid)
     152                 :            : {
     153                 :            :         return 0;
     154                 :            : }
     155                 :            : static inline int register_one_node(int nid)
     156                 :            : {
     157                 :            :         return 0;
     158                 :            : }
     159                 :            : static inline int unregister_one_node(int nid)
     160                 :            : {
     161                 :            :         return 0;
     162                 :            : }
     163                 :            : static inline int register_cpu_under_node(unsigned int cpu, unsigned int nid)
     164                 :            : {
     165                 :            :         return 0;
     166                 :            : }
     167                 :            : static inline int unregister_cpu_under_node(unsigned int cpu, unsigned int nid)
     168                 :            : {
     169                 :            :         return 0;
     170                 :            : }
     171                 :            : static inline void unregister_memory_block_under_nodes(struct memory_block *mem_blk)
     172                 :            : {
     173                 :            : }
     174                 :            : 
     175                 :            : static inline void register_hugetlbfs_with_node(node_registration_func_t reg,
     176                 :            :                                                 node_registration_func_t unreg)
     177                 :            : {
     178                 :            : }
     179                 :            : #endif
     180                 :            : 
     181                 :            : #define to_node(device) container_of(device, struct node, dev)
     182                 :            : 
     183                 :            : #endif /* _LINUX_NODE_H_ */

Generated by: LCOV version 1.14