|
@@ -390,6 +390,7 @@ struct pktgen_thread {
|
|
int cpu;
|
|
int cpu;
|
|
|
|
|
|
wait_queue_head_t queue;
|
|
wait_queue_head_t queue;
|
|
|
|
+ struct completion start_done;
|
|
};
|
|
};
|
|
|
|
|
|
#define REMOVE 1
|
|
#define REMOVE 1
|
|
@@ -3414,6 +3415,7 @@ static int pktgen_thread_worker(void *arg)
|
|
BUG_ON(smp_processor_id() != cpu);
|
|
BUG_ON(smp_processor_id() != cpu);
|
|
|
|
|
|
init_waitqueue_head(&t->queue);
|
|
init_waitqueue_head(&t->queue);
|
|
|
|
+ complete(&t->start_done);
|
|
|
|
|
|
pr_debug("pktgen: starting pktgen/%d: pid=%d\n", cpu, task_pid_nr(current));
|
|
pr_debug("pktgen: starting pktgen/%d: pid=%d\n", cpu, task_pid_nr(current));
|
|
|
|
|
|
@@ -3615,6 +3617,7 @@ static int __init pktgen_create_thread(int cpu)
|
|
INIT_LIST_HEAD(&t->if_list);
|
|
INIT_LIST_HEAD(&t->if_list);
|
|
|
|
|
|
list_add_tail(&t->th_list, &pktgen_threads);
|
|
list_add_tail(&t->th_list, &pktgen_threads);
|
|
|
|
+ init_completion(&t->start_done);
|
|
|
|
|
|
p = kthread_create(pktgen_thread_worker, t, "kpktgend_%d", cpu);
|
|
p = kthread_create(pktgen_thread_worker, t, "kpktgend_%d", cpu);
|
|
if (IS_ERR(p)) {
|
|
if (IS_ERR(p)) {
|
|
@@ -3639,6 +3642,7 @@ static int __init pktgen_create_thread(int cpu)
|
|
}
|
|
}
|
|
|
|
|
|
wake_up_process(p);
|
|
wake_up_process(p);
|
|
|
|
+ wait_for_completion(&t->start_done);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|