* [2.6.37-rc1] Build failure: __divdi3
@ 2010-11-05 8:59 Tetsuo Handa
2010-11-05 16:09 ` Randy Dunlap
0 siblings, 1 reply; 10+ messages in thread
From: Tetsuo Handa @ 2010-11-05 8:59 UTC (permalink / raw)
To: linux-fsdevel
WARNING: modpost: Found 5 section mismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
fs/built-in.o(.text+0x3e357): In function `alignfile':
: undefined reference to `__divdi3'
fs/built-in.o(.text+0x3e39b): In function `alignfile':
: undefined reference to `__divdi3'
fs/built-in.o(.text+0x3f1af): In function `elf_core_dump':
: undefined reference to `__divdi3'
make: *** [.tmp_vmlinux1] Error 1
Regards.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [2.6.37-rc1] Build failure: __divdi3
2010-11-05 8:59 [2.6.37-rc1] Build failure: __divdi3 Tetsuo Handa
@ 2010-11-05 16:09 ` Randy Dunlap
2010-11-05 16:48 ` Tetsuo Handa
0 siblings, 1 reply; 10+ messages in thread
From: Randy Dunlap @ 2010-11-05 16:09 UTC (permalink / raw)
To: Tetsuo Handa; +Cc: linux-fsdevel
On Fri, 05 Nov 2010 17:59:42 +0900 Tetsuo Handa wrote:
>
> WARNING: modpost: Found 5 section mismatch(es).
> To see full details build your kernel with:
> 'make CONFIG_DEBUG_SECTION_MISMATCH=y'
> fs/built-in.o(.text+0x3e357): In function `alignfile':
> : undefined reference to `__divdi3'
> fs/built-in.o(.text+0x3e39b): In function `alignfile':
> : undefined reference to `__divdi3'
> fs/built-in.o(.text+0x3f1af): In function `elf_core_dump':
> : undefined reference to `__divdi3'
> make: *** [.tmp_vmlinux1] Error 1
Hm, all due to usage of roundup() AFAICT. Unfortunate.
---
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code ***
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [2.6.37-rc1] Build failure: __divdi3
2010-11-05 16:09 ` Randy Dunlap
@ 2010-11-05 16:48 ` Tetsuo Handa
2010-11-05 16:55 ` Eric Paris
0 siblings, 1 reply; 10+ messages in thread
From: Tetsuo Handa @ 2010-11-05 16:48 UTC (permalink / raw)
To: rdunlap, akpm, eparis, jmorris; +Cc: linux-fsdevel
Hello.
Randy Dunlap wrote:
> On Fri, 05 Nov 2010 17:59:42 +0900 Tetsuo Handa wrote:
>
> >
> > WARNING: modpost: Found 5 section mismatch(es).
> > To see full details build your kernel with:
> > 'make CONFIG_DEBUG_SECTION_MISMATCH=y'
> > fs/built-in.o(.text+0x3e357): In function `alignfile':
> > : undefined reference to `__divdi3'
> > fs/built-in.o(.text+0x3e39b): In function `alignfile':
> > : undefined reference to `__divdi3'
> > fs/built-in.o(.text+0x3f1af): In function `elf_core_dump':
> > : undefined reference to `__divdi3'
> > make: *** [.tmp_vmlinux1] Error 1
>
>
> Hm, all due to usage of roundup() AFAICT. Unfortunate.
Indeed. There is a commit for avoiding 64-bit division.
commit ea7f1b6ee9dc96c5827b06ba21d7769d553efb7d
Author: Bjorn Helgaas <bjorn.helgaas@hp.com>
Date: Thu Nov 5 11:17:11 2009 -0600
x86/PCI: remove 64-bit division
The roundup() caused a build error (undefined reference to `__udivdi3').
We're aligning to power-of-two boundaries, so it's simpler to just use
ALIGN() anyway, which avoids the division.
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Acked-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
It seems that the code itself has not changed between 2.6.36 and 2.6.37-rc1
static int elf_core_dump(struct coredump_params *cprm)
{
(...snipped...)
loff_t offset = 0, dataoff, foffset;
(...snipped...)
dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
but the definition of roundup() has changed by
commit b28efd54d9d5c8005a29cd8782335beb9daaa32d
Author: Eric Paris <eparis@redhat.com>
Date: Wed Oct 13 17:50:08 2010 -0400
kernel: roundup should only reference arguments once
Currently the roundup macro references it's arguments more than one time.
This patch changes it so it will only use its arguments once.
Suggested-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Eric Paris <eparis@redhat.com>
Signed-off-by: James Morris <jmorris@namei.org>
between 2.6.36 and 2.6.37-rc1.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [2.6.37-rc1] Build failure: __divdi3
2010-11-05 16:48 ` Tetsuo Handa
@ 2010-11-05 16:55 ` Eric Paris
2010-11-05 17:08 ` Tetsuo Handa
0 siblings, 1 reply; 10+ messages in thread
From: Eric Paris @ 2010-11-05 16:55 UTC (permalink / raw)
To: Tetsuo Handa; +Cc: rdunlap, akpm, jmorris, linux-fsdevel
On Sat, 2010-11-06 at 01:48 +0900, Tetsuo Handa wrote:
> Hello.
>
> Randy Dunlap wrote:
> > On Fri, 05 Nov 2010 17:59:42 +0900 Tetsuo Handa wrote:
> >
> > >
> > > WARNING: modpost: Found 5 section mismatch(es).
> > > To see full details build your kernel with:
> > > 'make CONFIG_DEBUG_SECTION_MISMATCH=y'
> > > fs/built-in.o(.text+0x3e357): In function `alignfile':
> > > : undefined reference to `__divdi3'
> > > fs/built-in.o(.text+0x3e39b): In function `alignfile':
> > > : undefined reference to `__divdi3'
> > > fs/built-in.o(.text+0x3f1af): In function `elf_core_dump':
> > > : undefined reference to `__divdi3'
> > > make: *** [.tmp_vmlinux1] Error 1
> >
> >
> > Hm, all due to usage of roundup() AFAICT. Unfortunate.
>
> Indeed. There is a commit for avoiding 64-bit division.
>
> commit ea7f1b6ee9dc96c5827b06ba21d7769d553efb7d
> Author: Bjorn Helgaas <bjorn.helgaas@hp.com>
> Date: Thu Nov 5 11:17:11 2009 -0600
>
> x86/PCI: remove 64-bit division
>
> The roundup() caused a build error (undefined reference to `__udivdi3').
> We're aligning to power-of-two boundaries, so it's simpler to just use
> ALIGN() anyway, which avoids the division.
>
> Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
> Acked-by: Randy Dunlap <randy.dunlap@oracle.com>
> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
>
> It seems that the code itself has not changed between 2.6.36 and 2.6.37-rc1
>
> static int elf_core_dump(struct coredump_params *cprm)
> {
> (...snipped...)
> loff_t offset = 0, dataoff, foffset;
> (...snipped...)
> dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
>
> but the definition of roundup() has changed by
>
> commit b28efd54d9d5c8005a29cd8782335beb9daaa32d
> Author: Eric Paris <eparis@redhat.com>
> Date: Wed Oct 13 17:50:08 2010 -0400
>
> kernel: roundup should only reference arguments once
>
> Currently the roundup macro references it's arguments more than one time.
> This patch changes it so it will only use its arguments once.
>
> Suggested-by: Andrew Morton <akpm@linux-foundation.org>
> Signed-off-by: Eric Paris <eparis@redhat.com>
> Signed-off-by: James Morris <jmorris@namei.org>
>
> between 2.6.36 and 2.6.37-rc1.
Interesting, is this a result of the compiler previously being able to
optimize the division since it could tell it was a power of 2 and now
that we have a private variable it can't? The patch can easily be
reverted without breaking anyone else....
-Eric
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [2.6.37-rc1] Build failure: __divdi3
2010-11-05 16:55 ` Eric Paris
@ 2010-11-05 17:08 ` Tetsuo Handa
2010-11-05 17:16 ` Tetsuo Handa
0 siblings, 1 reply; 10+ messages in thread
From: Tetsuo Handa @ 2010-11-05 17:08 UTC (permalink / raw)
To: eparis; +Cc: rdunlap, akpm, jmorris, linux-fsdevel
Eric Paris wrote:
> Interesting, is this a result of the compiler previously being able to
> optimize the division since it could tell it was a power of 2 and now
> that we have a private variable it can't? The patch can easily be
> reverted without breaking anyone else....
It seems that GCC 3.x can optimize
roundup((long long), (const))
but cannot optimize
#define roundup(x, y) ( \
{ \
typeof(y) __y = y; \
(((x) + (__y - 1)) / __y) * __y; \
} \
)
when y is a constant value.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [2.6.37-rc1] Build failure: __divdi3
2010-11-05 17:08 ` Tetsuo Handa
@ 2010-11-05 17:16 ` Tetsuo Handa
2010-11-05 17:41 ` Eric Paris
0 siblings, 1 reply; 10+ messages in thread
From: Tetsuo Handa @ 2010-11-05 17:16 UTC (permalink / raw)
To: eparis; +Cc: rdunlap, akpm, jmorris, linux-fsdevel
Tetsuo Handa wrote:
> Eric Paris wrote:
> > Interesting, is this a result of the compiler previously being able to
> > optimize the division since it could tell it was a power of 2 and now
> > that we have a private variable it can't? The patch can easily be
> > reverted without breaking anyone else....
>
I meant to say that it seems that GCC 3.x can optimize
#define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
for roundup((long long), (const)) case but cannot optimize
#define roundup(x, y) ( \
{ \
typeof(y) __y = y; \
(((x) + (__y - 1)) / __y) * __y; \
} \
)
for roundup((long long), (const)) case.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [2.6.37-rc1] Build failure: __divdi3
2010-11-05 17:16 ` Tetsuo Handa
@ 2010-11-05 17:41 ` Eric Paris
2010-11-05 17:53 ` Andrew Morton
0 siblings, 1 reply; 10+ messages in thread
From: Eric Paris @ 2010-11-05 17:41 UTC (permalink / raw)
To: Tetsuo Handa; +Cc: rdunlap, akpm, jmorris, linux-fsdevel
On Sat, 2010-11-06 at 02:16 +0900, Tetsuo Handa wrote:
> Tetsuo Handa wrote:
> > Eric Paris wrote:
> > > Interesting, is this a result of the compiler previously being able to
> > > optimize the division since it could tell it was a power of 2 and now
> > > that we have a private variable it can't? The patch can easily be
> > > reverted without breaking anyone else....
> >
> I meant to say that it seems that GCC 3.x can optimize
>
> #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
>
> for roundup((long long), (const)) case but cannot optimize
>
> #define roundup(x, y) ( \
> { \
> typeof(y) __y = y; \
> (((x) + (__y - 1)) / __y) * __y; \
> } \
> )
>
> for roundup((long long), (const)) case.
I guess this is my fault (I'm not completely convinced) since my testing
was done with gcc 4. I just retested to make sure that
gcc-4.5.1-4.fc14.x86_64 is able to optimize both (and it does). Is the
fact that it requires compiler optimizations for the code to build a
good thing?
-Eric
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [2.6.37-rc1] Build failure: __divdi3
2010-11-05 17:41 ` Eric Paris
@ 2010-11-05 17:53 ` Andrew Morton
2010-11-05 18:36 ` Tetsuo Handa
0 siblings, 1 reply; 10+ messages in thread
From: Andrew Morton @ 2010-11-05 17:53 UTC (permalink / raw)
To: Eric Paris; +Cc: Tetsuo Handa, rdunlap, jmorris, linux-fsdevel
On Fri, 05 Nov 2010 13:41:45 -0400
Eric Paris <eparis@redhat.com> wrote:
> On Sat, 2010-11-06 at 02:16 +0900, Tetsuo Handa wrote:
> > Tetsuo Handa wrote:
> > > Eric Paris wrote:
> > > > Interesting, is this a result of the compiler previously being able to
> > > > optimize the division since it could tell it was a power of 2 and now
> > > > that we have a private variable it can't? The patch can easily be
> > > > reverted without breaking anyone else....
> > >
> > I meant to say that it seems that GCC 3.x can optimize
> >
> > #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
> >
> > for roundup((long long), (const)) case but cannot optimize
> >
> > #define roundup(x, y) ( \
> > { \
> > typeof(y) __y = y; \
> > (((x) + (__y - 1)) / __y) * __y; \
> > } \
> > )
> >
> > for roundup((long long), (const)) case.
>
> I guess this is my fault (I'm not completely convinced) since my testing
> was done with gcc 4. I just retested to make sure that
> gcc-4.5.1-4.fc14.x86_64 is able to optimize both (and it does). Is the
> fact that it requires compiler optimizations for the code to build a
> good thing?
It does make us pretty fragile against future compiler versions, but we
do rely quite a lot on such compiler things. And things do break, such
as the several-month outbreak of calls to
you_cannot_kmalloc_that_much() a while back.
I wonder if there's some way of tricking gcc back into doing the right
thing here. Make __y const or something?
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [2.6.37-rc1] Build failure: __divdi3
2010-11-05 17:53 ` Andrew Morton
@ 2010-11-05 18:36 ` Tetsuo Handa
2010-11-09 0:13 ` Andrew Morton
0 siblings, 1 reply; 10+ messages in thread
From: Tetsuo Handa @ 2010-11-05 18:36 UTC (permalink / raw)
To: akpm, eparis; +Cc: rdunlap, jmorris, linux-fsdevel
Andrew Morton wrote:
> > > #define roundup(x, y) ( \
> > > { \
> > > typeof(y) __y = y; \
> > > (((x) + (__y - 1)) / __y) * __y; \
> > > } \
> > > )
> > >
> > > for roundup((long long), (const)) case.
> >
> > I guess this is my fault (I'm not completely convinced) since my testing
> > was done with gcc 4. I just retested to make sure that
> > gcc-4.5.1-4.fc14.x86_64 is able to optimize both (and it does). Is the
> > fact that it requires compiler optimizations for the code to build a
> > good thing?
>
> It does make us pretty fragile against future compiler versions, but we
> do rely quite a lot on such compiler things. And things do break, such
> as the several-month outbreak of calls to
> you_cannot_kmalloc_that_much() a while back.
>
> I wonder if there's some way of tricking gcc back into doing the right
> thing here. Make __y const or something?
Nice suggestion.
-typeof(y) __y = y;
+const typeof(y) __y = y;
solved __divdi3 problem with GCC 3.3.5.
Regards.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [2.6.37-rc1] Build failure: __divdi3
2010-11-05 18:36 ` Tetsuo Handa
@ 2010-11-09 0:13 ` Andrew Morton
0 siblings, 0 replies; 10+ messages in thread
From: Andrew Morton @ 2010-11-09 0:13 UTC (permalink / raw)
To: Tetsuo Handa; +Cc: eparis, rdunlap, jmorris, linux-fsdevel
On Sat, 6 Nov 2010 03:36:27 +0900
Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> wrote:
> Andrew Morton wrote:
> > > > #define roundup(x, y) ( \
> > > > { \
> > > > typeof(y) __y = y; \
> > > > (((x) + (__y - 1)) / __y) * __y; \
> > > > } \
> > > > )
> > > >
> > > > for roundup((long long), (const)) case.
> > >
> > > I guess this is my fault (I'm not completely convinced) since my testing
> > > was done with gcc 4. I just retested to make sure that
> > > gcc-4.5.1-4.fc14.x86_64 is able to optimize both (and it does). Is the
> > > fact that it requires compiler optimizations for the code to build a
> > > good thing?
> >
> > It does make us pretty fragile against future compiler versions, but we
> > do rely quite a lot on such compiler things. And things do break, such
> > as the several-month outbreak of calls to
> > you_cannot_kmalloc_that_much() a while back.
> >
> > I wonder if there's some way of tricking gcc back into doing the right
> > thing here. Make __y const or something?
>
> Nice suggestion.
>
> -typeof(y) __y = y;
> +const typeof(y) __y = y;
>
> solved __divdi3 problem with GCC 3.3.5.
>
OK, thanks. Pending any better ideas, I typed this in:
From: Andrew Morton <akpm@linux-foundation.org>
gcc-3.3.5 (at least) is failing to optimise away the divide when `y' is a
constant 64-bit power-of-two value - it emits a call to __divdi3().
It turns out that defining `y' as const prevents this.
Reported-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Tested-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Cc: Randy Dunlap <randy.dunlap@oracle.com>
Cc: Eric Paris <eparis@redhat.com>
Cc: James Morris <jmorris@namei.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
include/linux/kernel.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff -puN include/linux/kernel.h~include-linux-kernelh-roundup-work-around-a-gcc-33-miscompile include/linux/kernel.h
--- a/include/linux/kernel.h~include-linux-kernelh-roundup-work-around-a-gcc-33-miscompile
+++ a/include/linux/kernel.h
@@ -58,9 +58,11 @@ extern const char linux_proc_banner[];
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
+
+/* The `const' in roundup() prevents gcc-3.3 from calling __divdi3 */
#define roundup(x, y) ( \
{ \
- typeof(y) __y = y; \
+ const typeof(y) __y = y; \
(((x) + (__y - 1)) / __y) * __y; \
} \
)
_
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2010-11-09 0:14 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-05 8:59 [2.6.37-rc1] Build failure: __divdi3 Tetsuo Handa
2010-11-05 16:09 ` Randy Dunlap
2010-11-05 16:48 ` Tetsuo Handa
2010-11-05 16:55 ` Eric Paris
2010-11-05 17:08 ` Tetsuo Handa
2010-11-05 17:16 ` Tetsuo Handa
2010-11-05 17:41 ` Eric Paris
2010-11-05 17:53 ` Andrew Morton
2010-11-05 18:36 ` Tetsuo Handa
2010-11-09 0:13 ` Andrew Morton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).