2011-03-30 08:48:14

by Xuetao Guan

[permalink] [raw]
Subject: [PATCH] unicore32 fix: remove arch-specific futex support

The futex functions in unicore32 are not used and verified,
so just replaced by asm-generic version.

Signed-off-by: Guan Xuetao <[email protected]>
---
arch/unicore32/Makefile | 2 +-
arch/unicore32/include/asm/futex.h | 143 ------------------------------------
2 files changed, 1 insertions(+), 144 deletions(-)
delete mode 100644 arch/unicore32/include/asm/futex.h

diff --git a/arch/unicore32/Makefile b/arch/unicore32/Makefile
index e08d6d3..76a8bee 100644
--- a/arch/unicore32/Makefile
+++ b/arch/unicore32/Makefile
@@ -48,7 +48,7 @@ ASM_GENERIC_HEADERS += bitsperlong.h bug.h bugs.h
ASM_GENERIC_HEADERS += cputime.h current.h
ASM_GENERIC_HEADERS += device.h div64.h
ASM_GENERIC_HEADERS += emergency-restart.h errno.h
-ASM_GENERIC_HEADERS += fb.h fcntl.h ftrace.h
+ASM_GENERIC_HEADERS += fb.h fcntl.h ftrace.h futex.h
ASM_GENERIC_HEADERS += hardirq.h hw_irq.h
ASM_GENERIC_HEADERS += ioctl.h ioctls.h ipcbuf.h irq_regs.h
ASM_GENERIC_HEADERS += kdebug.h kmap_types.h
diff --git a/arch/unicore32/include/asm/futex.h b/arch/unicore32/include/asm/futex.h
deleted file mode 100644
index 07dea61..0000000
--- a/arch/unicore32/include/asm/futex.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * linux/arch/unicore32/include/asm/futex.h
- *
- * Code specific to PKUnity SoC and UniCore ISA
- *
- * Copyright (C) 2001-2010 GUAN Xue-tao
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef __UNICORE_FUTEX_H__
-#define __UNICORE_FUTEX_H__
-
-#ifdef __KERNEL__
-
-#include <linux/futex.h>
-#include <linux/preempt.h>
-#include <linux/uaccess.h>
-#include <linux/errno.h>
-
-#define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \
- __asm__ __volatile__( \
- "1: ldw.u %1, [%2]\n" \
- " " insn "\n" \
- "2: stw.u %0, [%2]\n" \
- " mov %0, #0\n" \
- "3:\n" \
- " .pushsection __ex_table,\"a\"\n" \
- " .align 3\n" \
- " .long 1b, 4f, 2b, 4f\n" \
- " .popsection\n" \
- " .pushsection .fixup,\"ax\"\n" \
- "4: mov %0, %4\n" \
- " b 3b\n" \
- " .popsection" \
- : "=&r" (ret), "=&r" (oldval) \
- : "r" (uaddr), "r" (oparg), "Ir" (-EFAULT) \
- : "cc", "memory")
-
-static inline int
-futex_atomic_op_inuser(int encoded_op, int __user *uaddr)
-{
- int op = (encoded_op >> 28) & 7;
- int cmp = (encoded_op >> 24) & 15;
- int oparg = (encoded_op << 8) >> 20;
- int cmparg = (encoded_op << 20) >> 20;
- int oldval = 0, ret;
-
- if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))
- oparg = 1 << oparg;
-
- if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
- return -EFAULT;
-
- pagefault_disable(); /* implies preempt_disable() */
-
- switch (op) {
- case FUTEX_OP_SET:
- __futex_atomic_op("mov %0, %3", ret, oldval, uaddr, oparg);
- break;
- case FUTEX_OP_ADD:
- __futex_atomic_op("add %0, %1, %3", ret, oldval, uaddr, oparg);
- break;
- case FUTEX_OP_OR:
- __futex_atomic_op("or %0, %1, %3", ret, oldval, uaddr, oparg);
- break;
- case FUTEX_OP_ANDN:
- __futex_atomic_op("and %0, %1, %3",
- ret, oldval, uaddr, ~oparg);
- break;
- case FUTEX_OP_XOR:
- __futex_atomic_op("xor %0, %1, %3", ret, oldval, uaddr, oparg);
- break;
- default:
- ret = -ENOSYS;
- }
-
- pagefault_enable(); /* subsumes preempt_enable() */
-
- if (!ret) {
- switch (cmp) {
- case FUTEX_OP_CMP_EQ:
- ret = (oldval == cmparg);
- break;
- case FUTEX_OP_CMP_NE:
- ret = (oldval != cmparg);
- break;
- case FUTEX_OP_CMP_LT:
- ret = (oldval < cmparg);
- break;
- case FUTEX_OP_CMP_GE:
- ret = (oldval >= cmparg);
- break;
- case FUTEX_OP_CMP_LE:
- ret = (oldval <= cmparg);
- break;
- case FUTEX_OP_CMP_GT:
- ret = (oldval > cmparg);
- break;
- default:
- ret = -ENOSYS;
- }
- }
- return ret;
-}
-
-static inline int
-futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
-{
- int val;
-
- if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
- return -EFAULT;
-
- pagefault_disable(); /* implies preempt_disable() */
-
- __asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n"
- "1: ldw.u %0, [%3]\n"
- " cmpxor.a %0, %1\n"
- " bne 3f\n"
- "2: stw.u %2, [%3]\n"
- "3:\n"
- " .pushsection __ex_table,\"a\"\n"
- " .align 3\n"
- " .long 1b, 4f, 2b, 4f\n"
- " .popsection\n"
- " .pushsection .fixup,\"ax\"\n"
- "4: mov %0, %4\n"
- " b 3b\n"
- " .popsection"
- : "=&r" (val)
- : "r" (oldval), "r" (newval), "r" (uaddr), "Ir" (-EFAULT)
- : "cc", "memory");
-
- pagefault_enable(); /* subsumes preempt_enable() */
-
- return val;
-}
-
-#endif /* __KERNEL__ */
-#endif /* __UNICORE_FUTEX_H__ */
--
1.6.2.2


