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