From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
To: Andrew Jones <drjones@redhat.com>
Cc: kvm@vger.kernel.org, pbonzini@redhat.com, rkrcmar@redhat.com,
kvm-ppc@vger.kernel.org, lvivier@redhat.com, thuth@redhat.com
Subject: Re: [kvm-unit-tests PATCH V3 3/5] lib/powerpc: Add function to start secondary threads
Date: Wed, 17 Aug 2016 04:18:00 +0000 [thread overview]
Message-ID: <1471407480.4989.18.camel@gmail.com> (raw)
In-Reply-To: <20160816122739.7t757ietllrihjii@kamzik.localdomain>
On Tue, 2016-08-16 at 14:27 +0200, Andrew Jones wrote:
> On Tue, Aug 16, 2016 at 05:18:13PM +1000, Suraj Jitindar Singh wrote:
> >
> > Add the lib/powerpc/smp.c file and associated header files as a
> > place
> > to implement generic smp functionality for inclusion in tests.
> >
> > Add functions start_all_cpus(), start_cpu() and start_thread() to
> > start
> > all stopped threads of all cpus, all stopped threads of a single
> > cpu or a
> > single stopped thread of a guest at a given execution location,
> > respectively.
> >
> > Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
> > ---
> >
> > Change Log:
> >
> > V2 -> V3:
> > - start_thread now returns int to reflect error, success or
> > failure to
> > start thread
> > - start_cpu returns number of threads on cpu and number
> > successfully
> > started
> > - start_all_cpus checks if number of threads started = total
> > number of
> > threads - 1
> >
> > Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
> > ---
> > lib/powerpc/asm/smp.h | 22 ++++++++++
> > lib/powerpc/smp.c | 106
> > ++++++++++++++++++++++++++++++++++++++++++++++++
> > lib/ppc64/asm/smp.h | 1 +
> > powerpc/Makefile.common | 1 +
> > 4 files changed, 130 insertions(+)
> > create mode 100644 lib/powerpc/asm/smp.h
> > create mode 100644 lib/powerpc/smp.c
> > create mode 100644 lib/ppc64/asm/smp.h
> >
> > diff --git a/lib/powerpc/asm/smp.h b/lib/powerpc/asm/smp.h
> > new file mode 100644
> > index 0000000..21940b4
> > --- /dev/null
> > +++ b/lib/powerpc/asm/smp.h
> > @@ -0,0 +1,22 @@
> > +#ifndef _ASMPOWERPC_SMP_H_
> > +#define _ASMPOWERPC_SMP_H_
> > +
> > +#include <libcflat.h>
> > +
> > +extern int nr_threads;
> > +
> > +struct start_threads {
> > + int nr_threads;
> > + int nr_started;
> > +};
> > +
> > +typedef void (*secondary_entry_fn)(void);
> > +
> > +extern void halt(void);
> > +
> > +extern int start_thread(int cpu_id, secondary_entry_fn entry,
> > uint32_t r3);
> > +extern struct start_threads start_cpu(int cpu_node,
> > secondary_entry_fn entry,
> > + uint32_t r3);
> > +extern bool start_all_cpus(secondary_entry_fn entry, uint32_t r3);
> > +
> > +#endif /* _ASMPOWERPC_SMP_H_ */
> > diff --git a/lib/powerpc/smp.c b/lib/powerpc/smp.c
> > new file mode 100644
> > index 0000000..48c636e
> > --- /dev/null
> > +++ b/lib/powerpc/smp.c
> > @@ -0,0 +1,106 @@
> > +/*
> > + * Secondary cpu support
> > + *
> > + * Copyright 2016 Suraj Jitindar Singh, IBM.
> > + *
> > + * This work is licensed under the terms of the GNU LGPL, version
> > 2.
> > + */
> > +
> > +#include <devicetree.h>
> > +#include <asm/setup.h>
> > +#include <asm/rtas.h>
> > +#include <asm/smp.h>
> > +
> > +int nr_threads;
> > +
> > +struct secondary_entry_data {
> > + secondary_entry_fn entry;
> > + uint64_t r3;
> > + int nr_started;
> > +};
> > +
> > +/*
> > + * Start stopped thread cpu_id at entry
> > + * Returns: <0 on failure to start stopped cpu
> > + * 0 on success
> > + * >0 on cpu not in stopped state
> > + */
> > +int start_thread(int cpu_id, secondary_entry_fn entry, uint32_t
> > r3)
> > +{
> > + int query_token, start_token, outputs[1], ret;
> > +
> > + query_token = rtas_token("query-cpu-stopped-state");
> > + start_token = rtas_token("start-cpu");
> > + assert(query_token != RTAS_UNKNOWN_SERVICE &&
> > + start_token != RTAS_UNKNOWN_SERVICE);
> > +
> > + ret = rtas_call(query_token, 1, 2, outputs, cpu_id);
> > + if (ret) /* rtas query call failed */
> > + printf("query-cpu-stopped-state failed for cpu
> > %d\n", cpu_id);
> > + else if (!outputs[0]) { /* cpu in stopped state */
> > + ret = rtas_call(start_token, 3, 1, NULL, cpu_id,
> > entry, r3);
> > + if (ret) /* rtas start-cpu call failed */
> > + printf("failed to start cpu %d\n",
> > cpu_id);
> > + } else /* cpu not in stopped state */
> > + ret = outputs[0];
> > +
> > + return ret;
> > +}
> > +
> > +/*
> > + * Start all stopped threads (vcpus) on cpu_node
> > + * Returns: Number of stopped cpus which were successfully started
> > + */
> > +struct start_threads start_cpu(int cpu_node, secondary_entry_fn
> > entry,
> > + uint32_t r3)
> > +{
> > + int len, cpu, nr_threads, nr_started = 0;
> > + const struct fdt_property *prop;
> > + u32 *cpus;
> The mixing of the terms cpus and threads in the function is
> confusing.
> Let's change the variables like this
>
> /cpus/threads/
> /cpu/i/
Sounds good
>
> >
> > +
> > + /* Get the id array of threads on this cpu_node */
> > + prop = fdt_get_property(dt_fdt(), cpu_node,
> > + "ibm,ppc-interrupt-server#s", &len);
> > + assert(prop);
> > +
> > + nr_threads = len >> 2; /* Divide by 4 since 4 bytes per
> > cpu */
> /cpu/thread/ in comment
ok
>
> >
> > + cpus = (u32 *)prop->data; /* Array of valid cpu numbers */
> /cpu/thread/ in comment
>
> >
> > +
> > + for (cpu = 0; cpu < nr_threads; cpu++) {
> > + if (!start_thread(fdt32_to_cpu(cpus[cpu]), entry,
> > r3))
> > + nr_started++;
> > + }
> > +
> > + return (struct start_threads) {nr_threads, nr_started};
> > +}
> > +
> > +static void start_each_secondary(int fdtnode, u32 regval __unused,
> > void *info)
> > +{
> > + struct secondary_entry_data *datap = info;
> > + struct start_threads ret = start_cpu(fdtnode, datap-
> > >entry, datap->r3);
> > +
> > + nr_threads += ret.nr_threads;
> > + datap->nr_started += ret.nr_started;
> > +}
> > +
> > +/*
> > + * Start all stopped cpus on the guest at entry with register 3
> > set to r3
> > + * We expect that we come in with only one thread currently
> > started
> > + * Returns: TRUE on success
> > + * FALSE on failure
> > + */
> > +bool start_all_cpus(secondary_entry_fn entry, uint32_t r3)
> > +{
> > + struct secondary_entry_data data = {
> > + entry,
> > + r3,
> > + 0
> > + };
> nit: no need for all the white space, can just do = { entry, r3, 0 };
Ok
>
> >
> > + int ret;
> > +
> > + ret = dt_for_each_cpu_node(&start_each_secondary, &data);
> nit: no need for '&' on function pointer.
I like having it
>
> >
> > + assert(ret = 0);
> > +
> > + /* We expect that we come in with one thread already
> > started */
> > + return data.nr_started = (nr_threads - 1);
> nit: no need for the ()
>
> You could also init data.nr_started to 1 above, and then avoid
> the -1 here, but whatever.
But then nr_started wouldn't actually represent the number of threads
that were started, it'd be ++ that. I'll keep the -1.
>
> >
> > +}
> > diff --git a/lib/ppc64/asm/smp.h b/lib/ppc64/asm/smp.h
> > new file mode 100644
> > index 0000000..67ced75
> > --- /dev/null
> > +++ b/lib/ppc64/asm/smp.h
> > @@ -0,0 +1 @@
> > +#include "../../powerpc/asm/smp.h"
> > diff --git a/powerpc/Makefile.common b/powerpc/Makefile.common
> > index 404194b..677030a 100644
> > --- a/powerpc/Makefile.common
> > +++ b/powerpc/Makefile.common
> > @@ -37,6 +37,7 @@ cflatobjs += lib/powerpc/setup.o
> > cflatobjs += lib/powerpc/rtas.o
> > cflatobjs += lib/powerpc/processor.o
> > cflatobjs += lib/powerpc/handlers.o
> > +cflatobjs += lib/powerpc/smp.o
> >
> > FLATLIBS = $(libcflat) $(LIBFDT_archive)
> > %.elf: CFLAGS += $(arch_CFLAGS)
WARNING: multiple messages have this Message-ID (diff)
From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
To: Andrew Jones <drjones@redhat.com>
Cc: kvm@vger.kernel.org, pbonzini@redhat.com, rkrcmar@redhat.com,
kvm-ppc@vger.kernel.org, lvivier@redhat.com, thuth@redhat.com
Subject: Re: [kvm-unit-tests PATCH V3 3/5] lib/powerpc: Add function to start secondary threads
Date: Wed, 17 Aug 2016 14:18:00 +1000 [thread overview]
Message-ID: <1471407480.4989.18.camel@gmail.com> (raw)
In-Reply-To: <20160816122739.7t757ietllrihjii@kamzik.localdomain>
On Tue, 2016-08-16 at 14:27 +0200, Andrew Jones wrote:
> On Tue, Aug 16, 2016 at 05:18:13PM +1000, Suraj Jitindar Singh wrote:
> >
> > Add the lib/powerpc/smp.c file and associated header files as a
> > place
> > to implement generic smp functionality for inclusion in tests.
> >
> > Add functions start_all_cpus(), start_cpu() and start_thread() to
> > start
> > all stopped threads of all cpus, all stopped threads of a single
> > cpu or a
> > single stopped thread of a guest at a given execution location,
> > respectively.
> >
> > Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
> > ---
> >
> > Change Log:
> >
> > V2 -> V3:
> > - start_thread now returns int to reflect error, success or
> > failure to
> > start thread
> > - start_cpu returns number of threads on cpu and number
> > successfully
> > started
> > - start_all_cpus checks if number of threads started == total
> > number of
> > threads - 1
> >
> > Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
> > ---
> > lib/powerpc/asm/smp.h | 22 ++++++++++
> > lib/powerpc/smp.c | 106
> > ++++++++++++++++++++++++++++++++++++++++++++++++
> > lib/ppc64/asm/smp.h | 1 +
> > powerpc/Makefile.common | 1 +
> > 4 files changed, 130 insertions(+)
> > create mode 100644 lib/powerpc/asm/smp.h
> > create mode 100644 lib/powerpc/smp.c
> > create mode 100644 lib/ppc64/asm/smp.h
> >
> > diff --git a/lib/powerpc/asm/smp.h b/lib/powerpc/asm/smp.h
> > new file mode 100644
> > index 0000000..21940b4
> > --- /dev/null
> > +++ b/lib/powerpc/asm/smp.h
> > @@ -0,0 +1,22 @@
> > +#ifndef _ASMPOWERPC_SMP_H_
> > +#define _ASMPOWERPC_SMP_H_
> > +
> > +#include <libcflat.h>
> > +
> > +extern int nr_threads;
> > +
> > +struct start_threads {
> > + int nr_threads;
> > + int nr_started;
> > +};
> > +
> > +typedef void (*secondary_entry_fn)(void);
> > +
> > +extern void halt(void);
> > +
> > +extern int start_thread(int cpu_id, secondary_entry_fn entry,
> > uint32_t r3);
> > +extern struct start_threads start_cpu(int cpu_node,
> > secondary_entry_fn entry,
> > + uint32_t r3);
> > +extern bool start_all_cpus(secondary_entry_fn entry, uint32_t r3);
> > +
> > +#endif /* _ASMPOWERPC_SMP_H_ */
> > diff --git a/lib/powerpc/smp.c b/lib/powerpc/smp.c
> > new file mode 100644
> > index 0000000..48c636e
> > --- /dev/null
> > +++ b/lib/powerpc/smp.c
> > @@ -0,0 +1,106 @@
> > +/*
> > + * Secondary cpu support
> > + *
> > + * Copyright 2016 Suraj Jitindar Singh, IBM.
> > + *
> > + * This work is licensed under the terms of the GNU LGPL, version
> > 2.
> > + */
> > +
> > +#include <devicetree.h>
> > +#include <asm/setup.h>
> > +#include <asm/rtas.h>
> > +#include <asm/smp.h>
> > +
> > +int nr_threads;
> > +
> > +struct secondary_entry_data {
> > + secondary_entry_fn entry;
> > + uint64_t r3;
> > + int nr_started;
> > +};
> > +
> > +/*
> > + * Start stopped thread cpu_id at entry
> > + * Returns: <0 on failure to start stopped cpu
> > + * 0 on success
> > + * >0 on cpu not in stopped state
> > + */
> > +int start_thread(int cpu_id, secondary_entry_fn entry, uint32_t
> > r3)
> > +{
> > + int query_token, start_token, outputs[1], ret;
> > +
> > + query_token = rtas_token("query-cpu-stopped-state");
> > + start_token = rtas_token("start-cpu");
> > + assert(query_token != RTAS_UNKNOWN_SERVICE &&
> > + start_token != RTAS_UNKNOWN_SERVICE);
> > +
> > + ret = rtas_call(query_token, 1, 2, outputs, cpu_id);
> > + if (ret) /* rtas query call failed */
> > + printf("query-cpu-stopped-state failed for cpu
> > %d\n", cpu_id);
> > + else if (!outputs[0]) { /* cpu in stopped state */
> > + ret = rtas_call(start_token, 3, 1, NULL, cpu_id,
> > entry, r3);
> > + if (ret) /* rtas start-cpu call failed */
> > + printf("failed to start cpu %d\n",
> > cpu_id);
> > + } else /* cpu not in stopped state */
> > + ret = outputs[0];
> > +
> > + return ret;
> > +}
> > +
> > +/*
> > + * Start all stopped threads (vcpus) on cpu_node
> > + * Returns: Number of stopped cpus which were successfully started
> > + */
> > +struct start_threads start_cpu(int cpu_node, secondary_entry_fn
> > entry,
> > + uint32_t r3)
> > +{
> > + int len, cpu, nr_threads, nr_started = 0;
> > + const struct fdt_property *prop;
> > + u32 *cpus;
> The mixing of the terms cpus and threads in the function is
> confusing.
> Let's change the variables like this
>
> /cpus/threads/
> /cpu/i/
Sounds good
>
> >
> > +
> > + /* Get the id array of threads on this cpu_node */
> > + prop = fdt_get_property(dt_fdt(), cpu_node,
> > + "ibm,ppc-interrupt-server#s", &len);
> > + assert(prop);
> > +
> > + nr_threads = len >> 2; /* Divide by 4 since 4 bytes per
> > cpu */
> /cpu/thread/ in comment
ok
>
> >
> > + cpus = (u32 *)prop->data; /* Array of valid cpu numbers */
> /cpu/thread/ in comment
>
> >
> > +
> > + for (cpu = 0; cpu < nr_threads; cpu++) {
> > + if (!start_thread(fdt32_to_cpu(cpus[cpu]), entry,
> > r3))
> > + nr_started++;
> > + }
> > +
> > + return (struct start_threads) {nr_threads, nr_started};
> > +}
> > +
> > +static void start_each_secondary(int fdtnode, u32 regval __unused,
> > void *info)
> > +{
> > + struct secondary_entry_data *datap = info;
> > + struct start_threads ret = start_cpu(fdtnode, datap-
> > >entry, datap->r3);
> > +
> > + nr_threads += ret.nr_threads;
> > + datap->nr_started += ret.nr_started;
> > +}
> > +
> > +/*
> > + * Start all stopped cpus on the guest at entry with register 3
> > set to r3
> > + * We expect that we come in with only one thread currently
> > started
> > + * Returns: TRUE on success
> > + * FALSE on failure
> > + */
> > +bool start_all_cpus(secondary_entry_fn entry, uint32_t r3)
> > +{
> > + struct secondary_entry_data data = {
> > + entry,
> > + r3,
> > + 0
> > + };
> nit: no need for all the white space, can just do = { entry, r3, 0 };
Ok
>
> >
> > + int ret;
> > +
> > + ret = dt_for_each_cpu_node(&start_each_secondary, &data);
> nit: no need for '&' on function pointer.
I like having it
>
> >
> > + assert(ret == 0);
> > +
> > + /* We expect that we come in with one thread already
> > started */
> > + return data.nr_started == (nr_threads - 1);
> nit: no need for the ()
>
> You could also init data.nr_started to 1 above, and then avoid
> the -1 here, but whatever.
But then nr_started wouldn't actually represent the number of threads
that were started, it'd be ++ that. I'll keep the -1.
>
> >
> > +}
> > diff --git a/lib/ppc64/asm/smp.h b/lib/ppc64/asm/smp.h
> > new file mode 100644
> > index 0000000..67ced75
> > --- /dev/null
> > +++ b/lib/ppc64/asm/smp.h
> > @@ -0,0 +1 @@
> > +#include "../../powerpc/asm/smp.h"
> > diff --git a/powerpc/Makefile.common b/powerpc/Makefile.common
> > index 404194b..677030a 100644
> > --- a/powerpc/Makefile.common
> > +++ b/powerpc/Makefile.common
> > @@ -37,6 +37,7 @@ cflatobjs += lib/powerpc/setup.o
> > cflatobjs += lib/powerpc/rtas.o
> > cflatobjs += lib/powerpc/processor.o
> > cflatobjs += lib/powerpc/handlers.o
> > +cflatobjs += lib/powerpc/smp.o
> >
> > FLATLIBS = $(libcflat) $(LIBFDT_archive)
> > %.elf: CFLAGS += $(arch_CFLAGS)
next prev parent reply other threads:[~2016-08-17 4:18 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-16 7:18 [kvm-unit-tests PATCH V3 1/5] scripts/runtime: Add ability to mark test as don't run by default Suraj Jitindar Singh
2016-08-16 7:18 ` Suraj Jitindar Singh
2016-08-16 7:18 ` [kvm-unit-tests PATCH V3 2/5] lib/powerpc: Add generic decrementer exception handler Suraj Jitindar Singh
2016-08-16 7:18 ` Suraj Jitindar Singh
2016-08-16 12:05 ` Andrew Jones
2016-08-16 12:05 ` Andrew Jones
2016-08-16 7:18 ` [kvm-unit-tests PATCH V3 3/5] lib/powerpc: Add function to start secondary threads Suraj Jitindar Singh
2016-08-16 7:18 ` Suraj Jitindar Singh
2016-08-16 12:27 ` Andrew Jones
2016-08-16 12:27 ` Andrew Jones
2016-08-17 4:18 ` Suraj Jitindar Singh [this message]
2016-08-17 4:18 ` Suraj Jitindar Singh
2016-08-16 7:18 ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit tests Suraj Jitindar Singh
2016-08-16 7:18 ` Suraj Jitindar Singh
2016-08-16 12:41 ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit test Andrew Jones
2016-08-16 12:41 ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit tests Andrew Jones
2016-08-17 4:57 ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit test Suraj Jitindar Singh
2016-08-17 4:57 ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit tests Suraj Jitindar Singh
2016-08-16 12:54 ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit test Thomas Huth
2016-08-16 12:54 ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit tests Thomas Huth
2016-08-17 5:02 ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit test Suraj Jitindar Singh
2016-08-17 5:02 ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit tests Suraj Jitindar Singh
2016-08-16 7:18 ` [kvm-unit-tests PATCH V3 5/5] powerpc/tm: Add a test for H_CEDE while tm suspended Suraj Jitindar Singh
2016-08-16 7:18 ` Suraj Jitindar Singh
2016-08-16 12:57 ` Andrew Jones
2016-08-16 12:57 ` Andrew Jones
2016-08-17 6:07 ` Suraj Jitindar Singh
2016-08-17 6:07 ` Suraj Jitindar Singh
2016-08-16 12:00 ` [kvm-unit-tests PATCH V3 1/5] scripts/runtime: Add ability to mark test as don't run by default Andrew Jones
2016-08-16 12:00 ` Andrew Jones
2016-08-16 16:03 ` Radim Krčmář
2016-08-16 16:03 ` Radim Krčmář
2016-08-17 3:35 ` Suraj Jitindar Singh
2016-08-17 3:35 ` Suraj Jitindar Singh
2016-08-17 3:14 ` Suraj Jitindar Singh
2016-08-17 3:14 ` Suraj Jitindar Singh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1471407480.4989.18.camel@gmail.com \
--to=sjitindarsingh@gmail.com \
--cc=drjones@redhat.com \
--cc=kvm-ppc@vger.kernel.org \
--cc=kvm@vger.kernel.org \
--cc=lvivier@redhat.com \
--cc=pbonzini@redhat.com \
--cc=rkrcmar@redhat.com \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.