|
@@ -38,6 +38,8 @@
|
|
|
#include <asm/io.h>
|
|
|
#include <asm/mman.h>
|
|
|
#include <linux/atomic.h>
|
|
|
+#include <linux/proc_fs.h>
|
|
|
+#include <linux/seq_file.h>
|
|
|
|
|
|
/*
|
|
|
* LOCKING:
|
|
@@ -783,8 +785,34 @@ static unsigned int ep_eventpoll_poll(struct file *file, poll_table *wait)
|
|
|
return pollflags != -1 ? pollflags : 0;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_PROC_FS
|
|
|
+static int ep_show_fdinfo(struct seq_file *m, struct file *f)
|
|
|
+{
|
|
|
+ struct eventpoll *ep = f->private_data;
|
|
|
+ struct rb_node *rbp;
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ mutex_lock(&ep->mtx);
|
|
|
+ for (rbp = rb_first(&ep->rbr); rbp; rbp = rb_next(rbp)) {
|
|
|
+ struct epitem *epi = rb_entry(rbp, struct epitem, rbn);
|
|
|
+
|
|
|
+ ret = seq_printf(m, "tfd: %8d events: %8x data: %16llx\n",
|
|
|
+ epi->ffd.fd, epi->event.events,
|
|
|
+ (long long)epi->event.data);
|
|
|
+ if (ret)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ mutex_unlock(&ep->mtx);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
/* File callbacks that implement the eventpoll file behaviour */
|
|
|
static const struct file_operations eventpoll_fops = {
|
|
|
+#ifdef CONFIG_PROC_FS
|
|
|
+ .show_fdinfo = ep_show_fdinfo,
|
|
|
+#endif
|
|
|
.release = ep_eventpoll_release,
|
|
|
.poll = ep_eventpoll_poll,
|
|
|
.llseek = noop_llseek,
|