[PATCH] per-task delay accounting: avoid send without listeners

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>
This commit is contained in:
Shailabh Nagar 2006-07-14 00:24:46 -07:00 committed by Linus Torvalds
parent 9e06d3f9f6
commit c8924363da
1 changed files with 12 additions and 1 deletions

View File

@ -9,6 +9,7 @@
#include <linux/taskstats.h> #include <linux/taskstats.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <net/genetlink.h>
enum { enum {
TASKSTATS_MSG_UNICAST, /* send data only to requester */ TASKSTATS_MSG_UNICAST, /* send data only to requester */
@ -19,9 +20,19 @@ enum {
extern kmem_cache_t *taskstats_cache; extern kmem_cache_t *taskstats_cache;
extern struct mutex taskstats_exit_mutex; 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) 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) static inline void taskstats_exit_free(struct taskstats *tidstats)