Blame view
include/linux/memory.h
4.54 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> |
3947be196
|
20 |
|
a63fdc515
|
21 |
#define MIN_MEMORY_BLOCK_SIZE (1 << SECTION_SIZE_BITS) |
3947be196
|
22 |
struct memory_block { |
d33601644
|
23 24 |
unsigned long start_section_nr; unsigned long end_section_nr; |
3947be196
|
25 |
unsigned long state; |
076812159
|
26 |
int section_count; |
3947be196
|
27 28 29 30 31 32 |
/* * This serializes all state change requests. It isn't * held during creation because the control files are * created long after the critical areas during * initialization. */ |
da19cbcf7
|
33 |
struct mutex state_mutex; |
3947be196
|
34 35 36 |
int phys_device; /* to which fru does this belong? */ void *hw; /* optional pointer to fw/hw data */ int (*phys_callback)(struct memory_block *); |
10fbcf4c6
|
37 |
struct device dev; |
3947be196
|
38 |
}; |
bc32df008
|
39 |
int arch_get_memory_phys_device(unsigned long start_pfn); |
3947be196
|
40 41 42 43 |
/* 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
|
44 45 46 |
#define MEM_GOING_ONLINE (1<<3) #define MEM_CANCEL_ONLINE (1<<4) #define MEM_CANCEL_OFFLINE (1<<5) |
3947be196
|
47 |
|
7b78d335a
|
48 49 50 51 52 |
struct memory_notify { unsigned long start_pfn; unsigned long nr_pages; 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 *); |
3947be196
|
108 109 |
extern int unregister_memory_section(struct mem_section *); extern int memory_dev_init(void); |
b792de39d
|
110 |
extern int remove_memory_block(unsigned long, struct mem_section *, int); |
7b78d335a
|
111 |
extern int memory_notify(unsigned long val, void *v); |
925cc71e5
|
112 |
extern int memory_isolate_notify(unsigned long val, void *v); |
98383031e
|
113 114 |
extern struct memory_block *find_memory_block_hinted(struct mem_section *, struct memory_block *); |
c04fc586c
|
115 |
extern struct memory_block *find_memory_block(struct mem_section *); |
3947be196
|
116 |
#define CONFIG_MEM_BLOCK_SIZE (PAGES_PER_SECTION<<PAGE_SHIFT) |
c04fc586c
|
117 |
enum mem_add_context { BOOT, HOTPLUG }; |
53947027a
|
118 |
#endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */ |
3947be196
|
119 |
|
b9049e234
|
120 |
#ifdef CONFIG_MEMORY_HOTPLUG |
3947be196
|
121 |
#define hotplug_memory_notifier(fn, pri) { \ |
02d0e6753
|
122 |
static __meminitdata struct notifier_block fn##_mem_nb =\ |
3947be196
|
123 124 125 |
{ .notifier_call = fn, .priority = pri }; \ register_memory_notifier(&fn##_mem_nb); \ } |
b9049e234
|
126 127 128 |
#else #define hotplug_memory_notifier(fn, pri) do { } while (0) #endif |
3947be196
|
129 |
|
06c421ee0
|
130 131 132 133 134 135 136 137 138 139 |
/* * '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
|
140 |
/* |
0e39ac444
|
141 142 143 144 |
* Kernel text modification mutex, used for code patching. Users of this lock * can sleep. */ extern struct mutex text_mutex; |
3947be196
|
145 |
#endif /* _LINUX_MEMORY_H_ */ |