162306a36Sopenharmony_ci#include <linux/poll.h>
262306a36Sopenharmony_ci#include <linux/eventpoll.h>
362306a36Sopenharmony_ci#include <linux/wait.h>
462306a36Sopenharmony_ci#include <linux/seq_file.h>
562306a36Sopenharmony_ci#include <linux/mm.h>
662306a36Sopenharmony_ci#include <linux/proc_fs.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "internal.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistatic atomic_t kswapd_monitor = ATOMIC_INIT(0);
1162306a36Sopenharmony_cistatic DECLARE_WAIT_QUEUE_HEAD(kswapd_poll_wait);
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_civoid kswapd_monitor_wake_up_queue(void)
1462306a36Sopenharmony_ci{
1562306a36Sopenharmony_ci    atomic_inc(&kswapd_monitor);
1662306a36Sopenharmony_ci    wake_up_interruptible(&kswapd_poll_wait);
1762306a36Sopenharmony_ci}
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic __poll_t kswapd_monitor_poll(struct file *file, struct poll_table_struct *wait)
2062306a36Sopenharmony_ci{
2162306a36Sopenharmony_ci    struct seq_file *seq = file->private_data;
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci    poll_wait(file, &kswapd_poll_wait, wait);
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci    if (seq->poll_event != atomic_read(&kswapd_monitor)) {
2662306a36Sopenharmony_ci        seq->poll_event = atomic_read(&kswapd_monitor);
2762306a36Sopenharmony_ci        return EPOLLPRI;
2862306a36Sopenharmony_ci    }
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci    return EPOLLIN | EPOLLRDNORM;
3162306a36Sopenharmony_ci}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistatic int kswapd_monitor_show(struct seq_file *m, void *v)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci    seq_printf(m, "kswapd_monitor_show kswapd_monitor %d\n", atomic_read(&kswapd_monitor));
3662306a36Sopenharmony_ci    return 0;
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistatic int kswapd_monitor_open(struct inode *inode, struct file *file)
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci    return single_open(file, kswapd_monitor_show, NULL);
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic const struct proc_ops proc_kswapd_monitor_operations = {
4562306a36Sopenharmony_ci    .proc_open = kswapd_monitor_open,
4662306a36Sopenharmony_ci    .proc_poll = kswapd_monitor_poll,
4762306a36Sopenharmony_ci    .proc_read = seq_read,
4862306a36Sopenharmony_ci    .proc_lseek = seq_lseek,
4962306a36Sopenharmony_ci    .proc_release = single_release,
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistatic int __init memory_monitor_init(void)
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci	proc_create("kswapd_monitor", 0, NULL, &proc_kswapd_monitor_operations);
5562306a36Sopenharmony_ci	return 0;
5662306a36Sopenharmony_ci}
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci__initcall(memory_monitor_init)
59