internal.h 1.6 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
static inline void set_page_count(struct page *page, int v)
N
Nick Piggin 已提交
17
{
18 19 20 21 22 23 24 25 26
	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 已提交
27
	VM_BUG_ON(PageTail(page));
N
Nick Piggin 已提交
28
	VM_BUG_ON(atomic_read(&page->_count));
N
Nick Piggin 已提交
29 30 31
	set_page_count(page, 1);
}

32 33 34 35 36
static inline void __put_page(struct page *page)
{
	atomic_dec(&page->_count);
}

H
Harvey Harrison 已提交
37
extern void __init __free_pages_bootmem(struct page *page,
38
						unsigned int order);
39

40 41 42 43 44 45 46 47 48 49
/*
 * 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);
}
50 51 52 53 54 55 56 57 58 59 60 61 62

/*
 * 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

63
#endif