Subject: Re: 64K PAGE_SIZE and arch/powerpc/kernel/vdso.c

From: Benjamin Herrenschmidt <[email-masked]>
Date: Mon, 18 Oct 2010 21:03:36 +1100

On Mon, 2010-10-18 at 10:44 +1100, Michael Neuling wrote:
> > Greetings Linux-ppc64 folks,
> > 
> > While trying to compile v2.6.36-rc8 with PAGE_SIZE=65536 I run into the
> > following compile failure w/ strict checking on a RHEL5.4 / gcc (GCC)
> > 4.1.2 20080704 (Red Hat 4.1.2-46) system:
> > 
> > cc1: warnings being treated as errors
> > arch/powerpc/kernel/vdso.c:81: warning: alignment of ‘vdso_data_store’
> > is greater than maximum object file alignment.  Using 32768
> >   CC      arch/powerpc/sysdev/msi_bitmap.o
> > make[1]: *** [arch/powerpc/kernel/vdso.o] Error 1
> > make[1]: *** Waiting for unfinished jobs....
> > 
> > Any ideas folks..?
> 
> It seems this broke it:

Yes, this is a known (old) issue. You can apply the workaround locally
if you really want to build with that old toolchain, but the risk is
that if an object whose size is not a multiple of PAGE_SIZE is put in
the .data.page_aligned section, your vdso data page might end up not
being aligned properly. Fortunately that doesn't generally happen but
it's worth double checking your System.map...

This is the reason I decided to leave it alone in the kernel and
encourage people to update their toolchain (and binutils).

Cheers,
Ben.

> commit abe1ee3a221d53778c3e58747bbec6e518e5471b
> Author: Tim Abbott <[email-masked]>
> Date:   Sun Sep 20 18:14:15 2009 -0400
> 
>     Use macros for .data.page_aligned section.
>     
>     This patch changes the remaining direct references to
>     .data.page_aligned in C and assembly code to use the macros in
>     include/linux/linkage.h.
> 
> Backing out just that part of the change (see below) fixes it.
> 
> FYI the error only occurs on gcc 4.1 and 4.2.  4.3 and greater is fine.  
> 
> Mikey
> 
> diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c
> index 13002fe..c140fce 100644
> --- a/arch/powerpc/kernel/vdso.c
> +++ b/arch/powerpc/kernel/vdso.c
> @@ -78,7 +78,7 @@ static int vdso_ready;
>  static union {
>  	struct vdso_data	data;
>  	u8			page[PAGE_SIZE];
> -} vdso_data_store __page_aligned_data;
> +} vdso_data_store __attribute__((__section__(".data.page_aligned")));
>  struct vdso_data *vdso_data = &vdso_data_store.data;
>  
>  /* Format of the patch table */
> _______________________________________________
> Linuxppc-dev mailing list
> [email-masked]
> https://lists.ozlabs.org/listinfo/linuxppc-dev