Blame view
include/linux/memory.h
4.82 KB
3947be196
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/* * include/linux/memory.h - generic memory definition * * This is mainly for topological representation. We define the * basic "struct memory_block" here, which can be embedded in per-arch * definitions or NUMA information. * * Basic handling of the devices is done in drivers/base/memory.c * and system devices are handled in drivers/base/sys.c. * * Memory block are exported via sysfs in the class/memory/devices/ * directory. * */ #ifndef _LINUX_MEMORY_H_ #define _LINUX_MEMORY_H_ |
3947be196
|
17 18 |
#include <linux/node.h> #include <linux/compiler.h> |
da19cbcf7
|
19 |
#include <linux/mutex.h> |
f02c69680
|
20 |
#include <linux/notifier.h> |
3947be196
|
21 |
|
05cf96398
|
22 |
#define MIN_MEMORY_BLOCK_SIZE (1UL << SECTION_SIZE_BITS) |
a63fdc515
|
23 |
|
3947be196
|
24 |
struct memory_block { |
d33601644
|
25 26 |
unsigned long start_section_nr; unsigned long end_section_nr; |
fa2be40fe
|
27 28 29 |
unsigned long state; /* serialized by the dev->lock */ int section_count; /* serialized by mem_sysfs_mutex */ int online_type; /* for passing data to online routine */ |
3947be196
|
30 31 32 |
int phys_device; /* to which fru does this belong? */ void *hw; /* optional pointer to fw/hw data */ int (*phys_callback)(struct memory_block *); |
10fbcf4c6
|
33 |
struct device dev; |
3947be196
|
34 |
}; |
bc32df008
|
35 |
int arch_get_memory_phys_device(unsigned long start_pfn); |
e0a8400c6
|
36 |
unsigned long memory_block_size_bytes(void); |
bc32df008
|
37 |
|
3947be196
|
38 39 40 41 |
/* These states are exposed to userspace as text strings in sysfs */ #define MEM_ONLINE (1<<0) /* exposed to userspace */ #define MEM_GOING_OFFLINE (1<<1) /* exposed to userspace */ #define MEM_OFFLINE (1<<2) /* exposed to userspace */ |
7b78d335a
|
42 43 44 |
#define MEM_GOING_ONLINE (1<<3) #define MEM_CANCEL_ONLINE (1<<4) #define MEM_CANCEL_OFFLINE (1<<5) |
3947be196
|
45 |
|
7b78d335a
|
46 47 48 |
struct memory_notify { unsigned long start_pfn; unsigned long nr_pages; |
d9713679d
|
49 |
int status_change_nid_normal; |
6715ddf94
|
50 |
int status_change_nid_high; |
7b78d335a
|
51 52 |
int status_change_nid; }; |
3947be196
|
53 |
|
925cc71e5
|
54 55 56 57 58 59 60 61 62 63 64 65 |
/* * During pageblock isolation, count the number of pages within the * range [start_pfn, start_pfn + nr_pages) which are owned by code * in the notifier chain. */ #define MEM_ISOLATE_COUNT (1<<0) struct memory_isolate_notify { unsigned long start_pfn; /* Start of range to check */ unsigned int nr_pages; /* # pages in range to check */ unsigned int pages_found; /* # pages owned found by callbacks */ }; |
8c65b4a60
|
66 67 |
struct notifier_block; struct mem_section; |
0c40ba4fd
|
68 69 70 71 72 |
/* * Priorities for the hotplug memory callback routines (stored in decreasing * order in the callback chain) */ #define SLAB_CALLBACK_PRI 1 |
b6b337ad1
|
73 |
#define IPC_CALLBACK_PRI 10 |
0c40ba4fd
|
74 |
|
53947027a
|
75 |
#ifndef CONFIG_MEMORY_HOTPLUG_SPARSE |
3947be196
|
76 77 78 79 80 81 82 83 84 85 86 |
static inline int memory_dev_init(void) { return 0; } static inline int register_memory_notifier(struct notifier_block *nb) { return 0; } static inline void unregister_memory_notifier(struct notifier_block *nb) { } |
7b78d335a
|
87 88 89 90 |
static inline int memory_notify(unsigned long val, void *v) { return 0; } |
925cc71e5
|
91 92 93 94 95 96 97 98 99 100 101 |
static inline int register_memory_isolate_notifier(struct notifier_block *nb) { return 0; } static inline void unregister_memory_isolate_notifier(struct notifier_block *nb) { } static inline int memory_isolate_notify(unsigned long val, void *v) { return 0; } |
3947be196
|
102 |
#else |
7b78d335a
|
103 104 |
extern int register_memory_notifier(struct notifier_block *nb); extern void unregister_memory_notifier(struct notifier_block *nb); |
925cc71e5
|
105 106 |
extern int register_memory_isolate_notifier(struct notifier_block *nb); extern void unregister_memory_isolate_notifier(struct notifier_block *nb); |
c04fc586c
|
107 |
extern int register_new_memory(int, struct mem_section *); |
4edd7ceff
|
108 |
#ifdef CONFIG_MEMORY_HOTREMOVE |
3947be196
|
109 |
extern int unregister_memory_section(struct mem_section *); |
4edd7ceff
|
110 |
#endif |
3947be196
|
111 |
extern int memory_dev_init(void); |
7b78d335a
|
112 |
extern int memory_notify(unsigned long val, void *v); |
925cc71e5
|
113 |
extern int memory_isolate_notify(unsigned long val, void *v); |
98383031e
|
114 115 |
extern struct memory_block *find_memory_block_hinted(struct mem_section *, struct memory_block *); |
c04fc586c
|
116 |
extern struct memory_block *find_memory_block(struct mem_section *); |
3947be196
|
117 |
#define CONFIG_MEM_BLOCK_SIZE (PAGES_PER_SECTION<<PAGE_SHIFT) |
53947027a
|
118 |
#endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */ |
3947be196
|
119 |
|
b9049e234
|
120 |
#ifdef CONFIG_MEMORY_HOTPLUG |
f02c69680
|
121 |
#define hotplug_memory_notifier(fn, pri) ({ \ |
02d0e6753
|
122 |
static __meminitdata struct notifier_block fn##_mem_nb =\ |
f02c69680
|
123 |
{ .notifier_call = fn, .priority = pri };\ |
3947be196
|
124 |
register_memory_notifier(&fn##_mem_nb); \ |
f02c69680
|
125 126 127 |
}) #define register_hotmemory_notifier(nb) register_memory_notifier(nb) #define unregister_hotmemory_notifier(nb) unregister_memory_notifier(nb) |
b9049e234
|
128 |
#else |
ace6128d6
|
129 |
#define hotplug_memory_notifier(fn, pri) ({ 0; }) |
f02c69680
|
130 131 132 |
/* These aren't inline functions due to a GCC bug. */ #define register_hotmemory_notifier(nb) ({ (void)(nb); 0; }) #define unregister_hotmemory_notifier(nb) ({ (void)(nb); }) |
b9049e234
|
133 |
#endif |
3947be196
|
134 |
|
06c421ee0
|
135 136 137 138 139 140 141 142 143 144 |
/* * 'struct memory_accessor' is a generic interface to provide * in-kernel access to persistent memory such as i2c or SPI EEPROMs */ struct memory_accessor { ssize_t (*read)(struct memory_accessor *, char *buf, off_t offset, size_t count); ssize_t (*write)(struct memory_accessor *, const char *buf, off_t offset, size_t count); }; |
714f83d5d
|
145 |
/* |
0e39ac444
|
146 147 148 149 |
* Kernel text modification mutex, used for code patching. Users of this lock * can sleep. */ extern struct mutex text_mutex; |
3947be196
|
150 |
#endif /* _LINUX_MEMORY_H_ */ |