2008-02-07 23:12:51

by Adrian Bunk

[permalink] [raw]
Subject: sparc compile error

Commit 3062fc67dad01b1d2a15d58c709eff946389eca4 broke sparc:

<-- snip -->

...
CC init/do_mounts.o
In file included from include/linux/mm.h:39,
from include/linux/memcontrol.h:24,
from include/linux/swap.h:8,
from include/linux/suspend.h:7,
from init/do_mounts.c:6:
include/asm/pgtable.h:344: warning: parameter names (without types) in function declaration
include/asm/pgtable.h:345: warning: parameter names (without types) in function declaration
include/asm/pgtable.h:346: error: expected '=', ',', ';', 'asm' or '__attribute__' before '___f___swp_entry'
make[1]: *** [init/do_mounts.o] Error 1

<-- snip -->

cu
Adrian

--

"Is there not promise of rain?" Ling Tan asked suddenly out
of the darkness. There had been need of rain for many days.
"Only a promise," Lao Er said.
Pearl S. Buck - Dragon Seed


2008-02-07 23:40:30

by David Rientjes

[permalink] [raw]
Subject: Re: sparc compile error

3062fc67 introduced far too many build errors for the convenience it
allows. It's not even always necessary to rcu deference mm->mem_cgroup in
the first place, so we'll use it on a case by case basis.

Signed-off-by: David Rientjes <[email protected]>
---
include/linux/memcontrol.h | 13 -------------
mm/memcontrol.c | 2 +-
mm/rmap.c | 6 ++++--
3 files changed, 5 insertions(+), 16 deletions(-)

diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -20,9 +20,6 @@
#ifndef _LINUX_MEMCONTROL_H
#define _LINUX_MEMCONTROL_H

-#include <linux/rcupdate.h>
-#include <linux/mm.h>
-
struct mem_cgroup;
struct page_cgroup;
struct page;
@@ -51,11 +48,6 @@ extern int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm,
gfp_t gfp_mask);
int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem);

-static inline struct mem_cgroup *mm_cgroup(const struct mm_struct *mm)
-{
- return rcu_dereference(mm->mem_cgroup);
-}
-
extern int mem_cgroup_prepare_migration(struct page *page);
extern void mem_cgroup_end_migration(struct page *page);
extern void mem_cgroup_page_migration(struct page *page, struct page *newpage);
@@ -123,11 +115,6 @@ static inline int mem_cgroup_cache_charge(struct page *page,
return 0;
}

-static inline struct mem_cgroup *mm_cgroup(const struct mm_struct *mm)
-{
- return NULL;
-}
-
static inline int task_in_mem_cgroup(struct task_struct *task,
const struct mem_cgroup *mem)
{
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -399,7 +399,7 @@ int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem)
int ret;

