diff options
author | Ingo Molnar <mingo@kernel.org> | 2019-06-17 12:29:16 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2019-06-17 12:29:16 +0200 |
commit | bddb3636737f658886a0a02b64db5366bba3428e (patch) | |
tree | 8f7ffcb42803fa0bb3378ef969545e4a5e57262c /net/core/pktgen.c | |
parent | 3384c78631dd722c2cdc5c57fbdd39fc1b5a9f2d (diff) | |
parent | cbb99c0f588737ec98c333558922ce47e9a95827 (diff) |
Merge branch 'x86/cpu' into perf/core, to pick up dependent changes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'net/core/pktgen.c')
-rw-r--r-- | net/core/pktgen.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 99ddc69736b29..f975c5e2a3697 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -3059,7 +3059,13 @@ static int pktgen_wait_thread_run(struct pktgen_thread *t) { while (thread_is_running(t)) { + /* note: 't' will still be around even after the unlock/lock + * cycle because pktgen_thread threads are only cleared at + * net exit + */ + mutex_unlock(&pktgen_thread_lock); msleep_interruptible(100); + mutex_lock(&pktgen_thread_lock); if (signal_pending(current)) goto signal; @@ -3074,6 +3080,10 @@ static int pktgen_wait_all_threads_run(struct pktgen_net *pn) struct pktgen_thread *t; int sig = 1; + /* prevent from racing with rmmod */ + if (!try_module_get(THIS_MODULE)) + return sig; + mutex_lock(&pktgen_thread_lock); list_for_each_entry(t, &pn->pktgen_threads, th_list) { @@ -3087,6 +3097,7 @@ static int pktgen_wait_all_threads_run(struct pktgen_net *pn) t->control |= (T_STOP); mutex_unlock(&pktgen_thread_lock); + module_put(THIS_MODULE); return sig; } |