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