Re: [PATCH 5/7] irq_work: Don't stop the tick with pending works

2012-11-15 Thread Frederic Weisbecker
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 Thread Frederic Weisbecker
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

2012-11-14 Thread Steven Rostedt
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

2012-11-14 Thread Steven Rostedt
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/