2020-02-26 22:58:22

by Stafford Horne

[permalink] [raw]
Subject: [PATCH 0/3] OpenRISC clone3 support

This series fixes the clone3 not implemented warnings I have been seeing
during recent builds. It was a simple case of implementing copy_thread_tls
and turning on clone3 generic support. Testing shows no issues.

Stafford Horne (3):
openrisc: Convert copy_thread to copy_thread_tls
openrisc: Enable the clone3 syscall
openrisc: Cleanup copy_thread_tls docs and comments

arch/openrisc/Kconfig | 1 +
arch/openrisc/include/uapi/asm/unistd.h | 1 +
arch/openrisc/kernel/process.c | 19 +++++++------------
3 files changed, 9 insertions(+), 12 deletions(-)

--
2.21.0


2020-02-26 22:58:32

by Stafford Horne

[permalink] [raw]
Subject: [PATCH 1/3] openrisc: Convert copy_thread to copy_thread_tls

This is required for clone3 which passes the TLS value through a
struct rather than a register.

Signed-off-by: Stafford Horne <[email protected]>
---
arch/openrisc/Kconfig | 1 +
arch/openrisc/kernel/process.c | 15 +++++----------
2 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig
index 1928e061ff96..5debdbe6fc35 100644
--- a/arch/openrisc/Kconfig
+++ b/arch/openrisc/Kconfig
@@ -14,6 +14,7 @@ config OPENRISC
select HANDLE_DOMAIN_IRQ
select GPIOLIB
select HAVE_ARCH_TRACEHOOK
+ select HAVE_COPY_THREAD_TLS
select SPARSE_IRQ
select GENERIC_IRQ_CHIP
select GENERIC_IRQ_PROBE
diff --git a/arch/openrisc/kernel/process.c b/arch/openrisc/kernel/process.c
index b06f84f6676f..6695f167e126 100644
--- a/arch/openrisc/kernel/process.c
+++ b/arch/openrisc/kernel/process.c
@@ -117,12 +117,13 @@ void release_thread(struct task_struct *dead_task)
extern asmlinkage void ret_from_fork(void);

/*
- * copy_thread
+ * copy_thread_tls
* @clone_flags: flags
* @usp: user stack pointer or fn for kernel thread
* @arg: arg to fn for kernel thread; always NULL for userspace thread
* @p: the newly created task
* @regs: CPU context to copy for userspace thread; always NULL for kthread
+ * @tls: the Thread Local Storate pointer for the new process
*
* At the top of a newly initialized kernel stack are two stacked pt_reg
* structures. The first (topmost) is the userspace context of the thread.
@@ -148,8 +149,8 @@ extern asmlinkage void ret_from_fork(void);
*/