task_lock(task);
- ret = task->mm && mm_cgroup(task->mm) == mem;
+ ret = task->mm && rcu_dereference(task->mm->mem_cgroup) == mem;
task_unlock(task);
return ret;
}
diff --git a/mm/rmap.c b/mm/rmap.c
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -321,7 +321,8 @@ static int page_referenced_anon(struct page *page,
* counting on behalf of references from different
* cgroups
*/
- if (mem_cont && (mm_cgroup(vma->vm_mm) != mem_cont))
+ if (mem_cont && mem_cont !=
+ rcu_dereference(vma->vm_mm->mem_cgroup))
continue;
referenced += page_referenced_one(page, vma, &mapcount);
if (!mapcount)
@@ -382,7 +383,8 @@ static int page_referenced_file(struct page *page,
* counting on behalf of references from different
* cgroups
*/
- if (mem_cont && (mm_cgroup(vma->vm_mm) != mem_cont))
+ if (mem_cont && mem_cont !=
+ rcu_dereference(vma->vm_mm->mem_cgroup))
continue;
if ((vma->vm_flags & (VM_LOCKED|VM_MAYSHARE))
== (VM_LOCKED|VM_MAYSHARE)) {

2008-02-10 15:39:58

by Martin Habets

[permalink] [raw]
Subject: Re: sparc compile error

This still gives build errors with CGROUP_MEM_CONT off.
Some ifdef-ing will fix that.

Martin

Signed-off-by: Martin Habets <[email protected]>

Index: sparc-2.6.git/mm/rmap.c
===================================================================
--- sparc-2.6.git.orig/mm/rmap.c 2008-02-10 13:01:37.000000000 +0000
+++ sparc-2.6.git/mm/rmap.c 2008-02-10 14:16:34.000000000 +0000
@@ -321,8 +321,11 @@
* counting on behalf of references from different
* cgroups
*/
- if (mem_cont && (mm_cgroup(vma->vm_mm) != mem_cont))
+#ifdef CONFIG_CGROUP_MEM_CONT
+ if (mem_cont && mem_cont !=
+ rcu_dereference(vma->vm_mm->mem_cgroup))
continue;
+#endif
referenced += page_referenced_one(page, vma, &mapcount);
if (!mapcount)
break;
@@ -382,8 +385,11 @@
* counting on behalf of references from different
* cgroups
*/
- if (mem_cont && (mm_cgroup(vma->vm_mm) != mem_cont))
+#ifdef CONFIG_CGROUP_MEM_CONT
+ if (mem_cont && mem_cont !=
+ rcu_dereference(vma->vm_mm->mem_cgroup))
continue;
+#endif
if ((vma->vm_flags & (VM_LOCKED|VM_MAYSHARE))
== (VM_LOCKED|VM_MAYSHARE)) {
referenced++;

2008-02-10 19:20:22

by David Rientjes

[permalink] [raw]
Subject: Re: sparc compile error

On Sun, 10 Feb 2008, Martin Habets wrote:

> This still gives build errors with CGROUP_MEM_CONT off.
> Some ifdef-ing will fix that.
>

Please try Linus' latest git that includes 60c12b12 (from yesterday) that
fixes this issue.

David

2008-02-10 22:00:10

by Robert Reif

[permalink] [raw]
Subject: Re: sparc compile error

David Rientjes wrote:

>Please try Linus' latest git that includes 60c12b12 (from yesterday) that
>fixes this issue.
>
>
>
I get this with latest git:

CC init/do_mounts.o
In file included from include/linux/mm.h:39,
from include/linux/memcontrol.h:24,
from include/linux/swap.h:8,
from include/linux/suspend.h:7,
from init/do_mounts.c:6:
include/asm/pgtable.h:344: warning: parameter names (without types) in
function declaration
include/asm/pgtable.h:345: warning: parameter names (without types) in
function declaration
include/asm/pgtable.h:346: error: expected '=', ',', ';', 'asm' or
'__attribute__' before '___f___swp_entry'
make[1]: *** [init/do_mounts.o] Error 1

2008-02-10 23:32:17

by David Rientjes

[permalink] [raw]
Subject: [patch] sparc: fix build

Fix build failures on sparc:

In file included from include/linux/mm.h:39,
from include/linux/memcontrol.h:24,
from include/linux/swap.h:8,
from include/linux/suspend.h:7,
from init/do_mounts.c:6:
include/asm/pgtable.h:344: warning: parameter names (without
types) in function declaration
include/asm/pgtable.h:345: warning: parameter names (without
types) in function declaration
include/asm/pgtable.h:346: error: expected '=', ',', ';', 'asm' or
'__attribute__' before '___f___swp_entry'

and

arch/sparc/kernel/led.c: In function 'led_blink':
arch/sparc/kernel/led.c:35: error: invalid use of undefined type
'struct timer_list'
arch/sparc/kernel/led.c:35: error: 'jiffies' undeclared (first use
in this function)
arch/sparc/kernel/led.c:35: error: (Each undeclared identifier is
reported only once
arch/sparc/kernel/led.c:35: error: for each function it appears
in.)
arch/sparc/kernel/led.c:36: error: 'avenrun' undeclared (first use
in this function)
arch/sparc/kernel/led.c:36: error: 'FSHIFT' undeclared (first use
in this function)
arch/sparc/kernel/led.c:36: error: 'HZ' undeclared (first use in
this function)
arch/sparc/kernel/led.c:37: error: invalid use of undefined type
'struct timer_list'
arch/sparc/kernel/led.c:39: error: invalid use of undefined type
'struct timer_list'
arch/sparc/kernel/led.c:40: error: invalid use of undefined type
'struct timer_list'
arch/sparc/kernel/led.c:42: error: implicit declaration of
function 'add_timer'
arch/sparc/kernel/led.c: In function 'led_write_proc':
arch/sparc/kernel/led.c:70: error: implicit declaration of
function 'copy_from_user'
arch/sparc/kernel/led.c:84: error: implicit declaration of
function 'del_timer_sync'
arch/sparc/kernel/led.c: In function 'led_init':
arch/sparc/kernel/led.c:109: error: implicit declaration of
function 'init_timer'
arch/sparc/kernel/led.c:110: error: invalid use of undefined type
'struct timer_list'

Cc: Adrian Bunk <[email protected]>
Cc: Robert Reif <[email protected]>
Signed-off-by: David Rientjes <[email protected]>
---
arch/sparc/kernel/led.c | 3 ++-
include/linux/memcontrol.h | 3 ---
2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/arch/sparc/kernel/led.c b/arch/sparc/kernel/led.c
--- a/arch/sparc/kernel/led.c
+++ b/arch/sparc/kernel/led.c
@@ -1,8 +1,9 @@
-#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/string.h>
+#include <linux/sched.h>
+#include <linux/uaccess.h>

#include <asm/auxio.h>

diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -20,9 +20,6 @@
#ifndef _LINUX_MEMCONTROL_H
#define _LINUX_MEMCONTROL_H

-#include <linux/rcupdate.h>
-#include <linux/mm.h>
-
struct mem_cgroup;
struct page_cgroup;
struct page;

2008-02-11 09:39:44

by Balbir Singh

[permalink] [raw]
Subject: Re: [patch] sparc: fix build

David Rientjes wrote:
> Fix build failures on sparc:
>
> In file included from include/linux/mm.h:39,
> from include/linux/memcontrol.h:24,
> from include/linux/swap.h:8,
> from include/linux/suspend.h:7,
> from init/do_mounts.c:6:
> include/asm/pgtable.h:344: warning: parameter names (without
> types) in function declaration
> include/asm/pgtable.h:345: warning: parameter names (without
> types) in function declaration
> include/asm/pgtable.h:346: error: expected '=', ',', ';', 'asm' or
> '__attribute__' before '___f___swp_entry'
>
> and
>
> arch/sparc/kernel/led.c: In function 'led_blink':
> arch/sparc/kernel/led.c:35: error: invalid use of undefined type
> 'struct timer_list'
> arch/sparc/kernel/led.c:35: error: 'jiffies' undeclared (first use
> in this function)
> arch/sparc/kernel/led.c:35: error: (Each undeclared identifier is
> reported only once
> arch/sparc/kernel/led.c:35: error: for each function it appears
> in.)
> arch/sparc/kernel/led.c:36: error: 'avenrun' undeclared (first use
> in this function)
> arch/sparc/kernel/led.c:36: error: 'FSHIFT' undeclared (first use
> in this function)
> arch/sparc/kernel/led.c:36: error: 'HZ' undeclared (first use in
> this function)
> arch/sparc/kernel/led.c:37: error: invalid use of undefined type
> 'struct timer_list'
> arch/sparc/kernel/led.c:39: error: invalid use of undefined type
> 'struct timer_list'
> arch/sparc/kernel/led.c:40: error: invalid use of undefined type
> 'struct timer_list'
> arch/sparc/kernel/led.c:42: error: implicit declaration of
> function 'add_timer'
> arch/sparc/kernel/led.c: In function 'led_write_proc':
> arch/sparc/kernel/led.c:70: error: implicit declaration of
> function 'copy_from_user'
> arch/sparc/kernel/led.c:84: error: implicit declaration of
> function 'del_timer_sync'
> arch/sparc/kernel/led.c: In function 'led_init':
> arch/sparc/kernel/led.c:109: error: implicit declaration of
> function 'init_timer'
> arch/sparc/kernel/led.c:110: error: invalid use of undefined type
> 'struct timer_list'
>
> Cc: Adrian Bunk <[email protected]>
> Cc: Robert Reif <[email protected]>
> Signed-off-by: David Rientjes <[email protected]>
> ---
> arch/sparc/kernel/led.c | 3 ++-
> include/linux/memcontrol.h | 3 ---
> 2 files changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/arch/sparc/kernel/led.c b/arch/sparc/kernel/led.c
> --- a/arch/sparc/kernel/led.c
> +++ b/arch/sparc/kernel/led.c
> @@ -1,8 +1,9 @@
> -#include <linux/kernel.h>
> #include <linux/module.h>
> #include <linux/init.h>
> #include <linux/proc_fs.h>
> #include <linux/string.h>
> +#include <linux/sched.h>
> +#include <linux/uaccess.h>
>
> #include <asm/auxio.h>
>
> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> --- a/include/linux/memcontrol.h
> +++ b/include/linux/memcontrol.h
> @@ -20,9 +20,6 @@
> #ifndef _LINUX_MEMCONTROL_H
> #define _LINUX_MEMCONTROL_H
>
> -#include <linux/rcupdate.h>
> -#include <linux/mm.h>
> -
> struct mem_cgroup;
> struct page_cgroup;
> struct page;

This patch allowed my sparc cross compiler to build beyond mm/memcontrol.o, but
I faced a build issue at

drivers/net/e1000e/netdev.c: In function 'e1000e_update_stats':
drivers/net/e1000e/netdev.c:2583: error: unable to find a register to spill in
class 'FP_REGS'
drivers/net/e1000e/netdev.c:2583: error: this is the insn:
(insn 66 2379 2236 2 drivers/net/e1000e/netdev.c:2459 (set (reg:DI 487 [ D.34076 ])
(mem/s/j:DI (plus:SI (reg/v/f:SI 11 %o3 [orig:492 adapter ] [492])
(reg:SI 7 %g7 [514])) [0 <variable>.stats.gprc+0 S8 A128])) 45
{*movdi_insn_sp32} (insn_list:REG_DEP_TRUE 65 (insn_list:REG_DEP_ANTI 32 (nil)))
(expr_list:REG_EQUIV (mem/s/j:DI (plus:SI (reg/v/f:SI 11 %o3 [orig:492
adapter ] [492])
(reg:SI 7 %g7 [514])) [0 <variable>.stats.gprc+0 S8 A128])
(nil)))
drivers/net/e1000e/netdev.c:2583: confused by earlier errors, bailing out
make[3]: *** [drivers/net/e1000e/netdev.o] Error 1
make[2]: *** [drivers/net/e1000e] Error 2
make[1]: *** [drivers/net] Error 2

So for the problem reported

Tested-by: Balbir Singh <[email protected]>

--
Warm Regards,
Balbir Singh
Linux Technology Center
IBM, ISTL

2008-02-13 02:48:46

by Andrew Morton

[permalink] [raw]
Subject: Re: [patch] sparc: fix build

On Sun, 10 Feb 2008 15:30:51 -0800 (PST) David Rientjes <[email protected]> wrote:

> Fix build failures on sparc:
>
> In file included from include/linux/mm.h:39,
> from include/linux/memcontrol.h:24,
> from include/linux/swap.h:8,
> from include/linux/suspend.h:7,
> from init/do_mounts.c:6:
> include/asm/pgtable.h:344: warning: parameter names (without
> types) in function declaration
> include/asm/pgtable.h:345: warning: parameter names (without
> types) in function declaration
> include/asm/pgtable.h:346: error: expected '=', ',', ';', 'asm' or
> '__attribute__' before '___f___swp_entry'
>
> and
>
> arch/sparc/kernel/led.c: In function 'led_blink':
> arch/sparc/kernel/led.c:35: error: invalid use of undefined type
> 'struct timer_list'
> arch/sparc/kernel/led.c:35: error: 'jiffies' undeclared (first use
> in this function)
> arch/sparc/kernel/led.c:35: error: (Each undeclared identifier is
> reported only once
> arch/sparc/kernel/led.c:35: error: for each function it appears
> in.)
> arch/sparc/kernel/led.c:36: error: 'avenrun' undeclared (first use
> in this function)
> arch/sparc/kernel/led.c:36: error: 'FSHIFT' undeclared (first use
> in this function)
> arch/sparc/kernel/led.c:36: error: 'HZ' undeclared (first use in
> this function)
> arch/sparc/kernel/led.c:37: error: invalid use of undefined type
> 'struct timer_list'
> arch/sparc/kernel/led.c:39: error: invalid use of undefined type
> 'struct timer_list'
> arch/sparc/kernel/led.c:40: error: invalid use of undefined type
> 'struct timer_list'
> arch/sparc/kernel/led.c:42: error: implicit declaration of
> function 'add_timer'
> arch/sparc/kernel/led.c: In function 'led_write_proc':
> arch/sparc/kernel/led.c:70: error: implicit declaration of
> function 'copy_from_user'
> arch/sparc/kernel/led.c:84: error: implicit declaration of
> function 'del_timer_sync'
> arch/sparc/kernel/led.c: In function 'led_init':
> arch/sparc/kernel/led.c:109: error: implicit declaration of
> function 'init_timer'
> arch/sparc/kernel/led.c:110: error: invalid use of undefined type
> 'struct timer_list'
>
> ...
>
> diff --git a/arch/sparc/kernel/led.c b/arch/sparc/kernel/led.c
> --- a/arch/sparc/kernel/led.c
> +++ b/arch/sparc/kernel/led.c
> @@ -1,8 +1,9 @@
> -#include <linux/kernel.h>
> #include <linux/module.h>
> #include <linux/init.h>
> #include <linux/proc_fs.h>
> #include <linux/string.h>
> +#include <linux/sched.h>
> +#include <linux/uaccess.h>
>
> #include <asm/auxio.h>

OK, that'll fix one error.

> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> --- a/include/linux/memcontrol.h
> +++ b/include/linux/memcontrol.h
> @@ -20,9 +20,6 @@
> #ifndef _LINUX_MEMCONTROL_H
> #define _LINUX_MEMCONTROL_H
>
> -#include <linux/rcupdate.h>
> -#include <linux/mm.h>
> -
> struct mem_cgroup;
> struct page_cgroup;
> struct page;

This really should have been in a separate patch and extensively tested.

Have we checked that every file which directly or indirectly includes
memcontrol.h does not have an requirement for rcupdate.h and mm.h, where
that requirement was satisfied only via this nested inclusion? For all
architectures and for all config selections? Think not.

Sadly, removal of nested includes is a *big* deal, and it takes quite a lot
of time to get it all shaken down.

If we can confirm that all files (.c and .h) which include memcontrol.h
also directly include rcupdate.h and mm.h then we're _probably_ ok (modulo
ordering issues).

Otherwise we should perhaps be taking a second look at how to fix the sparc
problem.

2008-02-13 02:57:56

by Al Viro

[permalink] [raw]
Subject: Re: [patch] sparc: fix build

On Tue, Feb 12, 2008 at 06:46:54PM -0800, Andrew Morton wrote:
> > diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> > --- a/include/linux/memcontrol.h
> > +++ b/include/linux/memcontrol.h
> > @@ -20,9 +20,6 @@
> > #ifndef _LINUX_MEMCONTROL_H
> > #define _LINUX_MEMCONTROL_H
> >
> > -#include <linux/rcupdate.h>
> > -#include <linux/mm.h>
> > -
> > struct mem_cgroup;
> > struct page_cgroup;
> > struct page;
>
> This really should have been in a separate patch and extensively tested.
>
> Have we checked that every file which directly or indirectly includes
> memcontrol.h does not have an requirement for rcupdate.h and mm.h, where
> that requirement was satisfied only via this nested inclusion? For all
> architectures and for all config selections? Think not.
>
> Sadly, removal of nested includes is a *big* deal, and it takes quite a lot
> of time to get it all shaken down.
>
> If we can confirm that all files (.c and .h) which include memcontrol.h
> also directly include rcupdate.h and mm.h then we're _probably_ ok (modulo
> ordering issues).
>
> Otherwise we should perhaps be taking a second look at how to fix the sparc
> problem.

I've run allmodconfig builds on a bunch of target, FWIW (essentially the
same patch). Note that these includes are recent addition caused by
added inline function that had since then become a define. So while I
agree with your comments in general, in _this_ case it's pretty safe.

Commit that had done it is 3062fc67dad01b1d2a15d58c709eff946389eca4
and switch to #define is 60c12b1202a60eabb1c61317e5d2678fcea9893f (BTW,
that warranted mentioning in changelog of the latter).

