18c2ecf20Sopenharmony_ci#include <linux/poll.h>
28c2ecf20Sopenharmony_ci#include <linux/eventpoll.h>
38c2ecf20Sopenharmony_ci#include <linux/wait.h>
48c2ecf20Sopenharmony_ci#include <linux/seq_file.h>
58c2ecf20Sopenharmony_ci#include <linux/mm.h>
68c2ecf20Sopenharmony_ci#include <linux/proc_fs.h>
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include "internal.h"
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_cistatic atomic_t kswapd_monitor = ATOMIC_INIT(0);
118c2ecf20Sopenharmony_cistatic DECLARE_WAIT_QUEUE_HEAD(kswapd_poll_wait);
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_civoid kswapd_monitor_wake_up_queue(void)
148c2ecf20Sopenharmony_ci{
158c2ecf20Sopenharmony_ci    atomic_inc(&kswapd_monitor);
168c2ecf20Sopenharmony_ci    wake_up_interruptible(&kswapd_poll_wait);
178c2ecf20Sopenharmony_ci}
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_cistatic __poll_t kswapd_monitor_poll(struct file *file, struct poll_table_struct *wait)
208c2ecf20Sopenharmony_ci{
218c2ecf20Sopenharmony_ci    struct seq_file *seq = file->private_data;
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci    poll_wait(file, &kswapd_poll_wait, wait);
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci    if (seq->poll_event != atomic_read(&kswapd_monitor)) {
268c2ecf20Sopenharmony_ci        seq->poll_event = atomic_read(&kswapd_monitor);
278c2ecf20Sopenharmony_ci        return EPOLLPRI;
288c2ecf20Sopenharmony_ci    }
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci    return EPOLLIN | EPOLLRDNORM;
318c2ecf20Sopenharmony_ci}
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_cistatic int kswapd_monitor_show(struct seq_file *m, void *v)
348c2ecf20Sopenharmony_ci{
358c2ecf20Sopenharmony_ci    seq_printf(m, "kswapd_monitor_show kswapd_monitor %d\n", atomic_read(&kswapd_monitor));
368c2ecf20Sopenharmony_ci    return 0;
378c2ecf20Sopenharmony_ci}
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_cistatic int kswapd_monitor_open(struct inode *inode, struct file *file)
408c2ecf20Sopenharmony_ci{
418c2ecf20Sopenharmony_ci    return single_open(file, kswapd_monitor_show, NULL);
428c2ecf20Sopenharmony_ci}
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cistatic const struct proc_ops proc_kswapd_monitor_operations = {
458c2ecf20Sopenharmony_ci    .proc_open = kswapd_monitor_open,
468c2ecf20Sopenharmony_ci    .proc_poll = kswapd_monitor_poll,
478c2ecf20Sopenharmony_ci    .proc_read = seq_read,
488c2ecf20Sopenharmony_ci    .proc_lseek = seq_lseek,
498c2ecf20Sopenharmony_ci    .proc_release = single_release,
508c2ecf20Sopenharmony_ci};
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cistatic int __init memory_monitor_init(void)
538c2ecf20Sopenharmony_ci{
548c2ecf20Sopenharmony_ci	proc_create("kswapd_monitor", 0, NULL, &proc_kswapd_monitor_operations);
558c2ecf20Sopenharmony_ci	return 0;
568c2ecf20Sopenharmony_ci}
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci__initcall(memory_monitor_init)
59