[PATCH] epoll: also show owner uids in epoll/limits output

From: Bron Gondwana
Date: Sun Jan 25 2009 - 05:43:36 EST


So - the data is in epoll/limits is probably more useful if the uid
of each of the maximum counts is available for easy tracking down.
This patch adds it.
---
fs/eventpoll.c | 6 ++++--
include/linux/eventpoll.h | 5 ++++-
kernel/user.c | 13 ++++++++++---
3 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index f9cba5b..2113795 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -259,7 +259,9 @@ static int zero;
static int epoll_user_instances(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
- user_epoll_maximums(&epoll_limits.num_user_instances,
+ user_epoll_maximums(&epoll_limits.instances_uid,
+ &epoll_limits.num_user_instances,
+ &epoll_limits.watches_uid,
&epoll_limits.num_user_watches);
return proc_dointvec(table, write, filp, buffer, lenp, ppos);
}
@@ -284,7 +286,7 @@ ctl_table epoll_table[] = {
{
.procname = "limits",
.data = &epoll_limits,
- .maxlen = 4*sizeof(int),
+ .maxlen = 6*sizeof(int),
.mode = 0444,
.proc_handler = &epoll_user_instances,
.extra1 = &zero,
diff --git a/include/linux/eventpoll.h b/include/linux/eventpoll.h
index 38bec62..8258d0a 100644
--- a/include/linux/eventpoll.h
+++ b/include/linux/eventpoll.h
@@ -61,7 +61,9 @@ struct file;
* Configuration options available inside /proc/sys/fs/epoll/
*/
struct epoll_limits_struct {
+ uid_t instances_uid; /* read only */
int num_user_instances; /* read only */
+ uid_t watches_uid; /* read only */
int num_user_watches; /* read only */
int max_user_instances; /* tunable */
int max_user_watches; /* tunable */
@@ -107,7 +109,8 @@ static inline void eventpoll_release(struct file *file)
}

extern struct epoll_limits_struct epoll_limits;
-extern void user_epoll_maximums(int *num_devs, int *num_watches);
+extern void user_epoll_maximums(uid_t *user_devs, int *num_devs,
+ uid_t *user_watches, int *num_watches);

#else

diff --git a/kernel/user.c b/kernel/user.c
index 4d03a95..ef8769a 100644
--- a/kernel/user.c
+++ b/kernel/user.c
@@ -382,7 +382,8 @@ struct user_struct *find_user(uid_t uid)
}

#ifdef CONFIG_EPOLL
-void user_epoll_maximums(int *max_devs, int *max_watches)
+void user_epoll_maximums(uid_t *user_devs, int *max_devs,
+ uid_t *user_watches, int *max_watches)
{
unsigned long flags;
struct user_struct *user;
@@ -390,16 +391,22 @@ void user_epoll_maximums(int *max_devs, int *max_watches)
int n;

*max_devs = 0;
+ *user_devs = root_user.uid;
*max_watches = 0;
+ *user_watches = root_user.uid;

spin_lock_irqsave(&uidhash_lock, flags);

for(n = 0; n < UIDHASH_SZ; ++n) {
hlist_for_each_entry(user, h, init_user_ns.uidhash_table + n, uidhash_node) {
- if (user->epoll_devs.counter > *max_devs)
+ if (user->epoll_devs.counter > *max_devs) {
*max_devs = user->epoll_devs.counter;
- if (user->epoll_watches.counter > *max_watches)
+ *user_devs = user->uid;
+ }
+ if (user->epoll_watches.counter > *max_watches) {
*max_watches = user->epoll_watches.counter;
+ *user_watches = user->uid;
+ }
}
}

--
1.5.6.3


--ReaqsoxgOBHFXBhH--
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/