|  | /* 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. | 
|  | */ | 
|  | #ifndef __MM_INTERNAL_H | 
|  | #define __MM_INTERNAL_H | 
|  |  | 
|  | #include <linux/mm.h> | 
|  |  | 
|  | void free_pgtables(struct mmu_gather *tlb, struct vm_area_struct *start_vma, | 
|  | unsigned long floor, unsigned long ceiling); | 
|  |  | 
|  | extern void prep_compound_page(struct page *page, unsigned long order); | 
|  |  | 
|  | static inline void set_page_count(struct page *page, int v) | 
|  | { | 
|  | 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) | 
|  | { | 
|  | VM_BUG_ON(PageTail(page)); | 
|  | VM_BUG_ON(atomic_read(&page->_count)); | 
|  | set_page_count(page, 1); | 
|  | } | 
|  |  | 
|  | static inline void __put_page(struct page *page) | 
|  | { | 
|  | atomic_dec(&page->_count); | 
|  | } | 
|  |  | 
|  | extern void __free_pages_bootmem(struct page *page, unsigned int order); | 
|  |  | 
|  | /* | 
|  | * 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); | 
|  | } | 
|  |  | 
|  | /* | 
|  | * 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 | 
|  |  | 
|  | /* 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) | 
|  |  | 
|  | 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); | 
|  | extern void mminit_verify_zonelist(void); | 
|  |  | 
|  | #else | 
|  |  | 
|  | static inline void mminit_dprintk(enum mminit_level level, | 
|  | const char *prefix, const char *fmt, ...) | 
|  | { | 
|  | } | 
|  |  | 
|  | 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) | 
|  | { | 
|  | } | 
|  |  | 
|  | static inline void mminit_verify_zonelist(void) | 
|  | { | 
|  | } | 
|  | #endif /* CONFIG_DEBUG_MEMORY_INIT */ | 
|  |  | 
|  | /* 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 */ | 
|  |  | 
|  | #endif |