From: David Daney <ddaney@caviumnetworks.com>
To: Brian Gerst <brgerst@gmail.com>
Cc: torvalds@linux-foundation.org, akpm@linux-foundation.org,
linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
Ingo Molnar <mingo@elte.hu>
Subject: Re: [PATCH 11/11] Use unreachable() in asm-generic/bug.h for !CONFIG_BUG case.
Date: Mon, 14 Sep 2009 16:28:14 -0700 [thread overview]
Message-ID: <4AAED18E.7030903@caviumnetworks.com> (raw)
In-Reply-To: <73c1f2160909141612i32f46361q7430cecf0b68d07b@mail.gmail.com>
Brian Gerst wrote:
> On Mon, Sep 14, 2009 at 5:55 PM, David Daney <ddaney@caviumnetworks.com> wrote:
>> The subject says it all (most). The only drawback here is that for a
>> pre-GCC-5.4 compiler, instead of expanding to nothing we now expand
>> BUG() to an endless loop. Before the patch when configured with
>> !CONFIG_BUG() you might get some warnings, but the code would be
>> small. After the patch there are no warnings, but there is an endless
>> loop at each BUG() site.
>>
>> Of course for the GCC-4.5 case we get the best of both worlds.
>>
>> Signed-off-by: David Daney <ddaney@caviumnetworks.com>
>> Suggested-by: Ingo Molnar <mingo@elte.hu>
>> CC: Ingo Molnar <mingo@elte.hu>
>> ---
>> include/asm-generic/bug.h | 4 ++--
>> 1 files changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h
>> index 4b67559..e952242 100644
>> --- a/include/asm-generic/bug.h
>> +++ b/include/asm-generic/bug.h
>> @@ -89,11 +89,11 @@ extern void warn_slowpath_null(const char *file, const int line);
>>
>> #else /* !CONFIG_BUG */
>> #ifndef HAVE_ARCH_BUG
>> -#define BUG() do {} while(0)
>> +#define BUG() unreachable()
>> #endif
>>
>> #ifndef HAVE_ARCH_BUG_ON
>> -#define BUG_ON(condition) do { if (condition) ; } while(0)
>> +#define BUG_ON(condition) do { if (condition) unreachable(); } while (0)
>> #endif
>>
>> #ifndef HAVE_ARCH_WARN_ON
>> --
>
> This seems wrong to me. Wouldn't you always want to do the endless
> loop? In the absence of an arch-specific method to jump to an
> exception handler, it isn't really unreachable. On gcc 4.5 this would
> essentially become a no-op.
>
Several points:
* When you hit a BUG() you are screwed.
* When you configure with !CONFIG_BUG you are asserting that you don't
want to try to trap on BUG();.
The existing code just falls through to whatever happens to follow the
BUG(). This is not what the programmer intended, but the person that
chose !CONFIG_BUG decided that they would like undefined behavior in
order to save a few bytes of code.
With the patch one of two things will happen:
pre-GCC-4.5) We will now enter an endless loop and not fall through.
This makes the code slightly larger than pre patch.
post-GCC-4.5) We do something totally undefined. It will not
necessarily fall through to the code after the BUG() It could really
end up doing almost anything. On the plus side, we save a couple of
bytes of code and eliminate some compiler warnings.
If you don't like it, don't configure with !CONFIG_BUG. But the patch
doesn't really change the fact that hitting a BUG() with !CONFIG_BUG
leads to undefined behavior. It only makes the case where you don't hit
BUG() nicer.
David Daney
next prev parent reply other threads:[~2009-09-14 23:29 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-14 21:50 [PATCH 00/11] Add support for GCC's __builtin_unreachable() and use it in BUG (v2) David Daney
2009-09-14 21:55 ` [PATCH 01/11] Add support for GCC-4.5's __builtin_unreachable() to compiler.h (v2) David Daney
2009-09-14 21:55 ` [PATCH 02/11] x86: Convert BUG() to use unreachable() David Daney
2009-09-14 21:55 ` [PATCH 03/11] MIPS: " David Daney
2009-09-15 8:39 ` [PATCH] MIPS: Make more use of unreachable() Ralf Baechle
2009-09-14 21:55 ` [PATCH 04/11] s390: Convert BUG() to use unreachable() David Daney
2009-09-14 21:55 ` [PATCH 05/11] mn10300: " David Daney
2009-09-14 21:55 ` [PATCH 06/11] parisc: " David Daney
2009-09-14 21:55 ` [PATCH 07/11] powerpc: " David Daney
2009-09-14 21:55 ` [PATCH 08/11] alpha: " David Daney
2009-09-14 21:55 ` [PATCH 09/11] avr32: " David Daney
2009-09-14 21:55 ` [PATCH 10/11] blackfin: " David Daney
2009-09-14 21:55 ` [PATCH 11/11] Use unreachable() in asm-generic/bug.h for !CONFIG_BUG case David Daney
2009-09-14 23:12 ` Brian Gerst
2009-09-14 23:28 ` David Daney [this message]
2009-09-14 23:39 ` Linus Torvalds
2009-09-15 15:35 ` David Daney
2009-09-14 23:54 ` Brian Gerst
2009-09-15 16:02 ` David Daney
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4AAED18E.7030903@caviumnetworks.com \
--to=ddaney@caviumnetworks.com \
--cc=akpm@linux-foundation.org \
--cc=brgerst@gmail.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox