Something went wrong. Try again.
(I'm so sorry!) Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214/* SPDX-License-Identifier: GPL-2.0 *//* * include/linux/node.h - generic node definition * * This is mainly for topological representation. We define the * basic 'struct node' here, which can be embedded in per-arch * definitions of processors. * * Basic handling of the devices is done in drivers/base/node.c * and system devices are handled in drivers/base/sys.c. * * Nodes are exported via driverfs in the class/node/devices/ * directory. */#ifndef _LINUX_NODE_H_#define _LINUX_NODE_H_
#include <linux/device.h>#include <linux/list.h>
/** * struct access_coordinate - generic performance coordinates container * * @read_bandwidth: Read bandwidth in MB/s * @write_bandwidth: Write bandwidth in MB/s * @read_latency: Read latency in nanoseconds * @write_latency: Write latency in nanoseconds */struct access_coordinate { unsigned int read_bandwidth; unsigned int write_bandwidth; unsigned int read_latency; unsigned int write_latency;};
/* * ACCESS_COORDINATE_LOCAL correlates to ACCESS CLASS 0 * - access_coordinate between target node and nearest initiator node * ACCESS_COORDINATE_CPU correlates to ACCESS CLASS 1 * - access_coordinate between target node and nearest CPU node */enum access_coordinate_class { ACCESS_COORDINATE_LOCAL, ACCESS_COORDINATE_CPU, ACCESS_COORDINATE_MAX};
enum cache_indexing { NODE_CACHE_DIRECT_MAP, NODE_CACHE_INDEXED, NODE_CACHE_OTHER,};
enum cache_write_policy { NODE_CACHE_WRITE_BACK, NODE_CACHE_WRITE_THROUGH, NODE_CACHE_WRITE_OTHER,};
enum cache_mode { NODE_CACHE_ADDR_MODE_RESERVED, NODE_CACHE_ADDR_MODE_EXTENDED_LINEAR,};
/** * struct node_cache_attrs - system memory caching attributes * * @indexing: The ways memory blocks may be placed in cache * @write_policy: Write back or write through policy * @size: Total size of cache in bytes * @line_size: Number of bytes fetched on a cache miss * @level: The cache hierarchy level * @address_mode: The address mode */struct node_cache_attrs { enum cache_indexing indexing; enum cache_write_policy write_policy; u64 size; u16 line_size; u8 level; u16 address_mode;};
#ifdef CONFIG_HMEM_REPORTINGvoid node_add_cache(unsigned int nid, struct node_cache_attrs *cache_attrs);void node_set_perf_attrs(unsigned int nid, struct access_coordinate *coord, enum access_coordinate_class access);void node_update_perf_attrs(unsigned int nid, struct access_coordinate *coord, enum access_coordinate_class access);#elsestatic inline void node_add_cache(unsigned int nid, struct node_cache_attrs *cache_attrs){}
static inline void node_set_perf_attrs(unsigned int nid, struct access_coordinate *coord, enum access_coordinate_class access){}
static inline void node_update_perf_attrs(unsigned int nid, struct access_coordinate *coord, enum access_coordinate_class access){}#endif
struct node { struct device dev; struct list_head access_list;#ifdef CONFIG_HMEM_REPORTING struct list_head cache_attrs; struct device *cache_dev;#endif};
struct memory_block;extern struct node *node_devices[];
#if defined(CONFIG_MEMORY_HOTPLUG) && defined(CONFIG_NUMA)void register_memory_blocks_under_node_hotplug(int nid, unsigned long start_pfn, unsigned long end_pfn);#elsestatic inline void register_memory_blocks_under_node_hotplug(int nid, unsigned long start_pfn, unsigned long end_pfn){}static inline void register_memory_blocks_under_nodes(void){}#endif
struct node_notify { int nid;};
#define NODE_ADDING_FIRST_MEMORY (1<<0)#define NODE_ADDED_FIRST_MEMORY (1<<1)#define NODE_CANCEL_ADDING_FIRST_MEMORY (1<<2)#define NODE_REMOVING_LAST_MEMORY (1<<3)#define NODE_REMOVED_LAST_MEMORY (1<<4)#define NODE_CANCEL_REMOVING_LAST_MEMORY (1<<5)
#if defined(CONFIG_MEMORY_HOTPLUG) && defined(CONFIG_NUMA)extern int register_node_notifier(struct notifier_block *nb);extern void unregister_node_notifier(struct notifier_block *nb);extern int node_notify(unsigned long val, void *v);
#define hotplug_node_notifier(fn, pri) ({ \ static __meminitdata struct notifier_block fn##_node_nb =\ { .notifier_call = fn, .priority = pri };\ register_node_notifier(&fn##_node_nb); \})#elsestatic inline int register_node_notifier(struct notifier_block *nb){ return 0;}static inline void unregister_node_notifier(struct notifier_block *nb){}static inline int node_notify(unsigned long val, void *v){ return 0;}static inline int hotplug_node_notifier(notifier_fn_t fn, int pri){ return 0;}#endif
#ifdef CONFIG_NUMAextern void node_dev_init(void);/* Core of the node registration - only memory hotplug should use this */int register_node(int nid);void unregister_node(int nid);extern int register_cpu_under_node(unsigned int cpu, unsigned int nid);extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid);extern void unregister_memory_block_under_nodes(struct memory_block *mem_blk);
extern int register_memory_node_under_compute_node(unsigned int mem_nid, unsigned int cpu_nid, enum access_coordinate_class access);#elsestatic inline void node_dev_init(void){}static inline int register_node(int nid){ return 0;}static inline int unregister_node(int nid){ return 0;}static inline int register_cpu_under_node(unsigned int cpu, unsigned int nid){ return 0;}static inline int unregister_cpu_under_node(unsigned int cpu, unsigned int nid){ return 0;}static inline void unregister_memory_block_under_nodes(struct memory_block *mem_blk){}#endif
#define to_node(device) container_of(device, struct node, dev)
#endif /* _LINUX_NODE_H_ */