blob: 93000f509682dd3d15dbef11a486077628497e8d [file] [log] [blame]
Anton Vorontsov70ddf632013-04-29 15:08:31 -07001#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>
Tejun Heofba94802013-11-22 18:20:43 -050010#include <linux/eventfd.h>
Anton Vorontsov70ddf632013-04-29 15:08:31 -070011
12struct vmpressure {
13 unsigned long scanned;
14 unsigned long reclaimed;
Johannes Weiner8e8ae642016-01-14 15:21:32 -080015
16 unsigned long tree_scanned;
17 unsigned long tree_reclaimed;
Vinayak Menon58091092015-03-31 11:06:29 +053018 unsigned long stall;
Anton Vorontsov70ddf632013-04-29 15:08:31 -070019 /* The lock is used to keep the scanned/reclaimed above in sync. */
Michal Hocko22f20202013-07-31 13:53:48 -070020 struct spinlock sr_lock;
Anton Vorontsov70ddf632013-04-29 15:08:31 -070021
22 /* The list of vmpressure_event structs. */
23 struct list_head events;
24 /* Have to grab the lock on events traversal or modifications. */
25 struct mutex events_lock;
26
27 struct work_struct work;
28};
29
30struct mem_cgroup;
31
Vinayak Menon13088ad2015-03-04 16:38:28 +053032extern int vmpressure_notifier_register(struct notifier_block *nb);
33extern int vmpressure_notifier_unregister(struct notifier_block *nb);
Johannes Weiner8e8ae642016-01-14 15:21:32 -080034extern void vmpressure(gfp_t gfp, struct mem_cgroup *memcg, bool tree,
Anton Vorontsov70ddf632013-04-29 15:08:31 -070035 unsigned long scanned, unsigned long reclaimed);
36extern void vmpressure_prio(gfp_t gfp, struct mem_cgroup *memcg, int prio);
37
Vinayak Menon13088ad2015-03-04 16:38:28 +053038#ifdef CONFIG_MEMCG
Anton Vorontsov70ddf632013-04-29 15:08:31 -070039extern void vmpressure_init(struct vmpressure *vmpr);
Michal Hocko33cb8762013-07-31 13:53:51 -070040extern void vmpressure_cleanup(struct vmpressure *vmpr);
Anton Vorontsov70ddf632013-04-29 15:08:31 -070041extern struct vmpressure *memcg_to_vmpressure(struct mem_cgroup *memcg);
42extern struct cgroup_subsys_state *vmpressure_to_css(struct vmpressure *vmpr);
Tejun Heo59b6f872013-11-22 18:20:43 -050043extern int vmpressure_register_event(struct mem_cgroup *memcg,
Anton Vorontsov70ddf632013-04-29 15:08:31 -070044 struct eventfd_ctx *eventfd,
45 const char *args);
Tejun Heo59b6f872013-11-22 18:20:43 -050046extern void vmpressure_unregister_event(struct mem_cgroup *memcg,
Anton Vorontsov70ddf632013-04-29 15:08:31 -070047 struct eventfd_ctx *eventfd);
48#else
Vinayak Menon13088ad2015-03-04 16:38:28 +053049static inline struct vmpressure *memcg_to_vmpressure(struct mem_cgroup *memcg)
50{
51 return NULL;
52}
Anton Vorontsov70ddf632013-04-29 15:08:31 -070053#endif /* CONFIG_MEMCG */
54#endif /* __LINUX_VMPRESSURE_H */