linux-mips
[Top] [All Lists]

Re: [PATCH] MIPS: Make BUG() __noreturn.

To: Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH] MIPS: Make BUG() __noreturn.
From: Ingo Molnar <mingo@elte.hu>
Date: Sun, 23 Nov 2008 10:58:18 +0100
Cc: David Daney <ddaney@caviumnetworks.com>, linux-mips@linux-mips.org, linux-kernel@vger.kernel.org
In-reply-to: <20081121150023.032f7b5b.akpm@linux-foundation.org>
Original-recipient: rfc822;linux-mips@linux-mips.org
References: <49260E4C.8080500@caviumnetworks.com> <20081121150023.032f7b5b.akpm@linux-foundation.org>
Sender: linux-mips-bounce@linux-mips.org
User-agent: Mutt/1.5.18 (2008-05-17)
* Andrew Morton <akpm@linux-foundation.org> wrote:

> > +static inline void __noreturn BUG(void)
> > +{
> > +   __asm__ __volatile__("break %0" : : "i" (BRK_BUG));
> > +   /* Fool GCC into thinking the function doesn't return. */
> > +   while (1)
> > +           ;
> > +}
> 
> This kind of sucks, doesn't it?  It adds instructions into the 
> kernel text, very frequently on fast paths.  Those instructions are 
> never executed, and we're blowing away i-cache just to quash 
> compiler warnings.
> 
> For example, this:
> 
> --- a/arch/x86/include/asm/bug.h~a
> +++ a/arch/x86/include/asm/bug.h
> @@ -22,14 +22,12 @@ do {                                                      
>         \
>                    ".popsection"                              \
>                    : : "i" (__FILE__), "i" (__LINE__),        \
>                    "i" (sizeof(struct bug_entry)));           \
> -     for (;;) ;                                              \
>  } while (0)
>  
>  #else
>  #define BUG()                                                        \
>  do {                                                         \
>       asm volatile("ud2");                                    \
> -     for (;;) ;                                              \
>  } while (0)
>  #endif
>  
> _
> 
> reduces the size of i386 mm/vmalloc.o text by 56 bytes.

yes - the total image effect is significantly - recently looked at how 
much larger !CONFIG_BUG builds would get if we inserted an infinite 
loop into them - it was in the 50K text range (!).

but in the x86 ud2 case we could guarantee that we wont ever return 
from that exception. Mind sending a patch with a signoff, a 
description and an infinite loop in the u2d handler?

        Ingo

<Prev in Thread] Current Thread [Next in Thread>