diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c index 4045bdc..6e7fa62 100644 --- a/fs/sysfs/file.c +++ b/fs/sysfs/file.c @@ -17,9 +17,30 @@ #include #include #include +#include +#include #include "sysfs.h" +static unsigned long last_jiffies = INITIAL_JIFFIES; +static atomic_t sysfs_page_cnt = ATOMIC_INIT(0); + +static void sysfs_page_inc(void) +{ + atomic_inc(&sysfs_page_cnt); + + if (time_before(jiffies, last_jiffies + 10 * HZ)) + return; + + last_jiffies = jiffies; + printk("XXX sysfs_page_cnt=%d\n", atomic_read(&sysfs_page_cnt)); +} + +static void sysfs_page_dec(void) +{ + atomic_dec(&sysfs_page_cnt); +} + #define to_sattr(a) container_of(a,struct subsys_attribute, attr) /* @@ -105,8 +126,10 @@ static int fill_read_buffer(struct dentry * dentry, struct sysfs_buffer * buffer int ret = 0; ssize_t count; - if (!buffer->page) + if (!buffer->page) { buffer->page = (char *) get_zeroed_page(GFP_KERNEL); + sysfs_page_inc(); + } if (!buffer->page) return -ENOMEM; @@ -188,8 +211,10 @@ fill_write_buffer(struct sysfs_buffer * buffer, const char __user * buf, size_t { int error; - if (!buffer->page) + if (!buffer->page) { buffer->page = (char *)get_zeroed_page(GFP_KERNEL); + sysfs_page_inc(); + } if (!buffer->page) return -ENOMEM; @@ -434,8 +459,10 @@ static int sysfs_release(struct inode *inode, struct file *filp) sysfs_put_open_dirent(sd, buffer); - if (buffer->page) + if (buffer->page) { free_page((unsigned long)buffer->page); + sysfs_page_dec(); + } kfree(buffer); return 0;