[PATCH] per-task delay accounting: avoid send without listeners
Shailabh Nagar [Fri, 14 Jul 2006 07:24:46 +0000 (00:24 -0700)]
Don't send taskstats (per-pid or per-tgid) on thread exit when no one is
listening for such data.

Currently the taskstats interface allocates a structure, fills it in and
calls netlink to send out per-pid and per-tgid stats regardless of whether
a userspace listener for the data exists (netlink layer would check for
that and avoid the multicast).

As a result of this patch, the check for the no-listener case is performed
early, avoiding the redundant allocation and filling up of the taskstats
structures.

Signed-off-by: Balbir Singh <balbir@in.ibm.com>
Signed-off-by: Shailabh Nagar <nagar@watson.ibm.com>
Cc: Jay Lan <jlan@engr.sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

include/linux/taskstats_kern.h

index 0ae8f67..2b6adec 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <linux/taskstats.h>
 #include <linux/sched.h>
+#include <net/genetlink.h>
 
 enum {
        TASKSTATS_MSG_UNICAST,          /* send data only to requester */
@@ -19,9 +20,19 @@ enum {
 extern kmem_cache_t *taskstats_cache;
 extern struct mutex taskstats_exit_mutex;
 
+static inline int taskstats_has_listeners(void)
+{
+       if (!genl_sock)
+               return 0;
+       return netlink_has_listeners(genl_sock, TASKSTATS_LISTEN_GROUP);
+}
+
+
 static inline void taskstats_exit_alloc(struct taskstats **ptidstats)
 {
-       *ptidstats = kmem_cache_zalloc(taskstats_cache, SLAB_KERNEL);
+       *ptidstats = NULL;
+       if (taskstats_has_listeners())
+               *ptidstats = kmem_cache_zalloc(taskstats_cache, SLAB_KERNEL);
 }
 
 static inline void taskstats_exit_free(struct taskstats *tidstats)