Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1579220

Re: [PATCH] softirq: Prevent looping on disabled tasklets

From Chris Wilson <chris@chris-wilson.co.uk>
Newsgroups linux.kernel
Subject Re: [PATCH] softirq: Prevent looping on disabled tasklets
Date 2017-02-12 15:30 +0100
Message-ID <ta3k6-7oJ-9@gated-at.bofh.it> (permalink)
References <ta30K-7i0-9@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


On Sun, Feb 12, 2017 at 02:00:19PM +0000, Chris Wilson wrote:
> Disabling a tasklet causes it not to run during tasklet_action, but is
> put back onto the runnable tasklet list, and a new softirq raised. As
> the softirq is raised from within __do_softirq() this causing
> __do_softirq() to loop constantly until its timeslice expires and is
> transferred to the ksoftirq thread. ksoftirq then permanently spins,
> as on each action, the disabled tasklet keeps reraising the softirq.
> 
> Break this vicious cycle by moving the softirq from the action to the
> final tasklet_enable().
> 
> This behaviour appears to be historic (since the first git import).
> However, the looping until timeslice duration (to a max of 2ms) was
> first introduced in commit c10d73671ad3 ("softirq: reduce latencies"),
> with the restart limit restored in commit 34376a50fb1f ("Fix lockup
> related to stop_machine being stuck in __do_softirq.")
> 
> Reported-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Hannes Reinecke <hare@suse.com>
> Cc: Jens Axboe <axboe@kernel.dk>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Cc: Alexander Potapenko <glider@google.com>
> Cc: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
> Cc: Ingo Molnar <mingo@kernel.org>
> Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org>
> Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> Cc: Johannes Thumshirn <jthumshirn@suse.de>
> Cc: Emese Revfy <re.emese@gmail.com>
> Cc: Sagi Grimberg <sagi@grimberg.me>
> Cc: Eric Dumazet <edumazet@google.com>
> Cc: Tom Herbert <therbert@google.com>
> Cc: Ben Hutchings <bhutchings@solarflare.com>
> ---
>  include/linux/interrupt.h | 7 +++++--
>  kernel/softirq.c          | 2 --
>  2 files changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
> index 53144e78a369..12750f00d00d 100644
> --- a/include/linux/interrupt.h
> +++ b/include/linux/interrupt.h
> @@ -613,8 +613,11 @@ static inline void tasklet_disable(struct tasklet_struct *t)
>  
>  static inline void tasklet_enable(struct tasklet_struct *t)
>  {
> -	smp_mb__before_atomic();
> -	atomic_dec(&t->count);
> +	if (!atomic_dec_and_test(&t->count))
> +		return;
> +
> +	if (test_bit(TASKLET_STATE_SCHED, &t->state))
> +		raise_softirq(HI_SOFTIRQ | TASKLET_SOFTIRQ);

raise_softirq is not exported, so let's move tasklet_enable()
out-of-line and export that.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH] softirq: Prevent looping on disabled tasklets Chris Wilson <chris@chris-wilson.co.uk> - 2017-02-12 15:10 +0100
  Re: [PATCH] softirq: Prevent looping on disabled tasklets Chris Wilson <chris@chris-wilson.co.uk> - 2017-02-12 15:30 +0100
  [PATCH v2] softirq: Prevent looping on disabled tasklets Chris Wilson <chris@chris-wilson.co.uk> - 2017-02-12 15:40 +0100
  Re: [Intel-gfx] [PATCH] softirq: Prevent looping on disabled tasklets kbuild test robot <lkp@intel.com> - 2017-02-12 16:10 +0100
  [PATCH v3] softirq: Prevent looping on disabled tasklets Chris Wilson <chris@chris-wilson.co.uk> - 2017-02-12 16:50 +0100
    Re: [PATCH v3] softirq: Prevent looping on disabled tasklets Chris Wilson <chris@chris-wilson.co.uk> - 2017-02-12 17:10 +0100

csiph-web