Re: [RFC PATCH 10/14] ring_buffer: Fix more races when terminating the producer in the benchmark

From: Petr Mladek
Date: Fri Sep 04 2015 - 05:39:05 EST


On Mon 2015-08-03 14:33:23, Steven Rostedt wrote:
> On Tue, 28 Jul 2015 16:39:27 +0200
> Petr Mladek <pmladek@xxxxxxxx> wrote:
>
> > @@ -384,7 +389,7 @@ static int ring_buffer_consumer_thread(void *arg)
> >
> > static int ring_buffer_producer_thread(void *arg)
> > {
> > - while (!kthread_should_stop() && !kill_test) {
> > + while (!break_test()) {
> > ring_buffer_reset(buffer);
> >
> > if (consumer) {
> > @@ -393,11 +398,15 @@ static int ring_buffer_producer_thread(void *arg)
> > }
> >
> > ring_buffer_producer();
> > - if (kill_test)
> > + if (break_test())
> > goto out_kill;
> >
> > trace_printk("Sleeping for 10 secs\n");
> > set_current_state(TASK_INTERRUPTIBLE);
> > + if (break_test()) {
> > + __set_current_state(TASK_RUNNING);
>
> Move the setting of the current state to after the out_kill label.

Please, find below the updated version of this patch.

I also reverted some changes in the consumer code. It never stays
in a loop for too long and it must stay in ring_buffer_producer()
until "reader_finish" variable is set.