PageRenderTime 26ms CodeModel.GetById 22ms app.highlight 3ms RepoModel.GetById 0ms app.codeStats 0ms

/include/linux/memory.h

https://bitbucket.org/thekraven/iscream_thunderc-2.6.35
C++ Header | 148 lines | 96 code | 14 blank | 38 comment | 1 complexity | aa9488987b84d2ab0edd40242d1241d6 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  1/*
  2 * include/linux/memory.h - generic memory definition
  3 *
  4 * This is mainly for topological representation. We define the
  5 * basic "struct memory_block" here, which can be embedded in per-arch
  6 * definitions or NUMA information.
  7 *
  8 * Basic handling of the devices is done in drivers/base/memory.c
  9 * and system devices are handled in drivers/base/sys.c.
 10 *
 11 * Memory block are exported via sysfs in the class/memory/devices/
 12 * directory.
 13 *
 14 */
 15#ifndef _LINUX_MEMORY_H_
 16#define _LINUX_MEMORY_H_
 17
 18#include <linux/sysdev.h>
 19#include <linux/node.h>
 20#include <linux/compiler.h>
 21#include <linux/mutex.h>
 22
 23struct memory_block {
 24	unsigned long phys_index;
 25	unsigned long state;
 26	/*
 27	 * This serializes all state change requests.  It isn't
 28	 * held during creation because the control files are
 29	 * created long after the critical areas during
 30	 * initialization.
 31	 */
 32	struct mutex state_mutex;
 33	int phys_device;		/* to which fru does this belong? */
 34	void *hw;			/* optional pointer to fw/hw data */
 35	int (*phys_callback)(struct memory_block *);
 36	struct sys_device sysdev;
 37};
 38
 39int arch_get_memory_phys_device(unsigned long start_pfn);
 40
 41/* These states are exposed to userspace as text strings in sysfs */
 42#define	MEM_ONLINE		(1<<0) /* exposed to userspace */
 43#define	MEM_GOING_OFFLINE	(1<<1) /* exposed to userspace */
 44#define	MEM_OFFLINE		(1<<2) /* exposed to userspace */
 45#define	MEM_GOING_ONLINE	(1<<3)
 46#define	MEM_CANCEL_ONLINE	(1<<4)
 47#define	MEM_CANCEL_OFFLINE	(1<<5)
 48
 49struct memory_notify {
 50	unsigned long start_pfn;
 51	unsigned long nr_pages;
 52	int status_change_nid;
 53};
 54
 55/*
 56 * During pageblock isolation, count the number of pages within the
 57 * range [start_pfn, start_pfn + nr_pages) which are owned by code
 58 * in the notifier chain.
 59 */
 60#define MEM_ISOLATE_COUNT	(1<<0)
 61
 62struct memory_isolate_notify {
 63	unsigned long start_pfn;	/* Start of range to check */
 64	unsigned int nr_pages;		/* # pages in range to check */
 65	unsigned int pages_found;	/* # pages owned found by callbacks */
 66};
 67
 68struct notifier_block;
 69struct mem_section;
 70
 71/*
 72 * Priorities for the hotplug memory callback routines (stored in decreasing
 73 * order in the callback chain)
 74 */
 75#define SLAB_CALLBACK_PRI       1
 76#define IPC_CALLBACK_PRI        10
 77
 78#ifndef CONFIG_MEMORY_HOTPLUG_SPARSE
 79static inline int memory_dev_init(void)
 80{
 81	return 0;
 82}
 83static inline int register_memory_notifier(struct notifier_block *nb)
 84{
 85	return 0;
 86}
 87static inline void unregister_memory_notifier(struct notifier_block *nb)
 88{
 89}
 90static inline int memory_notify(unsigned long val, void *v)
 91{
 92	return 0;
 93}
 94static inline int register_memory_isolate_notifier(struct notifier_block *nb)
 95{
 96	return 0;
 97}
 98static inline void unregister_memory_isolate_notifier(struct notifier_block *nb)
 99{
100}
101static inline int memory_isolate_notify(unsigned long val, void *v)
102{
103	return 0;
104}
105#else
106extern int register_memory_notifier(struct notifier_block *nb);
107extern void unregister_memory_notifier(struct notifier_block *nb);
108extern int register_memory_isolate_notifier(struct notifier_block *nb);
109extern void unregister_memory_isolate_notifier(struct notifier_block *nb);
110extern int register_new_memory(int, struct mem_section *);
111extern int unregister_memory_section(struct mem_section *);
112extern int memory_dev_init(void);
113extern int remove_memory_block(unsigned long, struct mem_section *, int);
114extern int memory_notify(unsigned long val, void *v);
115extern int memory_isolate_notify(unsigned long val, void *v);
116extern struct memory_block *find_memory_block(struct mem_section *);
117#define CONFIG_MEM_BLOCK_SIZE	(PAGES_PER_SECTION<<PAGE_SHIFT)
118enum mem_add_context { BOOT, HOTPLUG };
119#endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */
120
121#ifdef CONFIG_MEMORY_HOTPLUG
122#define hotplug_memory_notifier(fn, pri) {			\
123	static __meminitdata struct notifier_block fn##_mem_nb =\
124		{ .notifier_call = fn, .priority = pri };	\
125	register_memory_notifier(&fn##_mem_nb);			\
126}
127#else
128#define hotplug_memory_notifier(fn, pri) do { } while (0)
129#endif
130
131/*
132 * 'struct memory_accessor' is a generic interface to provide
133 * in-kernel access to persistent memory such as i2c or SPI EEPROMs
134 */
135struct memory_accessor {
136	ssize_t (*read)(struct memory_accessor *, char *buf, off_t offset,
137			size_t count);
138	ssize_t (*write)(struct memory_accessor *, const char *buf,
139			 off_t offset, size_t count);
140};
141
142/*
143 * Kernel text modification mutex, used for code patching. Users of this lock
144 * can sleep.
145 */
146extern struct mutex text_mutex;
147
148#endif /* _LINUX_MEMORY_H_ */