All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Josh Triplett <josh@joshtriplett.org>
Cc: linux-kernel@vger.kernel.org, mingo@kernel.org,
	laijs@cn.fujitsu.com, dipankar@in.ibm.com,
	akpm@linux-foundation.org, mathieu.desnoyers@efficios.com,
	niv@us.ibm.com, tglx@linutronix.de, peterz@infradead.org,
	rostedt@goodmis.org, dhowells@redhat.com, edumazet@google.com,
	darren@dvhart.com, fweisbec@gmail.com, oleg@redhat.com,
	sbw@mit.edu
Subject: Re: [PATCH tip/core/rcu 35/55] rcutorture: Fix rcutorture shutdown races
Date: Tue, 18 Feb 2014 13:35:36 -0800	[thread overview]
Message-ID: <20140218213536.GZ4250@linux.vnet.ibm.com> (raw)
In-Reply-To: <20140218003259.GH19929@thin>

On Mon, Feb 17, 2014 at 04:32:59PM -0800, Josh Triplett wrote:
> On Mon, Feb 17, 2014 at 02:12:39PM -0800, Paul E. McKenney wrote:
> > From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
> > 
> > Not all of the rcutorture kthreads waited for kthread_should_stop()
> > before returning from their top-level functions, and none of them
> > used torture_shutdown_absorb() properly.  These problems can result in
> > segfaults and hangs at shutdown time, and some recent changes perturbed
> > timing sufficiently to make them much more probable.  This commit
> > therefore creates a torture_kthread_stopping() function that does the
> > proper kthread shutdown dance in one centralized location.
> > 
> > Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> 
> One comment below.
> 
> >  include/linux/torture.h |  3 ++-
> >  kernel/rcu/rcutorture.c | 39 +++++++++++----------------------------
> >  kernel/torture.c        | 26 ++++++++++++++++++++++----
> >  3 files changed, 35 insertions(+), 33 deletions(-)
> > 
> > diff --git a/include/linux/torture.h b/include/linux/torture.h
> > index 513b85f98585..db9bc7756a32 100644
> > --- a/include/linux/torture.h
> > +++ b/include/linux/torture.h
> > @@ -45,7 +45,7 @@
> >  #define TOROUT_STRING(s) \
> >  	pr_alert("%s" TORTURE_FLAG s "\n", torture_type)
> >  #define VERBOSE_TOROUT_STRING(s) \
> > -	do { if (verbose) pr_alert("%s" TORTURE_FLAG s "\n", torture_type); } while (0)
> > +	do { if (verbose) pr_alert("%s" TORTURE_FLAG " %s\n", torture_type, s); } while (0)
> 
> This change is completely unrelated to the change described in the
> commit message.  This should not be part of this commit.

Turns out that I left out a hunk applying this in torture_kthread_stopping().
I have added that hunk and updated the commit log explaining why the change
to VERBOSE_TOROUT_STRING() is required.

								Thanx, Paul