int
-copy_thread(unsigned long clone_flags, unsigned long usp,
- unsigned long arg, struct task_struct *p)
+copy_thread_tls(unsigned long clone_flags, unsigned long usp,
+ unsigned long arg, struct task_struct *p, unsigned long tls)
{
struct pt_regs *userregs;
struct pt_regs *kregs;
@@ -180,15 +181,9 @@ copy_thread(unsigned long clone_flags, unsigned long usp,

/*
* For CLONE_SETTLS set "tp" (r10) to the TLS pointer passed to sys_clone.
- *
- * The kernel entry is:
- * int clone (long flags, void *child_stack, int *parent_tid,
- * int *child_tid, struct void *tls)
- *
- * This makes the source r7 in the kernel registers.
*/
if (clone_flags & CLONE_SETTLS)
- userregs->gpr[10] = userregs->gpr[7];
+ userregs->gpr[10] = tls;

userregs->gpr[11] = 0; /* Result from fork() */

--
2.21.0

2020-02-26 22:58:38

by Stafford Horne

[permalink] [raw]
Subject: [PATCH 2/3] openrisc: Enable the clone3 syscall

Enable the clone3 syscall for OpenRISC. We use the generic version.

This was tested with the clone3 test from selftests. Note, for all
tests to pass it required enabling CONFIG_NAMESPACES which is not
enabled in the default kernel config.

Signed-off-by: Stafford Horne <[email protected]>
---
arch/openrisc/include/uapi/asm/unistd.h | 1 +
1 file changed, 1 insertion(+)

diff --git a/arch/openrisc/include/uapi/asm/unistd.h b/arch/openrisc/include/uapi/asm/unistd.h
index 566f8c4f8047..fae34c60fa88 100644
--- a/arch/openrisc/include/uapi/asm/unistd.h
+++ b/arch/openrisc/include/uapi/asm/unistd.h
@@ -24,6 +24,7 @@
#define __ARCH_WANT_SET_GET_RLIMIT
#define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_CLONE
+#define __ARCH_WANT_SYS_CLONE3
#define __ARCH_WANT_TIME32_SYSCALLS

#include <asm-generic/unistd.h>
--
2.21.0

2020-02-26 22:58:55

by Stafford Horne

[permalink] [raw]
Subject: [PATCH 3/3] openrisc: Cleanup copy_thread_tls docs and comments

Previously copy_thread_tls was copy_thread and before that something
else. Remove the documentation about the regs parameter that didn't
exist in either version.

Next, fix comment wrapping and details about how TLS pointer gets to the
copy_thread_tls function.

Signed-off-by: Stafford Horne <[email protected]>
---
arch/openrisc/kernel/process.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/openrisc/kernel/process.c b/arch/openrisc/kernel/process.c
index 6695f167e126..b442e7b59e17 100644
--- a/arch/openrisc/kernel/process.c
+++ b/arch/openrisc/kernel/process.c
@@ -122,7 +122,6 @@ extern asmlinkage void ret_from_fork(void);
* @usp: user stack pointer or fn for kernel thread
* @arg: arg to fn for kernel thread; always NULL for userspace thread
* @p: the newly created task
- * @regs: CPU context to copy for userspace thread; always NULL for kthread
* @tls: the Thread Local Storate pointer for the new process
*
* At the top of a newly initialized kernel stack are two stacked pt_reg
@@ -180,7 +179,8 @@ copy_thread_tls(unsigned long clone_flags, unsigned long usp,
userregs->sp = usp;

/*
- * For CLONE_SETTLS set "tp" (r10) to the TLS pointer passed to sys_clone.
+ * For CLONE_SETTLS set "tp" (r10) to the TLS pointer passed
+ * in clone_args to sys_clone3.
*/
if (clone_flags & CLONE_SETTLS)
userregs->gpr[10] = tls;
--
2.21.0

2020-02-27 00:31:57

by Stafford Horne

[permalink] [raw]
Subject: Re: [PATCH 1/3] openrisc: Convert copy_thread to copy_thread_tls

On Thu, Feb 27, 2020 at 07:56:23AM +0900, Stafford Horne wrote:
> This is required for clone3 which passes the TLS value through a
> struct rather than a register.

[...]

> diff --git a/arch/openrisc/kernel/process.c b/arch/openrisc/kernel/process.c
> index b06f84f6676f..6695f167e126 100644
> --- a/arch/openrisc/kernel/process.c
> +++ b/arch/openrisc/kernel/process.c
> @@ -117,12 +117,13 @@ void release_thread(struct task_struct *dead_task)
> extern asmlinkage void ret_from_fork(void);
>
> /*
> - * copy_thread
> + * copy_thread_tls
> * @clone_flags: flags
> * @usp: user stack pointer or fn for kernel thread
> * @arg: arg to fn for kernel thread; always NULL for userspace thread
> * @p: the newly created task
> * @regs: CPU context to copy for userspace thread; always NULL for kthread
> + * @tls: the Thread Local Storate pointer for the new process

This should be *Storage*.

2020-02-27 12:21:57

by Christian Brauner

[permalink] [raw]
Subject: Re: [PATCH 1/3] openrisc: Convert copy_thread to copy_thread_tls

On Thu, Feb 27, 2020 at 07:56:23AM +0900, Stafford Horne wrote:
> This is required for clone3 which passes the TLS value through a
> struct rather than a register.
>
> Signed-off-by: Stafford Horne <[email protected]>
> ---
> arch/openrisc/Kconfig | 1 +
> arch/openrisc/kernel/process.c | 15 +++++----------
> 2 files changed, 6 insertions(+), 10 deletions(-)
>
> diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig
> index 1928e061ff96..5debdbe6fc35 100644
> --- a/arch/openrisc/Kconfig
> +++ b/arch/openrisc/Kconfig
> @@ -14,6 +14,7 @@ config OPENRISC
> select HANDLE_DOMAIN_IRQ
> select GPIOLIB
> select HAVE_ARCH_TRACEHOOK
> + select HAVE_COPY_THREAD_TLS
> select SPARSE_IRQ
> select GENERIC_IRQ_CHIP
> select GENERIC_IRQ_PROBE
> diff --git a/arch/openrisc/kernel/process.c b/arch/openrisc/kernel/process.c
> index b06f84f6676f..6695f167e126 100644
> --- a/arch/openrisc/kernel/process.c
> +++ b/arch/openrisc/kernel/process.c
> @@ -117,12 +117,13 @@ void release_thread(struct task_struct *dead_task)
> extern asmlinkage void ret_from_fork(void);
>
> /*
> - * copy_thread
> + * copy_thread_tls
> * @clone_flags: flags
> * @usp: user stack pointer or fn for kernel thread
> * @arg: arg to fn for kernel thread; always NULL for userspace thread
> * @p: the newly created task
> * @regs: CPU context to copy for userspace thread; always NULL for kthread
> + * @tls: the Thread Local Storate pointer for the new process
> *
> * At the top of a newly initialized kernel stack are two stacked pt_reg
> * structures. The first (topmost) is the userspace context of the thread.
> @@ -148,8 +149,8 @@ extern asmlinkage void ret_from_fork(void);
> */
>
> int
> -copy_thread(unsigned long clone_flags, unsigned long usp,
> - unsigned long arg, struct task_struct *p)
> +copy_thread_tls(unsigned long clone_flags, unsigned long usp,
> + unsigned long arg, struct task_struct *p, unsigned long tls)
> {
> struct pt_regs *userregs;
> struct pt_regs *kregs;
> @@ -180,15 +181,9 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
>
> /*
> * For CLONE_SETTLS set "tp" (r10) to the TLS pointer passed to sys_clone.

Maybe reword this to:

For CLONE_SETTLS set "tp" (r10) to the TLS pointer. We probably
shouldn't mention clone() explicitly anymore, since we now have
clone3() and therefore two callers that pass in tls arguments.

Thanks!
Christian

2020-02-27 12:23:14

by Christian Brauner

[permalink] [raw]
Subject: Re: [PATCH 2/3] openrisc: Enable the clone3 syscall

On Thu, Feb 27, 2020 at 07:56:24AM +0900, Stafford Horne wrote:
> Enable the clone3 syscall for OpenRISC. We use the generic version.
>
> This was tested with the clone3 test from selftests. Note, for all
> tests to pass it required enabling CONFIG_NAMESPACES which is not
> enabled in the default kernel config.

For OpenRISC, I assume. Hm, maybe we should fix the tests to skip when
CONFIG_NAMESPACES is not enabled.

>
> Signed-off-by: Stafford Horne <[email protected]>

Acked-by: Christian Brauner <[email protected]>

2020-02-27 12:24:52

by Christian Brauner

[permalink] [raw]
Subject: Re: [PATCH 3/3] openrisc: Cleanup copy_thread_tls docs and comments

On Thu, Feb 27, 2020 at 07:56:25AM +0900, Stafford Horne wrote:
> Previously copy_thread_tls was copy_thread and before that something
> else. Remove the documentation about the regs parameter that didn't
> exist in either version.
>
> Next, fix comment wrapping and details about how TLS pointer gets to the
> copy_thread_tls function.
>
> Signed-off-by: Stafford Horne <[email protected]>

Acked-by: Christian Brauner <[email protected]>

> ---
> arch/openrisc/kernel/process.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/openrisc/kernel/process.c b/arch/openrisc/kernel/process.c
> index 6695f167e126..b442e7b59e17 100644
> --- a/arch/openrisc/kernel/process.c
> +++ b/arch/openrisc/kernel/process.c
> @@ -122,7 +122,6 @@ extern asmlinkage void ret_from_fork(void);
> * @usp: user stack pointer or fn for kernel thread
> * @arg: arg to fn for kernel thread; always NULL for userspace thread
> * @p: the newly created task
> - * @regs: CPU context to copy for userspace thread; always NULL for kthread
> * @tls: the Thread Local Storate pointer for the new process
> *
> * At the top of a newly initialized kernel stack are two stacked pt_reg
> @@ -180,7 +179,8 @@ copy_thread_tls(unsigned long clone_flags, unsigned long usp,
> userregs->sp = usp;
>
> /*
> - * For CLONE_SETTLS set "tp" (r10) to the TLS pointer passed to sys_clone.
> + * For CLONE_SETTLS set "tp" (r10) to the TLS pointer passed
> + * in clone_args to sys_clone3.

As I said in my other reply, I'd not reference any specific caller since
we have at least two.

Christian

2020-02-27 12:28:16

by Christian Brauner

[permalink] [raw]
Subject: Re: [PATCH 0/3] OpenRISC clone3 support

On Thu, Feb 27, 2020 at 07:56:22AM +0900, Stafford Horne wrote:
> This series fixes the clone3 not implemented warnings I have been seeing
> during recent builds. It was a simple case of implementing copy_thread_tls
> and turning on clone3 generic support. Testing shows no issues.

This all looks good to me. Thanks for doing this. We're getting closer
and closer to having all architectures supporting clone3()!

You want me to pick this series up for 5.7 or are you going through
another tree?

Christian

2020-02-27 13:17:55

by Stafford Horne

[permalink] [raw]
Subject: Re: [PATCH 1/3] openrisc: Convert copy_thread to copy_thread_tls

On Thu, Feb 27, 2020 at 01:19:52PM +0100, Christian Brauner wrote:
> On Thu, Feb 27, 2020 at 07:56:23AM +0900, Stafford Horne wrote:
> > This is required for clone3 which passes the TLS value through a
> > struct rather than a register.
> >
> > Signed-off-by: Stafford Horne <[email protected]>
> > ---
> > arch/openrisc/Kconfig | 1 +
> > arch/openrisc/kernel/process.c | 15 +++++----------
> > 2 files changed, 6 insertions(+), 10 deletions(-)
> >
> > diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig
> > index 1928e061ff96..5debdbe6fc35 100644
> > --- a/arch/openrisc/Kconfig
> > +++ b/arch/openrisc/Kconfig
> > @@ -14,6 +14,7 @@ config OPENRISC
> > select HANDLE_DOMAIN_IRQ
> > select GPIOLIB
> > select HAVE_ARCH_TRACEHOOK
> > + select HAVE_COPY_THREAD_TLS
> > select SPARSE_IRQ
> > select GENERIC_IRQ_CHIP
> > select GENERIC_IRQ_PROBE
> > diff --git a/arch/openrisc/kernel/process.c b/arch/openrisc/kernel/process.c
> > index b06f84f6676f..6695f167e126 100644
> > --- a/arch/openrisc/kernel/process.c
> > +++ b/arch/openrisc/kernel/process.c
> > @@ -117,12 +117,13 @@ void release_thread(struct task_struct *dead_task)
> > extern asmlinkage void ret_from_fork(void);
> >
> > /*
> > - * copy_thread
> > + * copy_thread_tls
> > * @clone_flags: flags
> > * @usp: user stack pointer or fn for kernel thread
> > * @arg: arg to fn for kernel thread; always NULL for userspace thread
> > * @p: the newly created task
> > * @regs: CPU context to copy for userspace thread; always NULL for kthread
> > + * @tls: the Thread Local Storate pointer for the new process
> > *
> > * At the top of a newly initialized kernel stack are two stacked pt_reg
> > * structures. The first (topmost) is the userspace context of the thread.
> > @@ -148,8 +149,8 @@ extern asmlinkage void ret_from_fork(void);
> > */
> >
> > int
> > -copy_thread(unsigned long clone_flags, unsigned long usp,
> > - unsigned long arg, struct task_struct *p)
> > +copy_thread_tls(unsigned long clone_flags, unsigned long usp,
> > + unsigned long arg, struct task_struct *p, unsigned long tls)
> > {
> > struct pt_regs *userregs;
> > struct pt_regs *kregs;
> > @@ -180,15 +181,9 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
> >
> > /*
> > * For CLONE_SETTLS set "tp" (r10) to the TLS pointer passed to sys_clone.
>
> Maybe reword this to:
>
> For CLONE_SETTLS set "tp" (r10) to the TLS pointer. We probably
> shouldn't mention clone() explicitly anymore, since we now have
> clone3() and therefore two callers that pass in tls arguments.

Sure, I updated it in the 'docs' commit, but as you mention I can just remove
the mention of clone* all together. I will just remove that here and it won't
have to be touched in the 'docs' commit.

2020-02-27 13:19:16

by Stafford Horne

[permalink] [raw]
Subject: Re: [PATCH 0/3] OpenRISC clone3 support

On Thu, Feb 27, 2020 at 01:26:54PM +0100, Christian Brauner wrote:
> On Thu, Feb 27, 2020 at 07:56:22AM +0900, Stafford Horne wrote:
> > This series fixes the clone3 not implemented warnings I have been seeing
> > during recent builds. It was a simple case of implementing copy_thread_tls
> > and turning on clone3 generic support. Testing shows no issues.
>
> This all looks good to me. Thanks for doing this. We're getting closer
> and closer to having all architectures supporting clone3()!
>
> You want me to pick this series up for 5.7 or are you going through
> another tree?

I am the OpenRISC maintainer so I will just send these through my tree during
the 5.7 merge window with you Ack attributions.

-Stafford

2020-02-27 13:30:08

by Stafford Horne

[permalink] [raw]
Subject: Re: [PATCH 2/3] openrisc: Enable the clone3 syscall

On Thu, Feb 27, 2020 at 01:21:47PM +0100, Christian Brauner wrote:
> On Thu, Feb 27, 2020 at 07:56:24AM +0900, Stafford Horne wrote:
> > Enable the clone3 syscall for OpenRISC. We use the generic version.
> >
> > This was tested with the clone3 test from selftests. Note, for all
> > tests to pass it required enabling CONFIG_NAMESPACES which is not
> > enabled in the default kernel config.
>
> For OpenRISC, I assume. Hm, maybe we should fix the tests to skip when
> CONFIG_NAMESPACES is not enabled.

Yes, not the default for openrisc defconfig. It might make sense to either skip
the tests of have them as expected fails when CONFIG_NAMESPACES is off.

On the otherhand, I am not sure if the self tests know about the CONFIG_*
available. I notice many test directories have a 'config' file and a readme
saying, for these test to run ensure use have at least 'these' config values
set.

-Stafford