From: Andi Kleen <ak@muc.de>
To: Tim Bird <tim.bird@am.sony.com>
Cc: linux-kernel@vger.kernel.org
Subject: Re: Is extern inline -> static inline OK?
Date: Sat, 07 Aug 2004 01:26:04 +0200 [thread overview]
Message-ID: <m3657vj1bn.fsf@averell.firstfloor.org> (raw)
In-Reply-To: <2qlo1-wO-37@gated-at.bofh.it> (Tim Bird's message of "Sat, 07 Aug 2004 00:30:13 +0200")
Tim Bird <tim.bird@am.sony.com> writes:
> H. Peter Anvin wrote:
>> Followup to: <4112D32B.4060900@am.sony.com>
>> By author: Tim Bird <tim.bird@am.sony.com>
>> In newsgroup: linux.dev.kernel
>>
>>>Pardon my ignorance...
>>>
>>>Under what conditions is it NOT OK to convert "extern inline"
>>>to "static inline"?
>>>
>> When the code is broken if it doesn't inline.
>
> Thanks!
>
> From what I have read, for either 'extern inline' or 'static inline'
> the compiler is free to not inline the code. Is this wrong?
Yes, it's wrong in current Linux 2.6. It currently defines inline to
inline __attribute__((always_inline))
> It is my understanding that...
> In the 'static inline' case the compiler may create a function in the
> local compilation unit. But in the 'extern inline' case an extern
> non-inline function must exist. If the compiler decides not to inline
> the function, and a non-inline function does not exist, you get a linker
> error. Are you saying that, therefore, 'extern inline' functions are
> used (without definition of extern non-inline functions to back them)
> in order to guarantee that NO non-inline version of the function exists?
Exactly.
Originally it was used this way, but then the inlining algorithms got
completely broken to not explode compile times on broken C++ template
horrors, and in order to still compile the kernel most uses of extern
inline were converted to static inline.
Drawback is that you suddenly got a lot of binary bloat
(e.g. at some point gcc decided to not inline anymore
the constant evaluation code in copy_{to,from}_user,
which caused incredibly code bloat).
That is when the #define inline __attribute__((always_inline)) was
added.
> Or are you saying that the non-inline version of the function may
> be written differently than the inline version?
That was the original intention I think, but Linux always has used
it for the first interpretation.
It's pretty obsolete now, modern gcc has __attribute__((always_inline)),
which is a better way to do this. You get a compiler error when
the function cannot inlined. It also has a __attribute__((noinline))
for the opposite case.
Hope this helps,
-Andi
next parent reply other threads:[~2004-08-06 23:26 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <2q0Wb-2Tc-17@gated-at.bofh.it>
[not found] ` <2q1pe-3hq-17@gated-at.bofh.it>
[not found] ` <2qlo1-wO-37@gated-at.bofh.it>
2004-08-06 23:26 ` Andi Kleen [this message]
2004-08-07 1:26 ` Is extern inline -> static inline OK? Adrian Bunk
2004-08-06 0:39 Tim Bird
2004-08-06 0:58 ` H. Peter Anvin
2004-08-06 22:29 ` Tim Bird
2004-08-06 22:29 ` H. Peter Anvin
[not found] ` <20040806070027.GA20642@twiddle.net>
2004-08-06 18:57 ` Tim Bird
2004-08-07 2:41 ` Richard Henderson
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=m3657vj1bn.fsf@averell.firstfloor.org \
--to=ak@muc.de \
--cc=linux-kernel@vger.kernel.org \
--cc=tim.bird@am.sony.com \
/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