> >  #define VERBOSE_TOROUT_ERRSTRING(s) \
> >  	do { if (verbose) pr_alert("%s" TORTURE_FLAG "!!! " s "\n", torture_type); } while (0)
> >  
> > @@ -88,5 +88,6 @@ void torture_init_end(void);
> >  bool torture_cleanup(void);
> >  bool torture_must_stop(void);
> >  bool torture_must_stop_irq(void);
> > +void torture_kthread_stopping(char *title);
> >  
> >  #endif /* __LINUX_TORTURE_H */
> > diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
> > index aaca2350e0e4..6d12fd18d97f 100644
> > --- a/kernel/rcu/rcutorture.c
> > +++ b/kernel/rcu/rcutorture.c
> > @@ -601,12 +601,13 @@ checkwait:	stutter_wait("rcu_torture_boost");
> >  	} while (!torture_must_stop());
> >  
> >  	/* Clean up and exit. */
> > -	VERBOSE_TOROUT_STRING("rcu_torture_boost task stopping");
> > -	torture_shutdown_absorb("rcu_torture_boost");
> > -	while (!kthread_should_stop() || rbi.inflight)
> > +	while (!kthread_should_stop() || rbi.inflight) {
> > +		torture_shutdown_absorb("rcu_torture_boost");
> >  		schedule_timeout_uninterruptible(1);
> > +	}
> >  	smp_mb(); /* order accesses to ->inflight before stack-frame death. */
> >  	destroy_rcu_head_on_stack(&rbi.rcu);
> > +	torture_kthread_stopping("rcu_torture_boost");
> >  	return 0;
> >  }
> >  
> > @@ -637,10 +638,7 @@ rcu_torture_fqs(void *arg)
> >  		}
> >  		stutter_wait("rcu_torture_fqs");
> >  	} while (!torture_must_stop());
> > -	VERBOSE_TOROUT_STRING("rcu_torture_fqs task stopping");
> > -	torture_shutdown_absorb("rcu_torture_fqs");
> > -	while (!kthread_should_stop())
> > -		schedule_timeout_uninterruptible(1);
> > +	torture_kthread_stopping("rcu_torture_fqs");
> >  	return 0;
> >  }
> >  
> > @@ -709,10 +707,7 @@ rcu_torture_writer(void *arg)
> >  		rcutorture_record_progress(++rcu_torture_current_version);
> >  		stutter_wait("rcu_torture_writer");
> >  	} while (!torture_must_stop());
> > -	VERBOSE_TOROUT_STRING("rcu_torture_writer task stopping");
> > -	torture_shutdown_absorb("rcu_torture_writer");
> > -	while (!kthread_should_stop())
> > -		schedule_timeout_uninterruptible(1);
> > +	torture_kthread_stopping("rcu_torture_writer");
> >  	return 0;
> >  }
> >  
> > @@ -747,10 +742,7 @@ rcu_torture_fakewriter(void *arg)
> >  		stutter_wait("rcu_torture_fakewriter");
> >  	} while (!torture_must_stop());
> >  
> > -	VERBOSE_TOROUT_STRING("rcu_torture_fakewriter task stopping");
> > -	torture_shutdown_absorb("rcu_torture_fakewriter");
> > -	while (!kthread_should_stop())
> > -		schedule_timeout_uninterruptible(1);
> > +	torture_kthread_stopping("rcu_torture_fakewriter");
> >  	return 0;
> >  }
> >  
> > @@ -891,12 +883,9 @@ rcu_torture_reader(void *arg)
> >  		schedule();
> >  		stutter_wait("rcu_torture_reader");
> >  	} while (!torture_must_stop());
> > -	VERBOSE_TOROUT_STRING("rcu_torture_reader task stopping");
> > -	torture_shutdown_absorb("rcu_torture_reader");
> >  	if (irqreader && cur_ops->irq_capable)
> >  		del_timer_sync(&t);
> > -	while (!kthread_should_stop())
> > -		schedule_timeout_uninterruptible(1);
> > +	torture_kthread_stopping("rcu_torture_reader");
> >  	return 0;
> >  }
> >  
> > @@ -1009,7 +998,7 @@ rcu_torture_stats(void *arg)
> >  		rcu_torture_stats_print();
> >  		torture_shutdown_absorb("rcu_torture_stats");
> >  	} while (!torture_must_stop());
> > -	VERBOSE_TOROUT_STRING("rcu_torture_stats task stopping");
> > +	torture_kthread_stopping("rcu_torture_stats");
> >  	return 0;
> >  }
> >  
> > @@ -1170,12 +1159,9 @@ static int rcu_torture_barrier_cbs(void *arg)
> >  		if (atomic_dec_and_test(&barrier_cbs_count))
> >  			wake_up(&barrier_wq);
> >  	} while (!torture_must_stop());
> > -	VERBOSE_TOROUT_STRING("rcu_torture_barrier_cbs task stopping");
> > -	torture_shutdown_absorb("rcu_torture_barrier_cbs");
> > -	while (!kthread_should_stop())
> > -		schedule_timeout_interruptible(1);
> >  	cur_ops->cb_barrier();
> >  	destroy_rcu_head_on_stack(&rcu);
> > +	torture_kthread_stopping("rcu_torture_barrier_cbs");
> >  	return 0;
> >  }
> >  
> > @@ -1206,10 +1192,7 @@ static int rcu_torture_barrier(void *arg)
> >  		n_barrier_successes++;
> >  		schedule_timeout_interruptible(HZ / 10);
> >  	} while (!torture_must_stop());
> > -	VERBOSE_TOROUT_STRING("rcu_torture_barrier task stopping");
> > -	torture_shutdown_absorb("rcu_torture_barrier");
> > -	while (!kthread_should_stop())
> > -		schedule_timeout_interruptible(1);
> > +	torture_kthread_stopping("rcu_torture_barrier");
> >  	return 0;
> >  }
> >  
> > diff --git a/kernel/torture.c b/kernel/torture.c
> > index 12a5807fb4e9..6f1c6600d183 100644
> > --- a/kernel/torture.c
> > +++ b/kernel/torture.c
> > @@ -169,7 +169,7 @@ torture_onoff(void *arg)
> >  		}
> >  		schedule_timeout_interruptible(onoff_interval);
> >  	}
> > -	VERBOSE_TOROUT_STRING("torture_onoff task stopping");
> > +	torture_kthread_stopping("torture_onoff");
> >  	return 0;
> >  }
> >  
> > @@ -370,7 +370,7 @@ static int torture_shuffle(void *arg)
> >  		torture_shuffle_tasks();
> >  		torture_shutdown_absorb("torture_shuffle");
> >  	} while (!torture_must_stop());
> > -	VERBOSE_TOROUT_STRING("torture_shuffle task stopping");
> > +	torture_kthread_stopping("torture_shuffle");
> >  	return 0;
> >  }
> >  
> > @@ -465,7 +465,7 @@ static int torture_shutdown(void *arg)
> >  		jiffies_snap = jiffies;
> >  	}
> >  	if (torture_must_stop()) {
> > -		VERBOSE_TOROUT_STRING("torture_shutdown task stopping");
> > +		torture_kthread_stopping("torture_shutdown");
> >  		return 0;
> >  	}
> >  
> > @@ -583,7 +583,7 @@ static int torture_stutter(void *arg)
> >  		ACCESS_ONCE(stutter_pause_test) = 0;
> >  		torture_shutdown_absorb("torture_stutter");
> >  	} while (!torture_must_stop());
> > -	VERBOSE_TOROUT_STRING("torture_stutter task stopping");
> > +	torture_kthread_stopping("torture_stutter");
> >  	return 0;
> >  }
> >  
> > @@ -696,3 +696,21 @@ bool torture_must_stop_irq(void)
> >  	return ACCESS_ONCE(fullstop) != FULLSTOP_DONTSTOP;
> >  }
> >  EXPORT_SYMBOL_GPL(torture_must_stop_irq);
> > +
> > +/*
> > + * Each kthread must wait for kthread_should_stop() before returning from
> > + * its top-level function, otherwise segfaults ensue.  This function
> > + * prints a "stopping" message and waits for kthread_should_stop(), and
> > + * should be called from all torture kthreads immediately prior to
> > + * returning.
> > + */
> > +void torture_kthread_stopping(char *title)
> > +{
> > +	if (verbose)
> > +		pr_alert("%s" TORTURE_FLAG " %s\n", torture_type, title);
> > +	while (!kthread_should_stop()) {
> > +		torture_shutdown_absorb(title);
> > +		schedule_timeout_uninterruptible(1);
> > +	}
> > +}
> > +EXPORT_SYMBOL_GPL(torture_kthread_stopping);
> > -- 
> > 1.8.1.5
> > 
> 


  reply	other threads:[~2014-02-18 21:35 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-17 22:12 [PATCH tip/core/rcu 0/55] Torture-test changes for 3.15 Paul E. McKenney
2014-02-17 22:12 ` [PATCH tip/core/rcu 01/55] rcutorture: Print grace-period performance statistics Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 02/55] rcutorture: Print script and arguments to standard output Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 03/55] rcutorture: Move common boot flags to kvm-test-1-rcu.sh Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 04/55] rcutorture: Allow kvm-test-1-rcu.sh to pause after build Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 05/55] rcutorture: Move common qemu flags to kvm-test-1.sh Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 06/55] rcutorture: Reduce SRCU-N number of CPUs Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 07/55] rcutorture: Enable concurrent rcutorture runs Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 08/55] rcutorture: Fix results-directory error message Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 09/55] rcutorture: Add dryrun capability Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 10/55] rcutorture: Handle multiple runs of the same test Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 11/55] rcutorture: Do better bin packing Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 12/55] rcutorture: Add comments, especially on " Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 13/55] rcutorture: Flag tests requiring more CPUs than are available Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 14/55] rcutorture: Print results directory when dumping results Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 15/55] rcutorture: Abstract rcu_torture_random() Paul E. McKenney
2014-02-18  0:11     ` Josh Triplett
2014-02-18  0:22       ` Paul E. McKenney
2014-02-18  0:27         ` Josh Triplett
2014-02-18 21:33           ` Paul E. McKenney
2014-02-19  2:52           ` George Spelvin
2014-02-17 22:12   ` [PATCH tip/core/rcu 16/55] rcutorture: Don't create results directory for dryruns Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 17/55] rcutorture: Abstract torture_param() Paul E. McKenney
2014-02-18  0:23     ` Josh Triplett
2014-02-18 21:31       ` Paul E. McKenney
2014-02-18 23:53         ` josh
2014-02-23 16:48           ` Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 18/55] rcutorture: Rename PRINTK to TOROUT Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 19/55] rcutorture: Abstract TOROUT_STRING() and friends Paul E. McKenney
2014-02-18  0:26     ` Josh Triplett
2014-02-18  0:58       ` Paul E. McKenney
2014-02-18  1:23         ` Josh Triplett
2014-02-18  1:43           ` Paul E. McKenney
2014-02-18  3:36             ` Josh Triplett
2014-02-17 22:12   ` [PATCH tip/core/rcu 20/55] rcutorture: Abstract torture_shutdown_absorb() Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 21/55] rcutorture: Export torture_type and verbose module parameters Paul E. McKenney
2014-02-18  0:29     ` Josh Triplett
2014-02-18  1:01       ` Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 22/55] rcutorture: Abstract torture_shuffle() Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 23/55] rcutorture: Abstract torture_onoff() Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 24/55] rcutorture: Abstract torture-test initialization Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 25/55] rcutorture: Abstract torture-test cleanup Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 26/55] rcutorture: Print dates when doing parallel rcutorture runs Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 27/55] rcutorture: Abstract torture_shutdown_notify() Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 28/55] rcutorture: Privatize fullstop Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 29/55] rcutorture: Add diagnostic for unscheduled system shutdown Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 30/55] rcutorture: Abstract stutter_wait() Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 31/55] rcutorture: Apply ACCESS_ONCE() to racy fullstop accesses Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 32/55] rcutorture: Abstract torture_shutdown() Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 33/55] rcutorture: Clean up rcu_torture_init() error checking Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 34/55] rcutorture: Announce task creation Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 35/55] rcutorture: Fix rcutorture shutdown races Paul E. McKenney
2014-02-18  0:32     ` Josh Triplett
2014-02-18 21:35       ` Paul E. McKenney [this message]
2014-02-17 22:12   ` [PATCH tip/core/rcu 36/55] rcutorture: Fix missing-return bug in rcu_torture_barrier_init() Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 37/55] rcutorture: Abstract torture_create_kthread() Paul E. McKenney
2014-02-18  0:34     ` Josh Triplett
2014-02-18 21:36       ` Paul E. McKenney
2014-02-19  0:02         ` josh
2014-02-17 22:12   ` [PATCH tip/core/rcu 38/55] rcutorture: Abstract torture_stop_kthread() Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 39/55] rcutorture: Stop generic kthreads in torture_cleanup() Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 40/55] rcutorture: Remove redundant module-alias directives Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 41/55] rcutorture: Abstract kvm-recheck.sh Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 42/55] locktorture: Add a lock-torture kernel module Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 43/55] rcutorture: Add an rcu_busted to test the test Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 44/55] rcutorture: Create config files for scripted test-the-test testing Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 45/55] rcutorture: Create CFcommon file for common Kconfig parameters Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 46/55] rcutorture: Remove RCU dependencies from ver_functions.sh API Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 47/55] rcutorture: Rename kvm-test-1-rcu.sh Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 48/55] rcutorture: Introduce "rcu" directory level underneath configs Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 49/55] locktorture: Add vestigial locktorture configuration Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 50/55] rcutorture: Gracefully handle NULL cleanup hooks Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 51/55] locktorture: Add kvm-recheck.sh plug-in for locktorture Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 52/55] rcutorture: Rename TREE_RCU-Kconfig.txt Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 53/55] rcutorture: Place kvm-test-1-run.sh output into res directory Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 54/55] rcutorture: Add a lock_busted to test the test Paul E. McKenney
2014-02-17 22:12   ` [PATCH tip/core/rcu 55/55] rcutorture: Save kvm.sh output to log Paul E. McKenney
2014-02-18  0:41 ` [PATCH tip/core/rcu 0/55] Torture-test changes for 3.15 Josh Triplett
2014-02-18  0:48   ` Josh Triplett
2014-02-18  1:18     ` Paul E. McKenney
2014-02-18  1:18   ` Paul E. McKenney

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140218213536.GZ4250@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=darren@dvhart.com \
    --cc=dhowells@redhat.com \
    --cc=dipankar@in.ibm.com \
    --cc=edumazet@google.com \
    --cc=fweisbec@gmail.com \
    --cc=josh@joshtriplett.org \
    --cc=laijs@cn.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mingo@kernel.org \
    --cc=niv@us.ibm.com \
    --cc=oleg@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=sbw@mit.edu \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.