All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] irqflags: fix (at least latent) code generation issue
@ 2014-11-04  8:23 Jan Beulich
  2014-11-10 12:13 ` Ingo Molnar
  0 siblings, 1 reply; 3+ messages in thread
From: Jan Beulich @ 2014-11-04  8:23 UTC (permalink / raw)
  To: linux-kernel; +Cc: Steven Rostedt, akpm, mingo

The conditional in local_irq_restore() otherwise can cause code bloat
(the if and else blocks may get translated into separate code paths
despite the generated code being identical, dependent on compiler
internal heuristics). Note that this adjustment gets the code in sync
with the comment preceding it (which was slightly wrong from at least
from 2.6.37 onwards).

The code bloat was observed in reality with an experimental x86 patch
I'm about to post as RFC.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
---
 include/linux/irqflags.h |    6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

--- 3.18-rc3/include/linux/irqflags.h
+++ 3.18-rc3-irqflags/include/linux/irqflags.h
@@ -85,7 +85,7 @@
  * The local_irq_*() APIs are equal to the raw_local_irq*()
  * if !TRACE_IRQFLAGS.
  */
-#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
+#ifdef CONFIG_TRACE_IRQFLAGS
 #define local_irq_enable() \
 	do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)
 #define local_irq_disable() \
@@ -131,7 +131,7 @@
 	} while (0)
 
 
-#else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */
+#else /* !CONFIG_TRACE_IRQFLAGS */
 
 #define local_irq_enable()	do { raw_local_irq_enable(); } while (0)
 #define local_irq_disable()	do { raw_local_irq_disable(); } while (0)
@@ -145,6 +145,6 @@
 #define irqs_disabled_flags(flags) (raw_irqs_disabled_flags(flags))
 #define safe_halt()		do { raw_safe_halt(); } while (0)
 
-#endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */
+#endif /* CONFIG_TRACE_IRQFLAGS */
 
 #endif




^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] irqflags: fix (at least latent) code generation issue
  2014-11-04  8:23 [PATCH] irqflags: fix (at least latent) code generation issue Jan Beulich
@ 2014-11-10 12:13 ` Ingo Molnar
  2014-11-28 17:10   ` Jan Beulich
  0 siblings, 1 reply; 3+ messages in thread
From: Ingo Molnar @ 2014-11-10 12:13 UTC (permalink / raw)
  To: Jan Beulich; +Cc: linux-kernel, Steven Rostedt, akpm, mingo, Peter Zijlstra


* Jan Beulich <JBeulich@suse.com> wrote:

> The conditional in local_irq_restore() otherwise can cause code bloat
> (the if and else blocks may get translated into separate code paths
> despite the generated code being identical, dependent on compiler
> internal heuristics). Note that this adjustment gets the code in sync
> with the comment preceding it (which was slightly wrong from at least
> from 2.6.37 onwards).
> 
> The code bloat was observed in reality with an experimental x86 patch
> I'm about to post as RFC.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> ---
>  include/linux/irqflags.h |    6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> --- 3.18-rc3/include/linux/irqflags.h
> +++ 3.18-rc3-irqflags/include/linux/irqflags.h
> @@ -85,7 +85,7 @@
>   * The local_irq_*() APIs are equal to the raw_local_irq*()
>   * if !TRACE_IRQFLAGS.
>   */
> -#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
> +#ifdef CONFIG_TRACE_IRQFLAGS
>  #define local_irq_enable() \
>  	do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)
>  #define local_irq_disable() \
> @@ -131,7 +131,7 @@
>  	} while (0)
>  
>  
> -#else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */
> +#else /* !CONFIG_TRACE_IRQFLAGS */
>  
>  #define local_irq_enable()	do { raw_local_irq_enable(); } while (0)
>  #define local_irq_disable()	do { raw_local_irq_disable(); } while (0)
> @@ -145,6 +145,6 @@
>  #define irqs_disabled_flags(flags) (raw_irqs_disabled_flags(flags))
>  #define safe_halt()		do { raw_safe_halt(); } while (0)
>  
> -#endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */
> +#endif /* CONFIG_TRACE_IRQFLAGS */

So this breaks a couple of non-x86 architectures, such as MIPS:

/home/mingo/tip/include/acpi/platform/aclinuxex.h: In function 'acpi_os_allocate':
/home/mingo/tip/include/acpi/platform/aclinuxex.h:86: error: implicit declaration of function 'arch_irqs_disabled'

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] irqflags: fix (at least latent) code generation issue
  2014-11-10 12:13 ` Ingo Molnar
@ 2014-11-28 17:10   ` Jan Beulich
  0 siblings, 0 replies; 3+ messages in thread
From: Jan Beulich @ 2014-11-28 17:10 UTC (permalink / raw)
  To: Ingo Molnar; +Cc: Peter Zijlstra, Steven Rostedt, akpm, mingo, linux-kernel

>>> On 10.11.14 at 13:13, <mingo@kernel.org> wrote:
> * Jan Beulich <JBeulich@suse.com> wrote:
>> @@ -131,7 +131,7 @@
>>  	} while (0)
>>  
>>  
>> -#else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */
>> +#else /* !CONFIG_TRACE_IRQFLAGS */
>>  
>>  #define local_irq_enable()	do { raw_local_irq_enable(); } while (0)
>>  #define local_irq_disable()	do { raw_local_irq_disable(); } while (0)
>> @@ -145,6 +145,6 @@
>>  #define irqs_disabled_flags(flags) (raw_irqs_disabled_flags(flags))
>>  #define safe_halt()		do { raw_safe_halt(); } while (0)
>>  
>> -#endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */
>> +#endif /* CONFIG_TRACE_IRQFLAGS */
> 
> So this breaks a couple of non-x86 architectures, such as MIPS:
> 
> /home/mingo/tip/include/acpi/platform/aclinuxex.h: In function 
> 'acpi_os_allocate':
> /home/mingo/tip/include/acpi/platform/aclinuxex.h:86: error: implicit 
> declaration of function 'arch_irqs_disabled'

Now that I finally found time to look into this a little, I wonder what
you expect: Code in linux/irqflags.h ahead of the above conditional
uses arch_irqs_disable():

#define raw_irqs_disabled()		(arch_irqs_disabled())

so it would seem to me that architectures are required to have the
latter available. And in fact it would seem very logical to me if pieces
like the definition of irqs_disabled() would be pulled out of that
conditional, as their behavior shouldn't (for this one) or already
doesn't (for e.g. irqs_disabled_flags() and local_save_flags()) differ
between the two cases. Would, short of adding arch_irqs_disabled()
for all architectures currently lacking it, uniformly using the definition
from the #if portion of the conditional be an acceptable thing? If not,
do you have any other suggestion on how to resolve this?

Jan


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-11-28 17:10 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-04  8:23 [PATCH] irqflags: fix (at least latent) code generation issue Jan Beulich
2014-11-10 12:13 ` Ingo Molnar
2014-11-28 17:10   ` Jan Beulich

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.