forked from luck/tmp_suning_uos_patched
[PATCH] taskstats_exit_alloc: optimize/simplify
If there are no listeners, every task does unneeded kmem_cache alloc/free on exit. We don't need listeners->sem for 'if (!list_empty())' check. Yes, we may have a false positive, but this doesn't differ from the case when the listener is unregistered after we drop the semaphore. So we don't need to do allocation beforehand. Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru> Cc: Balbir Singh <balbir@in.ibm.com> Acked-by: Shailabh Nagar <nagar@watson.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
38da288b8b
commit
128fb95650
|
@ -416,7 +416,6 @@ static int taskstats_user_cmd(struct sk_buff *skb, struct genl_info *info)
|
|||
void taskstats_exit_alloc(struct taskstats **ptidstats, unsigned int *mycpu)
|
||||
{
|
||||
struct listener_list *listeners;
|
||||
struct taskstats *tmp;
|
||||
/*
|
||||
* This is the cpu on which the task is exiting currently and will
|
||||
* be the one for which the exit event is sent, even if the cpu
|
||||
|
@ -424,19 +423,11 @@ void taskstats_exit_alloc(struct taskstats **ptidstats, unsigned int *mycpu)
|
|||
*/
|
||||
*mycpu = raw_smp_processor_id();
|
||||
|
||||
*ptidstats = NULL;
|
||||
tmp = kmem_cache_zalloc(taskstats_cache, GFP_KERNEL);
|
||||
if (!tmp)
|
||||
return;
|
||||
|
||||
listeners = &per_cpu(listener_array, *mycpu);
|
||||
down_read(&listeners->sem);
|
||||
if (!list_empty(&listeners->list)) {
|
||||
*ptidstats = tmp;
|
||||
tmp = NULL;
|
||||
}
|
||||
up_read(&listeners->sem);
|
||||
kfree(tmp);
|
||||
|
||||
*ptidstats = NULL;
|
||||
if (!list_empty(&listeners->list))
|
||||
*ptidstats = kmem_cache_zalloc(taskstats_cache, GFP_KERNEL);
|
||||
}
|
||||
|
||||
/* Send pid data out on exit */
|
||||
|
|
Loading…
Reference in New Issue
Block a user