1 #ifndef __LINUX_VMPRESSURE_H 2 #define __LINUX_VMPRESSURE_H 3 4 #include <linux/mutex.h> 5 #include <linux/list.h> 6 #include <linux/workqueue.h> 7 #include <linux/gfp.h> 8 #include <linux/types.h> 9 #include <linux/cgroup.h> 10 #include <linux/eventfd.h> 11 12 struct vmpressure { 13 unsigned long scanned; 14 unsigned long reclaimed; 15 16 unsigned long tree_scanned; 17 unsigned long tree_reclaimed; 18 /* The lock is used to keep the scanned/reclaimed above in sync. */ 19 struct spinlock sr_lock; 20 21 /* The list of vmpressure_event structs. */ 22 struct list_head events; 23 /* Have to grab the lock on events traversal or modifications. */ 24 struct mutex events_lock; 25 26 struct work_struct work; 27 }; 28 29 struct mem_cgroup; 30 31 #ifdef CONFIG_MEMCG 32 extern void vmpressure(gfp_t gfp, struct mem_cgroup *memcg, bool tree, 33 unsigned long scanned, unsigned long reclaimed); 34 extern void vmpressure_prio(gfp_t gfp, struct mem_cgroup *memcg, int prio); 35 36 extern void vmpressure_init(struct vmpressure *vmpr); 37 extern void vmpressure_cleanup(struct vmpressure *vmpr); 38 extern struct vmpressure *memcg_to_vmpressure(struct mem_cgroup *memcg); 39 extern struct cgroup_subsys_state *vmpressure_to_css(struct vmpressure *vmpr); 40 extern int vmpressure_register_event(struct mem_cgroup *memcg, 41 struct eventfd_ctx *eventfd, 42 const char *args); 43 extern void vmpressure_unregister_event(struct mem_cgroup *memcg, 44 struct eventfd_ctx *eventfd); 45 #else 46 static inline void vmpressure(gfp_t gfp, struct mem_cgroup *memcg, bool tree, 47 unsigned long scanned, unsigned long reclaimed) {} 48 static inline void vmpressure_prio(gfp_t gfp, struct mem_cgroup *memcg, 49 int prio) {} 50 #endif /* CONFIG_MEMCG */ 51 #endif /* __LINUX_VMPRESSURE_H */ 52