Re: [PATCH 5/7] irq_work: Don't stop the tick with pending works
2012/11/15 Steven Rostedt : > On Wed, 2012-11-14 at 21:37 +0100, Frederic Weisbecker wrote: >> diff --git a/kernel/irq_work.c b/kernel/irq_work.c >> index 64eddd5..b3c113a 100644 >> --- a/kernel/irq_work.c >> +++ b/kernel/irq_work.c >> @@ -99,6 +99,17 @@ bool irq_work_queue(struct irq_work *work) >> } >> EXPORT_SYMBOL_GPL(irq_work_queue); >> >> +bool irq_work_needs_cpu(void) >> +{ >> + struct llist_head *this_list; >> + >> + this_list = &__get_cpu_var(irq_work_list); >> + if (llist_empty(this_list)) >> + return false; >> + > > I wounder if this should just be: > > return !llist_empty(_cpu_read(irq_work_list)); Yeah I'll simplify that way. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 5/7] irq_work: Don't stop the tick with pending works
2012/11/15 Steven Rostedt rost...@goodmis.org: On Wed, 2012-11-14 at 21:37 +0100, Frederic Weisbecker wrote: diff --git a/kernel/irq_work.c b/kernel/irq_work.c index 64eddd5..b3c113a 100644 --- a/kernel/irq_work.c +++ b/kernel/irq_work.c @@ -99,6 +99,17 @@ bool irq_work_queue(struct irq_work *work) } EXPORT_SYMBOL_GPL(irq_work_queue); +bool irq_work_needs_cpu(void) +{ + struct llist_head *this_list; + + this_list = __get_cpu_var(irq_work_list); + if (llist_empty(this_list)) + return false; + I wounder if this should just be: return !llist_empty(this_cpu_read(irq_work_list)); Yeah I'll simplify that way. -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 5/7] irq_work: Don't stop the tick with pending works
On Wed, 2012-11-14 at 21:37 +0100, Frederic Weisbecker wrote: > Don't stop the tick if we have pending irq works on the > queue, otherwise if the arch can't raise self-IPIs, we may not > find an opportunity to execute the pending works for a while. > > Signed-off-by: Frederic Weisbecker > Cc: Peter Zijlstra > Cc: Thomas Gleixner > Cc: Ingo Molnar > Cc: Andrew Morton > Cc: Steven Rostedt > Cc: Paul Gortmaker > --- > include/linux/irq_work.h |6 ++ > kernel/irq_work.c| 11 +++ > kernel/time/tick-sched.c |3 ++- > 3 files changed, 19 insertions(+), 1 deletions(-) > > diff --git a/include/linux/irq_work.h b/include/linux/irq_work.h > index 6a9e8f5..a69704f 100644 > --- a/include/linux/irq_work.h > +++ b/include/linux/irq_work.h > @@ -20,4 +20,10 @@ bool irq_work_queue(struct irq_work *work); > void irq_work_run(void); > void irq_work_sync(struct irq_work *work); > > +#ifdef CONFIG_IRQ_WORK > +bool irq_work_needs_cpu(void); > +#else > +static bool irq_work_needs_cpu(void) { return false; } > +#endif > + > #endif /* _LINUX_IRQ_WORK_H */ > diff --git a/kernel/irq_work.c b/kernel/irq_work.c > index 64eddd5..b3c113a 100644 > --- a/kernel/irq_work.c > +++ b/kernel/irq_work.c > @@ -99,6 +99,17 @@ bool irq_work_queue(struct irq_work *work) > } > EXPORT_SYMBOL_GPL(irq_work_queue); > > +bool irq_work_needs_cpu(void) > +{ > + struct llist_head *this_list; > + > + this_list = &__get_cpu_var(irq_work_list); > + if (llist_empty(this_list)) > + return false; > + I wounder if this should just be: return !llist_empty(_cpu_read(irq_work_list)); -- Steve > + return true; > +} > + > /* > * Run the irq_work entries on this cpu. Requires to be ran from hardirq > * context with local IRQs disabled. > diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c > index 9e945aa..f249e8c 100644 > --- a/kernel/time/tick-sched.c > +++ b/kernel/time/tick-sched.c > @@ -20,6 +20,7 @@ > #include > #include > #include > +#include > > #include > > @@ -289,7 +290,7 @@ static ktime_t tick_nohz_stop_sched_tick(struct > tick_sched *ts, > } while (read_seqretry(_lock, seq)); > > if (rcu_needs_cpu(cpu, _delta_jiffies) || printk_needs_cpu(cpu) || > - arch_needs_cpu(cpu)) { > + arch_needs_cpu(cpu) || irq_work_needs_cpu()) { > next_jiffies = last_jiffies + 1; > delta_jiffies = 1; > } else { -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 5/7] irq_work: Don't stop the tick with pending works
On Wed, 2012-11-14 at 21:37 +0100, Frederic Weisbecker wrote: Don't stop the tick if we have pending irq works on the queue, otherwise if the arch can't raise self-IPIs, we may not find an opportunity to execute the pending works for a while. Signed-off-by: Frederic Weisbecker fweis...@gmail.com Cc: Peter Zijlstra pet...@infradead.org Cc: Thomas Gleixner t...@linutronix.de Cc: Ingo Molnar mi...@kernel.org Cc: Andrew Morton a...@linux-foundation.org Cc: Steven Rostedt rost...@goodmis.org Cc: Paul Gortmaker paul.gortma...@windriver.com --- include/linux/irq_work.h |6 ++ kernel/irq_work.c| 11 +++ kernel/time/tick-sched.c |3 ++- 3 files changed, 19 insertions(+), 1 deletions(-) diff --git a/include/linux/irq_work.h b/include/linux/irq_work.h index 6a9e8f5..a69704f 100644 --- a/include/linux/irq_work.h +++ b/include/linux/irq_work.h @@ -20,4 +20,10 @@ bool irq_work_queue(struct irq_work *work); void irq_work_run(void); void irq_work_sync(struct irq_work *work); +#ifdef CONFIG_IRQ_WORK +bool irq_work_needs_cpu(void); +#else +static bool irq_work_needs_cpu(void) { return false; } +#endif + #endif /* _LINUX_IRQ_WORK_H */ diff --git a/kernel/irq_work.c b/kernel/irq_work.c index 64eddd5..b3c113a 100644 --- a/kernel/irq_work.c +++ b/kernel/irq_work.c @@ -99,6 +99,17 @@ bool irq_work_queue(struct irq_work *work) } EXPORT_SYMBOL_GPL(irq_work_queue); +bool irq_work_needs_cpu(void) +{ + struct llist_head *this_list; + + this_list = __get_cpu_var(irq_work_list); + if (llist_empty(this_list)) + return false; + I wounder if this should just be: return !llist_empty(this_cpu_read(irq_work_list)); -- Steve + return true; +} + /* * Run the irq_work entries on this cpu. Requires to be ran from hardirq * context with local IRQs disabled. diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 9e945aa..f249e8c 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -20,6 +20,7 @@ #include linux/profile.h #include linux/sched.h #include linux/module.h +#include linux/irq_work.h #include asm/irq_regs.h @@ -289,7 +290,7 @@ static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts, } while (read_seqretry(xtime_lock, seq)); if (rcu_needs_cpu(cpu, rcu_delta_jiffies) || printk_needs_cpu(cpu) || - arch_needs_cpu(cpu)) { + arch_needs_cpu(cpu) || irq_work_needs_cpu()) { next_jiffies = last_jiffies + 1; delta_jiffies = 1; } else { -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/