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
         */
        *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 */