Re: Build failures with gcc 4.5 and older

From: Andrew Morton
Date: Tue Aug 14 2018 - 19:02:13 EST


On Tue, 14 Aug 2018 15:15:59 -0700 Guenter Roeck <linux@xxxxxxxxxxxx> wrote:

> > Confused. Why does it think that the mm_struct is "otherwise empty"?
> >
>
> The problem isn't really that the structure is otherwise empty.
> Some digging reveals that the error message is wrong; gcc should
> instead complain about having no _named_ structure element before
> the flexible array member.
>
> > This shuts it up:
> >
> > --- a/include/linux/mm_types.h~a
> > +++ a/include/linux/mm_types.h
> > @@ -490,6 +490,7 @@ struct mm_struct {
> > #endif
> > } __randomize_layout;
> >
> > + int wibble;
> > /*
> > * The mm_cpumask needs to be at the end of mm_struct, because it
> > * is dynamically sized based on nr_cpu_ids.
> >
>
> Unfortunately, that only triggers secondary errors.
> Seen with both gcc 4.4 and 4.5.
>
> mm/init-mm.c:29: error: unknown field âmm_rbâ specified in initializer
> mm/init-mm.c:29: warning: missing braces around initializer
> mm/init-mm.c:29: warning: (near initialization for âinit_mm.<anonymous>â)
> mm/init-mm.c:29: error: incompatible types when initializing type âstruct
> vm_area_struct *â using type âstruct rb_rootâ
> mm/init-mm.c:30: error: unknown field âpgdâ specified in initializer
>
> and many more similar errors.

This works, I think.

The m68k build still fails because 0cc3cd21657 ("cpu/hotplug: Boot HT
siblings at least once") was evidently never tested on CONFIG_SMP=n.
How could that come about - the patch is six weeks old??

kernel/cpu.c: In function 'boot_cpu_hotplug_init':
kernel/cpu.c:2275:2: error: 'struct cpuhp_cpu_state' has no member named 'booted_once'


--- a/include/linux/mm_types.h~a
+++ a/include/linux/mm_types.h
@@ -490,6 +490,8 @@ struct mm_struct {
#endif
} __randomize_layout;

+ int wibble;
+
/*
* The mm_cpumask needs to be at the end of mm_struct, because it
* is dynamically sized based on nr_cpu_ids.
--- a/mm/init-mm.c~a
+++ a/mm/init-mm.c
@@ -26,15 +26,17 @@
* and size this cpu_bitmask to NR_CPUS.
*/
struct mm_struct init_mm = {
- .mm_rb = RB_ROOT,
- .pgd = swapper_pg_dir,
- .mm_users = ATOMIC_INIT(2),
- .mm_count = ATOMIC_INIT(1),
- .mmap_sem = __RWSEM_INITIALIZER(init_mm.mmap_sem),
- .page_table_lock = __SPIN_LOCK_UNLOCKED(init_mm.page_table_lock),
- .arg_lock = __SPIN_LOCK_UNLOCKED(init_mm.arg_lock),
- .mmlist = LIST_HEAD_INIT(init_mm.mmlist),
- .user_ns = &init_user_ns,
+ {
+ .mm_rb = RB_ROOT,
+ .pgd = swapper_pg_dir,
+ .mm_users = ATOMIC_INIT(2),
+ .mm_count = ATOMIC_INIT(1),
+ .mmap_sem = __RWSEM_INITIALIZER(init_mm.mmap_sem),
+ .page_table_lock = __SPIN_LOCK_UNLOCKED(init_mm.page_table_lock),
+ .arg_lock = __SPIN_LOCK_UNLOCKED(init_mm.arg_lock),
+ .mmlist = LIST_HEAD_INIT(init_mm.mmlist),
+ .user_ns = &init_user_ns,
+ },
.cpu_bitmap = { [BITS_TO_LONGS(NR_CPUS)] = 0},
INIT_MM_CONTEXT(init_mm)
};
_