Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef _LINUX_PAGE_COUNTER_H 3 : : #define _LINUX_PAGE_COUNTER_H 4 : : 5 : : #include <linux/atomic.h> 6 : : #include <linux/kernel.h> 7 : : #include <asm/page.h> 8 : : 9 : : struct page_counter { 10 : : atomic_long_t usage; 11 : : unsigned long min; 12 : : unsigned long low; 13 : : unsigned long max; 14 : : struct page_counter *parent; 15 : : 16 : : /* effective memory.min and memory.min usage tracking */ 17 : : unsigned long emin; 18 : : atomic_long_t min_usage; 19 : : atomic_long_t children_min_usage; 20 : : 21 : : /* effective memory.low and memory.low usage tracking */ 22 : : unsigned long elow; 23 : : atomic_long_t low_usage; 24 : : atomic_long_t children_low_usage; 25 : : 26 : : /* legacy */ 27 : : unsigned long watermark; 28 : : unsigned long failcnt; 29 : : }; 30 : : 31 : : #if BITS_PER_LONG == 32 32 : : #define PAGE_COUNTER_MAX LONG_MAX 33 : : #else 34 : : #define PAGE_COUNTER_MAX (LONG_MAX / PAGE_SIZE) 35 : : #endif 36 : : 37 : : static inline void page_counter_init(struct page_counter *counter, 38 : : struct page_counter *parent) 39 : : { 40 : : atomic_long_set(&counter->usage, 0); 41 : 2020 : counter->max = PAGE_COUNTER_MAX; 42 : 2020 : counter->parent = parent; 43 : : } 44 : : 45 : : static inline unsigned long page_counter_read(struct page_counter *counter) 46 : : { 47 : : return atomic_long_read(&counter->usage); 48 : : } 49 : : 50 : : void page_counter_cancel(struct page_counter *counter, unsigned long nr_pages); 51 : : void page_counter_charge(struct page_counter *counter, unsigned long nr_pages); 52 : : bool page_counter_try_charge(struct page_counter *counter, 53 : : unsigned long nr_pages, 54 : : struct page_counter **fail); 55 : : void page_counter_uncharge(struct page_counter *counter, unsigned long nr_pages); 56 : : void page_counter_set_min(struct page_counter *counter, unsigned long nr_pages); 57 : : void page_counter_set_low(struct page_counter *counter, unsigned long nr_pages); 58 : : int page_counter_set_max(struct page_counter *counter, unsigned long nr_pages); 59 : : int page_counter_memparse(const char *buf, const char *max, 60 : : unsigned long *nr_pages); 61 : : 62 : : static inline void page_counter_reset_watermark(struct page_counter *counter) 63 : : { 64 : 0 : counter->watermark = page_counter_read(counter); 65 : : } 66 : : 67 : : #endif /* _LINUX_PAGE_COUNTER_H */