|
@@ -3571,15 +3571,6 @@ static int pktgen_thread_worker(void *arg)
|
|
pr_debug("%s removing thread\n", t->tsk->comm);
|
|
pr_debug("%s removing thread\n", t->tsk->comm);
|
|
pktgen_rem_thread(t);
|
|
pktgen_rem_thread(t);
|
|
|
|
|
|
- /* Wait for kthread_stop */
|
|
|
|
- for (;;) {
|
|
|
|
- set_current_state(TASK_INTERRUPTIBLE);
|
|
|
|
- if (kthread_should_stop())
|
|
|
|
- break;
|
|
|
|
- schedule();
|
|
|
|
- }
|
|
|
|
- __set_current_state(TASK_RUNNING);
|
|
|
|
-
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3771,6 +3762,7 @@ static int __net_init pktgen_create_thread(int cpu, struct pktgen_net *pn)
|
|
}
|
|
}
|
|
|
|
|
|
t->net = pn;
|
|
t->net = pn;
|
|
|
|
+ get_task_struct(p);
|
|
wake_up_process(p);
|
|
wake_up_process(p);
|
|
wait_for_completion(&t->start_done);
|
|
wait_for_completion(&t->start_done);
|
|
|
|
|
|
@@ -3893,6 +3885,7 @@ static void __net_exit pg_net_exit(struct net *net)
|
|
t = list_entry(q, struct pktgen_thread, th_list);
|
|
t = list_entry(q, struct pktgen_thread, th_list);
|
|
list_del(&t->th_list);
|
|
list_del(&t->th_list);
|
|
kthread_stop(t->tsk);
|
|
kthread_stop(t->tsk);
|
|
|
|
+ put_task_struct(t->tsk);
|
|
kfree(t);
|
|
kfree(t);
|
|
}
|
|
}
|
|
|
|
|