2011-03-30 12:17:33

by Arnd Bergmann

[permalink] [raw]
Subject: Re: [PATCH] unicore32 fix: remove arch-specific futex support

On Wednesday 30 March 2011, Guan Xuetao wrote:
> The futex functions in unicore32 are not used and verified,
> so just replaced by asm-generic version.
>
> Signed-off-by: Guan Xuetao <[email protected]>

Note that the a working futex implementation would be really useful
to get efficient multithreaded applications. On uniprocessor
machines, this can easily be done by disabling interrupts, like
you also do for spinlock and atomic.

I believe we could actually copy the arch/sh/include/asm/futex-irq.h
implementation to include/asm-generic and use that whenever CONFIG_SMP
is disabled. That would also help a lot of other architectures.

Arnd

2011-03-30 12:27:28

by Thomas Gleixner

[permalink] [raw]
Subject: Re: [PATCH] unicore32 fix: remove arch-specific futex support

On Wed, 30 Mar 2011, Arnd Bergmann wrote:

> On Wednesday 30 March 2011, Guan Xuetao wrote:
> > The futex functions in unicore32 are not used and verified,
> > so just replaced by asm-generic version.
> >
> > Signed-off-by: Guan Xuetao <[email protected]>
>
> Note that the a working futex implementation would be really useful
> to get efficient multithreaded applications. On uniprocessor
> machines, this can easily be done by disabling interrupts, like
> you also do for spinlock and atomic.
>
> I believe we could actually copy the arch/sh/include/asm/futex-irq.h
> implementation to include/asm-generic and use that whenever CONFIG_SMP
> is disabled. That would also help a lot of other architectures.

The problem is that you need cmpxchg in user space as well.

ARM does this with some syscall magic for machines which do not have
cmpxchg.

tglx

2011-03-30 12:45:53

by Arnd Bergmann

[permalink] [raw]
Subject: Re: [PATCH] unicore32 fix: remove arch-specific futex support

On Wednesday 30 March 2011, Thomas Gleixner wrote:
> The problem is that you need cmpxchg in user space as well.
>
> ARM does this with some syscall magic for machines which do not have
> cmpxchg.

Ah, right. I wonder how sh does it.

I also remember that the original unicore32 ABI had support for a cmpxchg
system call, but that was removed with the move to the generic syscall
table.

It is of course possible to add it back using the __NR_arch_specific_syscall
entry point.

Arnd

2011-03-30 12:50:36

by Thomas Gleixner

[permalink] [raw]
Subject: Re: [PATCH] unicore32 fix: remove arch-specific futex support

On Wed, 30 Mar 2011, Arnd Bergmann wrote:

> On Wednesday 30 March 2011, Thomas Gleixner wrote:
> > The problem is that you need cmpxchg in user space as well.
> >
> > ARM does this with some syscall magic for machines which do not have
> > cmpxchg.
>
> Ah, right. I wonder how sh does it.
>
> I also remember that the original unicore32 ABI had support for a cmpxchg
> system call, but that was removed with the move to the generic syscall
> table.
>
> It is of course possible to add it back using the __NR_arch_specific_syscall
> entry point.

Either that or you take a trap. None of them is pretty.

If the only purpose is futex support, then we can add an extra flag to
the futex ops and handle it there via asm-generic/futex.h. That would
avoid an extra syscall in the contended case.

Thanks,

tglx

2011-03-31 10:17:03

by Xuetao Guan

[permalink] [raw]
Subject: RE: [PATCH] unicore32 fix: remove arch-specific futex support



> -----Original Message-----
> From: Arnd Bergmann [mailto:[email protected]]
> Sent: Wednesday, March 30, 2011 8:40 PM
> To: Thomas Gleixner
> Cc: Guan Xuetao; Paul Mundt; [email protected]; [email protected]
> Subject: Re: [PATCH] unicore32 fix: remove arch-specific futex support
>
> On Wednesday 30 March 2011, Thomas Gleixner wrote:
> > The problem is that you need cmpxchg in user space as well.
> >
> > ARM does this with some syscall magic for machines which do not have
> > cmpxchg.
>
> Ah, right. I wonder how sh does it.
>
> I also remember that the original unicore32 ABI had support for a cmpxchg
> system call, but that was removed with the move to the generic syscall
> table.
>
> It is of course possible to add it back using the __NR_arch_specific_syscall
> entry point.
>
> Arnd

For cmpxchg, we have both system call and kuser_cmpxchg supports in old abi
which are similar to arm.
The performance of system call version is too poor, so it could be only used for test.

Thanks & Regards

Guan Xuetao

2011-04-01 09:09:30

by Arnd Bergmann

[permalink] [raw]
Subject: Re: [PATCH] unicore32 fix: remove arch-specific futex support

On Thursday 31 March 2011, Guan Xuetao wrote:
> For cmpxchg, we have both system call and kuser_cmpxchg supports in old abi
> which are similar to arm.
> The performance of system call version is too poor, so it could be only used for test.
>

Let's forget about doing futex support for unicore32 then and use your original
patch.

Acked-by: Arnd Bergmann <[email protected]>