frv cmpxchg_local compile error - Kernel

This is a discussion on frv cmpxchg_local compile error - Kernel ; Commit 14e0cb3c60b89c4a2512852ffc18601c72314a0f broke frv compilation: .... CC arch/frv/kernel/asm-offsets.s In file included from include/asm/system.h:271, from include/asm/bitops.h:19, from include/linux/bitops.h:17, from include/linux/kernel.h:15, from include/linux/sched.h:52, from arch/frv/kernel/asm-offsets.c:7: include/asm-generic/cmpxchg-local.h: In function '__cmpxchg_local_generic': include/asm-generic/cmpxchg-local.h:23: error: implicit declaration of function 'typecheck' include/asm-generic/cmpxchg-local.h:23: error: expected expression before 'unsigned' ...

+ Reply to Thread
Results 1 to 3 of 3

Thread: frv cmpxchg_local compile error

  1. frv cmpxchg_local compile error

    Commit 14e0cb3c60b89c4a2512852ffc18601c72314a0f broke frv compilation:

    <-- snip -->

    ....
    CC arch/frv/kernel/asm-offsets.s
    In file included from include/asm/system.h:271,
    from include/asm/bitops.h:19,
    from include/linux/bitops.h:17,
    from include/linux/kernel.h:15,
    from include/linux/sched.h:52,
    from arch/frv/kernel/asm-offsets.c:7:
    include/asm-generic/cmpxchg-local.h: In function '__cmpxchg_local_generic':
    include/asm-generic/cmpxchg-local.h:23: error: implicit declaration of function 'typecheck'
    include/asm-generic/cmpxchg-local.h:23: error: expected expression before 'unsigned'
    include/asm-generic/cmpxchg-local.h:23: error: expected expression before 'unsigned'
    include/asm-generic/cmpxchg-local.h:44: error: expected expression before 'unsigned'
    include/asm-generic/cmpxchg-local.h: In function '__cmpxchg64_local_generic':
    include/asm-generic/cmpxchg-local.h:57: error: expected expression before 'unsigned'
    include/asm-generic/cmpxchg-local.h:57: error: expected expression before 'unsigned'
    include/asm-generic/cmpxchg-local.h:61: error: expected expression before 'unsigned'
    In file included from include/asm/bitops.h:19,
    from include/linux/bitops.h:17,
    from include/linux/kernel.h:15,
    from include/linux/sched.h:52,
    from arch/frv/kernel/asm-offsets.c:7:
    include/asm/system.h: In function '__cmpxchg_local':
    include/asm/system.h:279: error: variable or field '__xg_orig' declared void
    include/asm/system.h:279: error: variable or field '__xg_test' declared void
    include/asm/system.h:279: error: variable or field '__xg_new' declared void
    include/asm/system.h:279: error: void value not ignored as it ought to be
    make[1]: *** [arch/frv/kernel/asm-offsets.s] Error 1

    <-- snip -->


    An architecture specific patch that breaks the one architecture it
    touches at the first file being compiled is even for kernel standards
    unusually bad...


    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

    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  2. Re: frv cmpxchg_local compile error

    * Adrian Bunk (bunk@kernel.org) wrote:
    > Commit 14e0cb3c60b89c4a2512852ffc18601c72314a0f broke frv compilation:
    >
    > <-- snip -->
    >
    > ...
    > CC arch/frv/kernel/asm-offsets.s
    > In file included from include/asm/system.h:271,
    > from include/asm/bitops.h:19,
    > from include/linux/bitops.h:17,
    > from include/linux/kernel.h:15,
    > from include/linux/sched.h:52,
    > from arch/frv/kernel/asm-offsets.c:7:
    > include/asm-generic/cmpxchg-local.h: In function '__cmpxchg_local_generic':
    > include/asm-generic/cmpxchg-local.h:23: error: implicit declaration of function 'typecheck'



    Isn't typecheck() supposed to be defined in kernel.h which is included
    _everywhere_ ?

    Hrm, I see, dependency from kernel.h on bitops.h on asm/bitops.h on
    asm/system.h.



    > include/asm-generic/cmpxchg-local.h:23: error: expected expression before 'unsigned'
    > include/asm-generic/cmpxchg-local.h:23: error: expected expression before 'unsigned'
    > include/asm-generic/cmpxchg-local.h:44: error: expected expression before 'unsigned'
    > include/asm-generic/cmpxchg-local.h: In function '__cmpxchg64_local_generic':
    > include/asm-generic/cmpxchg-local.h:57: error: expected expression before 'unsigned'
    > include/asm-generic/cmpxchg-local.h:57: error: expected expression before 'unsigned'
    > include/asm-generic/cmpxchg-local.h:61: error: expected expression before 'unsigned'
    > In file included from include/asm/bitops.h:19,
    > from include/linux/bitops.h:17,
    > from include/linux/kernel.h:15,
    > from include/linux/sched.h:52,
    > from arch/frv/kernel/asm-offsets.c:7:
    > include/asm/system.h: In function '__cmpxchg_local':
    > include/asm/system.h:279: error: variable or field '__xg_orig' declared void
    > include/asm/system.h:279: error: variable or field '__xg_test' declared void
    > include/asm/system.h:279: error: variable or field '__xg_new' declared void
    > include/asm/system.h:279: error: void value not ignored as it ought to be
    > make[1]: *** [arch/frv/kernel/asm-offsets.s] Error 1
    >
    > <-- snip -->
    >
    >
    > An architecture specific patch that breaks the one architecture it
    > touches at the first file being compiled is even for kernel standards
    > unusually bad...
    >


    I did this cmpxchg_local patchset to support Christoph Lameter's slub
    performance improvement work. It implies touching every kernel
    architecture. Each architecture is touched by a different patch. And no,
    I did not happen to have an FRV toolchain handy. Sorry. I'll dig into
    this.

    Mathieu


    >
    > 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
    >


    --
    Mathieu Desnoyers
    Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
    OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  3. [PATCH] Fix FRV cmpxchg_local

    Fix the FRV cmpxchg_local by breaking the following header dependency loop :

    linux/kernel.h -> linux/bitops.h -> asm-frv/bitops.h -> asm-frv/atomic.h
    -> asm-frv/system.h ->
    asm-generic/cmpxchg_local.h -> typecheck() defined in linux/kernel.h

    and

    linux/kernel.h -> linux/bitops.h -> asm-frv/bitops.h -> asm-frv/atomic.h ->
    asm-generic/cmpxchg_local.h -> typecheck() defined in linux/kernel.h

    In order to fix this :
    - Move the atomic_test_and_ *_mask inlines from asm-frv/atomic.h (why are they
    there at all anyway ? They are not touching atomic_t variables!) to
    asm-frv/bitops.h.

    Also fix a build issue with cmpxchg : it does not cast to (unsigned long *)
    like other architectures, to deal with it in the cmpxchg_local macro.

    FRV builds fine with this patch.

    Thanks to Adrian Bunk for spotting this bug.

    Signed-off-by: Mathieu Desnoyers
    CC: Adrian Bunk
    ---
    include/asm-frv/atomic.h | 81 ---------------------------------------------
    include/asm-frv/bitops.h | 83 +++++++++++++++++++++++++++++++++++++++++++++--
    include/asm-frv/system.h | 3 +
    3 files changed, 83 insertions(+), 84 deletions(-)

    Index: linux-2.6-lttng/include/asm-frv/atomic.h
    ================================================== =================
    --- linux-2.6-lttng.orig/include/asm-frv/atomic.h 2008-02-07 17:29:09.000000000 -0500
    +++ linux-2.6-lttng/include/asm-frv/atomic.h 2008-02-07 17:32:05.000000000 -0500
    @@ -125,87 +125,6 @@
    #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
    #define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0)

    -#ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS
    -static inline
    -unsigned long atomic_test_and_ANDNOT_mask(unsigned long mask, volatile unsigned long *v)
    -{
    - unsigned long old, tmp;
    -
    - asm volatile(
    - "0: \n"
    - " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */
    - " ckeq icc3,cc7 \n"
    - " ld.p %M0,%1 \n" /* LD.P/ORCR are atomic */
    - " orcr cc7,cc7,cc3 \n" /* set CC3 to true */
    - " and%I3 %1,%3,%2 \n"
    - " cst.p %2,%M0 ,cc3,#1 \n" /* if store happens... */
    - " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* ... clear ICC3.Z */
    - " beq icc3,#0,0b \n"
    - : "+U"(*v), "=&r"(old), "=r"(tmp)
    - : "NPr"(~mask)
    - : "memory", "cc7", "cc3", "icc3"
    - );
    -
    - return old;
    -}
    -
    -static inline
    -unsigned long atomic_test_and_OR_mask(unsigned long mask, volatile unsigned long *v)
    -{
    - unsigned long old, tmp;
    -
    - asm volatile(
    - "0: \n"
    - " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */
    - " ckeq icc3,cc7 \n"
    - " ld.p %M0,%1 \n" /* LD.P/ORCR are atomic */
    - " orcr cc7,cc7,cc3 \n" /* set CC3 to true */
    - " or%I3 %1,%3,%2 \n"
    - " cst.p %2,%M0 ,cc3,#1 \n" /* if store happens... */
    - " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* ... clear ICC3.Z */
    - " beq icc3,#0,0b \n"
    - : "+U"(*v), "=&r"(old), "=r"(tmp)
    - : "NPr"(mask)
    - : "memory", "cc7", "cc3", "icc3"
    - );
    -
    - return old;
    -}
    -
    -static inline
    -unsigned long atomic_test_and_XOR_mask(unsigned long mask, volatile unsigned long *v)
    -{
    - unsigned long old, tmp;
    -
    - asm volatile(
    - "0: \n"
    - " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */
    - " ckeq icc3,cc7 \n"
    - " ld.p %M0,%1 \n" /* LD.P/ORCR are atomic */
    - " orcr cc7,cc7,cc3 \n" /* set CC3 to true */
    - " xor%I3 %1,%3,%2 \n"
    - " cst.p %2,%M0 ,cc3,#1 \n" /* if store happens... */
    - " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* ... clear ICC3.Z */
    - " beq icc3,#0,0b \n"
    - : "+U"(*v), "=&r"(old), "=r"(tmp)
    - : "NPr"(mask)
    - : "memory", "cc7", "cc3", "icc3"
    - );
    -
    - return old;
    -}
    -
    -#else
    -
    -extern unsigned long atomic_test_and_ANDNOT_mask(unsigned long mask, volatile unsigned long *v);
    -extern unsigned long atomic_test_and_OR_mask(unsigned long mask, volatile unsigned long *v);
    -extern unsigned long atomic_test_and_XOR_mask(unsigned long mask, volatile unsigned long *v);
    -
    -#endif
    -
    -#define atomic_clear_mask(mask, v) atomic_test_and_ANDNOT_mask((mask), (v))
    -#define atomic_set_mask(mask, v) atomic_test_and_OR_mask((mask), (v))
    -
    /************************************************** ***************************/
    /*
    * exchange value with memory
    Index: linux-2.6-lttng/include/asm-frv/bitops.h
    ================================================== =================
    --- linux-2.6-lttng.orig/include/asm-frv/bitops.h 2008-02-07 17:27:48.000000000 -0500
    +++ linux-2.6-lttng/include/asm-frv/bitops.h 2008-02-07 17:32:20.000000000 -0500
    @@ -16,8 +16,6 @@

    #include
    #include
    -#include
    -#include

    #ifdef __KERNEL__

    @@ -33,6 +31,87 @@
    #define smp_mb__before_clear_bit() barrier()
    #define smp_mb__after_clear_bit() barrier()

    +#ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS
    +static inline
    +unsigned long atomic_test_and_ANDNOT_mask(unsigned long mask, volatile unsigned long *v)
    +{
    + unsigned long old, tmp;
    +
    + asm volatile(
    + "0: \n"
    + " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */
    + " ckeq icc3,cc7 \n"
    + " ld.p %M0,%1 \n" /* LD.P/ORCR are atomic */
    + " orcr cc7,cc7,cc3 \n" /* set CC3 to true */
    + " and%I3 %1,%3,%2 \n"
    + " cst.p %2,%M0 ,cc3,#1 \n" /* if store happens... */
    + " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* ... clear ICC3.Z */
    + " beq icc3,#0,0b \n"
    + : "+U"(*v), "=&r"(old), "=r"(tmp)
    + : "NPr"(~mask)
    + : "memory", "cc7", "cc3", "icc3"
    + );
    +
    + return old;
    +}
    +
    +static inline
    +unsigned long atomic_test_and_OR_mask(unsigned long mask, volatile unsigned long *v)
    +{
    + unsigned long old, tmp;
    +
    + asm volatile(
    + "0: \n"
    + " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */
    + " ckeq icc3,cc7 \n"
    + " ld.p %M0,%1 \n" /* LD.P/ORCR are atomic */
    + " orcr cc7,cc7,cc3 \n" /* set CC3 to true */
    + " or%I3 %1,%3,%2 \n"
    + " cst.p %2,%M0 ,cc3,#1 \n" /* if store happens... */
    + " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* ... clear ICC3.Z */
    + " beq icc3,#0,0b \n"
    + : "+U"(*v), "=&r"(old), "=r"(tmp)
    + : "NPr"(mask)
    + : "memory", "cc7", "cc3", "icc3"
    + );
    +
    + return old;
    +}
    +
    +static inline
    +unsigned long atomic_test_and_XOR_mask(unsigned long mask, volatile unsigned long *v)
    +{
    + unsigned long old, tmp;
    +
    + asm volatile(
    + "0: \n"
    + " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */
    + " ckeq icc3,cc7 \n"
    + " ld.p %M0,%1 \n" /* LD.P/ORCR are atomic */
    + " orcr cc7,cc7,cc3 \n" /* set CC3 to true */
    + " xor%I3 %1,%3,%2 \n"
    + " cst.p %2,%M0 ,cc3,#1 \n" /* if store happens... */
    + " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* ... clear ICC3.Z */
    + " beq icc3,#0,0b \n"
    + : "+U"(*v), "=&r"(old), "=r"(tmp)
    + : "NPr"(mask)
    + : "memory", "cc7", "cc3", "icc3"
    + );
    +
    + return old;
    +}
    +
    +#else
    +
    +extern unsigned long atomic_test_and_ANDNOT_mask(unsigned long mask, volatile unsigned long *v);
    +extern unsigned long atomic_test_and_OR_mask(unsigned long mask, volatile unsigned long *v);
    +extern unsigned long atomic_test_and_XOR_mask(unsigned long mask, volatile unsigned long *v);
    +
    +#endif
    +
    +#define atomic_clear_mask(mask, v) atomic_test_and_ANDNOT_mask((mask), (v))
    +#define atomic_set_mask(mask, v) atomic_test_and_OR_mask((mask), (v))
    +
    static inline int test_and_clear_bit(int nr, volatile void *addr)
    {
    volatile unsigned long *ptr = addr;
    Index: linux-2.6-lttng/include/asm-frv/system.h
    ================================================== =================
    --- linux-2.6-lttng.orig/include/asm-frv/system.h 2008-02-07 17:34:08.000000000 -0500
    +++ linux-2.6-lttng/include/asm-frv/system.h 2008-02-07 17:35:12.000000000 -0500
    @@ -14,6 +14,7 @@

    #include
    #include
    +#include

    struct thread_struct;

    @@ -276,7 +277,7 @@
    {
    switch (size) {
    case 4:
    - return cmpxchg(ptr, old, new);
    + return cmpxchg((unsigned long *)ptr, old, new);
    default:
    return __cmpxchg_local_generic(ptr, old, new, size);
    }

    --
    Mathieu Desnoyers
    Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
    OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

+ Reply to Thread