2008-02-13 03:10:21

by Andrew Morton

[permalink] [raw]
Subject: Re: [patch] sparc: fix build

On Wed, 13 Feb 2008 02:57:39 +0000 Al Viro <[email protected]> wrote:

> On Tue, Feb 12, 2008 at 06:46:54PM -0800, Andrew Morton wrote:
> > > diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> > > --- a/include/linux/memcontrol.h
> > > +++ b/include/linux/memcontrol.h
> > > @@ -20,9 +20,6 @@
> > > #ifndef _LINUX_MEMCONTROL_H
> > > #define _LINUX_MEMCONTROL_H
> > >
> > > -#include <linux/rcupdate.h>
> > > -#include <linux/mm.h>
> > > -
> > > struct mem_cgroup;
> > > struct page_cgroup;
> > > struct page;
> >
> > This really should have been in a separate patch and extensively tested.
> >
> > Have we checked that every file which directly or indirectly includes
> > memcontrol.h does not have an requirement for rcupdate.h and mm.h, where
> > that requirement was satisfied only via this nested inclusion? For all
> > architectures and for all config selections? Think not.
> >
> > Sadly, removal of nested includes is a *big* deal, and it takes quite a lot
> > of time to get it all shaken down.
> >
> > If we can confirm that all files (.c and .h) which include memcontrol.h
> > also directly include rcupdate.h and mm.h then we're _probably_ ok (modulo
> > ordering issues).
> >
> > Otherwise we should perhaps be taking a second look at how to fix the sparc
> > problem.
>
> I've run allmodconfig builds on a bunch of target, FWIW (essentially the
> same patch). Note that these includes are recent addition caused by
> added inline function that had since then become a define. So while I
> agree with your comments in general, in _this_ case it's pretty safe.

OK, thanks, that increases the comfort level,

> Commit that had done it is 3062fc67dad01b1d2a15d58c709eff946389eca4
> and switch to #define is 60c12b1202a60eabb1c61317e5d2678fcea9893f (BTW,
> that warranted mentioning in changelog of the latter).

I just copied-and-pasted your email ;)