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 12struct vmpressure { 13 unsigned long scanned; 14 unsigned long reclaimed; 15 /* The lock is used to keep the scanned/reclaimed above in sync. */ 16 struct spinlock sr_lock; 17 18 /* The list of vmpressure_event structs. */ 19 struct list_head events; 20 /* Have to grab the lock on events traversal or modifications. */ 21 struct mutex events_lock; 22 23 struct work_struct work; 24}; 25 26struct mem_cgroup; 27 28#ifdef CONFIG_MEMCG 29extern void vmpressure(gfp_t gfp, struct mem_cgroup *memcg, 30 unsigned long scanned, unsigned long reclaimed); 31extern void vmpressure_prio(gfp_t gfp, struct mem_cgroup *memcg, int prio); 32 33extern void vmpressure_init(struct vmpressure *vmpr); 34extern void vmpressure_cleanup(struct vmpressure *vmpr); 35extern struct vmpressure *memcg_to_vmpressure(struct mem_cgroup *memcg); 36extern struct cgroup_subsys_state *vmpressure_to_css(struct vmpressure *vmpr); 37extern int vmpressure_register_event(struct mem_cgroup *memcg, 38 struct eventfd_ctx *eventfd, 39 const char *args); 40extern void vmpressure_unregister_event(struct mem_cgroup *memcg, 41 struct eventfd_ctx *eventfd); 42#else 43static inline void vmpressure(gfp_t gfp, struct mem_cgroup *memcg, 44 unsigned long scanned, unsigned long reclaimed) {} 45static inline void vmpressure_prio(gfp_t gfp, struct mem_cgroup *memcg, 46 int prio) {} 47#endif /* CONFIG_MEMCG */ 48#endif /* __LINUX_VMPRESSURE_H */ 49