internal.h 3.8 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10
/* internal.h: mm/ internal definitions
 *
 * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
 * Written by David Howells (dhowells@redhat.com)
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 */
11 12 13 14
#ifndef __MM_INTERNAL_H
#define __MM_INTERNAL_H

#include <linux/mm.h>
L
Linus Torvalds 已提交
15

16 17 18
void free_pgtables(struct mmu_gather *tlb, struct vm_area_struct *start_vma,
		unsigned long floor, unsigned long ceiling);

A
Andi Kleen 已提交
19 20
extern void prep_compound_page(struct page *page, unsigned long order);

21
static inline void set_page_count(struct page *page, int v)
N
Nick Piggin 已提交
22
{
23 24 25 26 27 28 29 30 31
	atomic_set(&page->_count, v);
}

/*
 * Turn a non-refcounted page (->_count == 0) into refcounted with
 * a count of one.
 */
static inline void set_page_refcounted(struct page *page)
{
Q
Qi Yong 已提交
32
	VM_BUG_ON(PageTail(page));
N
Nick Piggin 已提交
33
	VM_BUG_ON(atomic_read(&page->_count));
N
Nick Piggin 已提交
34 35 36
	set_page_count(page, 1);
}

37 38 39 40 41
static inline void __put_page(struct page *page)
{
	atomic_dec(&page->_count);
}

L
Lee Schermerhorn 已提交
42 43 44
/*
 * in mm/vmscan.c:
 */
45
extern int isolate_lru_page(struct page *page);
L
Lee Schermerhorn 已提交
46
extern void putback_lru_page(struct page *page);
47

L
Lee Schermerhorn 已提交
48 49 50
/*
 * in mm/page_alloc.c
 */
51
extern void __free_pages_bootmem(struct page *page, unsigned int order);
52

53 54 55 56 57 58 59 60 61 62
/*
 * function for dealing with page's order in buddy system.
 * zone->lock is already acquired when we use these.
 * So, we don't need atomic page->flags operations here.
 */
static inline unsigned long page_order(struct page *page)
{
	VM_BUG_ON(!PageBuddy(page));
	return page_private(page);
}
63

L
Lee Schermerhorn 已提交
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
#ifdef CONFIG_UNEVICTABLE_LRU
/*
 * unevictable_migrate_page() called only from migrate_page_copy() to
 * migrate unevictable flag to new page.
 * Note that the old page has been isolated from the LRU lists at this
 * point so we don't need to worry about LRU statistics.
 */
static inline void unevictable_migrate_page(struct page *new, struct page *old)
{
	if (TestClearPageUnevictable(old))
		SetPageUnevictable(new);
}
#else
static inline void unevictable_migrate_page(struct page *new, struct page *old)
{
}
#endif


83 84 85 86 87 88 89 90 91 92 93 94
/*
 * FLATMEM and DISCONTIGMEM configurations use alloc_bootmem_node,
 * so all functions starting at paging_init should be marked __init
 * in those cases. SPARSEMEM, however, allows for memory hotplug,
 * and alloc_bootmem_node is not used.
 */
#ifdef CONFIG_SPARSEMEM
#define __paginginit __meminit
#else
#define __paginginit __init
#endif

95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
/* Memory initialisation debug and verification */
enum mminit_level {
	MMINIT_WARNING,
	MMINIT_VERIFY,
	MMINIT_TRACE
};

#ifdef CONFIG_DEBUG_MEMORY_INIT

extern int mminit_loglevel;

#define mminit_dprintk(level, prefix, fmt, arg...) \
do { \
	if (level < mminit_loglevel) { \
		printk(level <= MMINIT_WARNING ? KERN_WARNING : KERN_DEBUG); \
		printk(KERN_CONT "mminit::" prefix " " fmt, ##arg); \
	} \
} while (0)

114 115 116
extern void mminit_verify_pageflags_layout(void);
extern void mminit_verify_page_links(struct page *page,
		enum zone_type zone, unsigned long nid, unsigned long pfn);
117
extern void mminit_verify_zonelist(void);
118

119 120 121 122 123 124 125
#else

static inline void mminit_dprintk(enum mminit_level level,
				const char *prefix, const char *fmt, ...)
{
}

126 127 128 129 130 131 132 133
static inline void mminit_verify_pageflags_layout(void)
{
}

static inline void mminit_verify_page_links(struct page *page,
		enum zone_type zone, unsigned long nid, unsigned long pfn)
{
}
134 135 136 137

static inline void mminit_verify_zonelist(void)
{
}
138
#endif /* CONFIG_DEBUG_MEMORY_INIT */
139 140 141 142 143 144 145 146 147 148 149 150

/* mminit_validate_memmodel_limits is independent of CONFIG_DEBUG_MEMORY_INIT */
#if defined(CONFIG_SPARSEMEM)
extern void mminit_validate_memmodel_limits(unsigned long *start_pfn,
				unsigned long *end_pfn);
#else
static inline void mminit_validate_memmodel_limits(unsigned long *start_pfn,
				unsigned long *end_pfn)
{
}
#endif /* CONFIG_SPARSEMEM */

151
#endif