1 #ifndef _LINUX_PAGE_REF_H 2 #define _LINUX_PAGE_REF_H 3 4 #include <linux/atomic.h> 5 #include <linux/mm_types.h> 6 #include <linux/page-flags.h> 7 8 static inline int page_ref_count(struct page *page) 9 { 10 return atomic_read(&page->_count); 11 } 12 13 static inline int page_count(struct page *page) 14 { 15 return atomic_read(&compound_head(page)->_count); 16 } 17 18 static inline void set_page_count(struct page *page, int v) 19 { 20 atomic_set(&page->_count, v); 21 } 22 23 /* 24 * Setup the page count before being freed into the page allocator for 25 * the first time (boot or memory hotplug) 26 */ 27 static inline void init_page_count(struct page *page) 28 { 29 set_page_count(page, 1); 30 } 31 32 static inline void page_ref_add(struct page *page, int nr) 33 { 34 atomic_add(nr, &page->_count); 35 } 36 37 static inline void page_ref_sub(struct page *page, int nr) 38 { 39 atomic_sub(nr, &page->_count); 40 } 41 42 static inline void page_ref_inc(struct page *page) 43 { 44 atomic_inc(&page->_count); 45 } 46 47 static inline void page_ref_dec(struct page *page) 48 { 49 atomic_dec(&page->_count); 50 } 51 52 static inline int page_ref_sub_and_test(struct page *page, int nr) 53 { 54 return atomic_sub_and_test(nr, &page->_count); 55 } 56 57 static inline int page_ref_dec_and_test(struct page *page) 58 { 59 return atomic_dec_and_test(&page->_count); 60 } 61 62 static inline int page_ref_dec_return(struct page *page) 63 { 64 return atomic_dec_return(&page->_count); 65 } 66 67 static inline int page_ref_add_unless(struct page *page, int nr, int u) 68 { 69 return atomic_add_unless(&page->_count, nr, u); 70 } 71 72 static inline int page_ref_freeze(struct page *page, int count) 73 { 74 return likely(atomic_cmpxchg(&page->_count, count, 0) == count); 75 } 76 77 static inline void page_ref_unfreeze(struct page *page, int count) 78 { 79 VM_BUG_ON_PAGE(page_count(page) != 0, page); 80 VM_BUG_ON(count == 0); 81 82 atomic_set(&page->_count, count); 83 } 84 85 #endif 86