Skip to content

Commit

Permalink
[PATCH] per-task delay accounting: avoid send without listeners
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Shailabh Nagar authored and Linus Torvalds committed Jul 15, 2006
1 parent 9e06d3f commit c892436
Showing 1 changed file with 12 additions and 1 deletion.
13 changes: 12 additions & 1 deletion include/linux/taskstats_kern.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand All @@ -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)
Expand Down

0 comments on commit c892436

Please sign in to comment.