xref: /linux-6.15/include/linux/page_ref.h (revision fe896d18)
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