net: pktgen: fix race between pktgen_thread_worker() and kthread_stop()
Subsystems (2)
cover net: pktgen: fix race between pktgen_thread_worker() and kthread_stop()
Hello,
I am not familiar with this code and I have no idea how to test these changes, so 2/2 comes as a separate change. 1/2 looks like the obvious bugfix, and probably candidate for -stable.
Oleg.
net/core/pktgen.c | 9 ++------- 1 files changed, 2 insertions(+), 7 deletions(-)
PATCH 1/2 net: pktgen: fix race between pktgen_thread_worker() and kthread_stop()
pktgen_thread_worker() is obviously racy, kthread_stop() can come between the kthread_should_stop() check and set_current_state().
--- net/core/pktgen.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-)
net/core/pktgen.c +3 -1
@@ -3490,8 +3490,10 @@ static int pktgen_thread_worker(void *arg)pktgen_rem_thread (t);/* Wait for kthread_stop */ -while (!kthread_should_stop ()) { +for (;;) {set_current_state (TASK_INTERRUPTIBLE ); +if (kthread_should_stop ()) +break ;schedule (); }__set_current_state (TASK_RUNNING );
Signature · 1 line
1.5.5.1
PATCH 2/2 net: pktgen: kill the "Wait for kthread_stop" code in pktgen_thread_worker()
In reply to Oleg Nesterovpktgen_thread_worker() doesn't need to wait for kthread_stop(), it can simply exit. Just pktgen_create_thread() and pg_net_exit() should do get_task_struct()/put_task_struct(). kthread_stop(dead_thread) is fine.
--- net/core/pktgen.c | 11 ++--------- 1 files changed, 2 insertions(+), 9 deletions(-)
net/core/pktgen.c +2 -9
@@ -3489,15 +3489,6 @@ static int pktgen_thread_worker(void *arg)pr_debug ("%s removing thread\n" , t->tsk->comm);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 ; }
@@ -3689,6 +3680,7 @@ static int __net_init pktgen_create_thread(int cpu, struct pktgen_net *pn) } t->net = pn; +get_task_struct (p);wake_up_process (p);wait_for_completion (&t->start_done);
@@ -3811,6 +3803,7 @@ static void __net_exit pg_net_exit(struct net *net) t = list_entry(q, struct pktgen_thread, th_list);list_del (&t->th_list);kthread_stop (t->tsk); +put_task_struct (t->tsk);kfree (t); }
Signature · 1 line
1.5.5.1
David Miller
maintainerFrom: Oleg Nesterov <[email protected]>
Date: Wed, 8 Jul 2015 21:41:54 +0200
Quoted 3 lines
I am not familiar with this code and I have no idea how to test these changes, so 2/2 comes as a separate change. 1/2 looks like the obvious bugfix, and probably candidate for -stable.
These look fine to me, applied and patch #1 queued up for -stable.
Thanks.
Quoted 11 lines · Oleg Nesterov
Hello,
I am not familiar with this code and I have no idea how to test these changes, so 2/2 comes as a separate change. 1/2 looks like the obvious bugfix, and probably candidate for -stable.
Oleg.
net/core/pktgen.c | 9 ++------- 1 files changed, 2 insertions(+), 7 deletions(-)
Both patches tested here, works for me.
Thanks,
Marcelo