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