From: Keir Fraser <keir.xen@gmail.com>
To: Julien Grall <julien.grall@citrix.com>, xen-devel@lists.xen.org
Cc: Ian.Campbell@citrix.com, Stefano.Stabellini@eu.citrix.com
Subject: Re: [PATCH V2 2/2] xen/arm: implement smp_call_function
Date: Fri, 03 May 2013 21:27:00 +0100 [thread overview]
Message-ID: <CDA9DC24.240EB%keir.xen@gmail.com> (raw)
In-Reply-To: <1366119508-9227-3-git-send-email-julien.grall@citrix.com>
On 16/04/2013 14:38, "Julien Grall" <julien.grall@citrix.com> wrote:
> Move smp_call_function and on_selected_cpus to common code.
>
> Signed-off-by: Julien Grall <julien.grall@citrix.com>
Please put a Xen-style heading at the top of new file common/smp.c -- see
common/page_alloc.c (among many others) for an example.
Apart from that very minor consideration, the code is totally fine and I
will Ack this patch in advance of your next iteration of it:
Acked-by: Keir Fraser <keir@xen.org>
-- Keir
> ---
> xen/arch/arm/gic.c | 3 ++
> xen/arch/arm/smp.c | 11 ++---
> xen/arch/x86/smp.c | 88 +++-----------------------------------
> xen/common/Makefile | 1 +
> xen/common/smp.c | 94
> +++++++++++++++++++++++++++++++++++++++++
> xen/include/asm-arm/gic.h | 1 +
> xen/include/asm-x86/hardirq.h | 1 +
> xen/include/xen/smp.h | 7 +++
> 8 files changed, 116 insertions(+), 90 deletions(-)
> create mode 100644 xen/common/smp.c
>
> diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
> index 0ef994e..82aa6fe 100644
> --- a/xen/arch/arm/gic.c
> +++ b/xen/arch/arm/gic.c
> @@ -658,6 +658,9 @@ static void do_sgi(struct cpu_user_regs *regs, int
> othercpu, enum gic_sgi sgi)
> case GIC_SGI_DUMP_STATE:
> dump_execstate(regs);
> break;
> + case GIC_SGI_CALL_FUNCTION:
> + smp_call_function_interrupt();
> + break;
> default:
> panic("Unhandled SGI %d on CPU%d\n", sgi, smp_processor_id());
> break;
> diff --git a/xen/arch/arm/smp.c b/xen/arch/arm/smp.c
> index a902d84..4042db5 100644
> --- a/xen/arch/arm/smp.c
> +++ b/xen/arch/arm/smp.c
> @@ -11,17 +11,14 @@ void flush_tlb_mask(const cpumask_t *mask)
> flush_xen_data_tlb();
> }
>
> -void smp_call_function(
> - void (*func) (void *info),
> - void *info,
> - int wait)
> +void smp_send_event_check_mask(const cpumask_t *mask)
> {
> - panic("%s not implmented\n", __func__);
> + send_SGI_mask(mask, GIC_SGI_EVENT_CHECK);
> }
>
> -void smp_send_event_check_mask(const cpumask_t *mask)
> +void smp_send_call_function_mask(const cpumask_t *mask)
> {
> - send_SGI_mask(mask, GIC_SGI_EVENT_CHECK);
> + send_SGI_mask(mask, GIC_SGI_CALL_FUNCTION);
> }
>
> /*
> diff --git a/xen/arch/x86/smp.c b/xen/arch/x86/smp.c
> index a607531..0433f30 100644
> --- a/xen/arch/x86/smp.c
> +++ b/xen/arch/x86/smp.c
> @@ -269,67 +269,16 @@ void smp_send_event_check_mask(const cpumask_t *mask)
> send_IPI_mask(mask, EVENT_CHECK_VECTOR);
> }
>
> -/*
> - * Structure and data for smp_call_function()/on_selected_cpus().
> - */
> -
> -static void __smp_call_function_interrupt(void);
> -static DEFINE_SPINLOCK(call_lock);
> -static struct call_data_struct {
> - void (*func) (void *info);
> - void *info;
> - int wait;
> - cpumask_t selected;
> -} call_data;
> -
> -void smp_call_function(
> - void (*func) (void *info),
> - void *info,
> - int wait)
> +void smp_send_call_function_mask(const cpumask_t *mask)
> {
> - cpumask_t allbutself;
> -
> - cpumask_andnot(&allbutself, &cpu_online_map,
> - cpumask_of(smp_processor_id()));
> - on_selected_cpus(&allbutself, func, info, wait);
> -}
> -
> -void on_selected_cpus(
> - const cpumask_t *selected,
> - void (*func) (void *info),
> - void *info,
> - int wait)
> -{
> - unsigned int nr_cpus;
> -
> - ASSERT(local_irq_is_enabled());
> -
> - spin_lock(&call_lock);
> -
> - cpumask_copy(&call_data.selected, selected);
> -
> - nr_cpus = cpumask_weight(&call_data.selected);
> - if ( nr_cpus == 0 )
> - goto out;
> -
> - call_data.func = func;
> - call_data.info = info;
> - call_data.wait = wait;
> -
> - send_IPI_mask(&call_data.selected, CALL_FUNCTION_VECTOR);
> + send_IPI_mask(mask, CALL_FUNCTION_VECTOR);
>
> - if ( cpumask_test_cpu(smp_processor_id(), &call_data.selected) )
> + if ( cpumask_test_cpu(smp_processor_id(), mask) )
> {
> local_irq_disable();
> - __smp_call_function_interrupt();
> + smp_call_function_interrupt();
> local_irq_enable();
> }
> -
> - while ( !cpumask_empty(&call_data.selected) )
> - cpu_relax();
> -
> - out:
> - spin_unlock(&call_lock);
> }
>
> void __stop_this_cpu(void)
> @@ -390,36 +339,9 @@ void event_check_interrupt(struct cpu_user_regs *regs)
> this_cpu(irq_count)++;
> }
>
> -static void __smp_call_function_interrupt(void)
> -{
> - void (*func)(void *info) = call_data.func;
> - void *info = call_data.info;
> - unsigned int cpu = smp_processor_id();
> -
> - if ( !cpumask_test_cpu(cpu, &call_data.selected) )
> - return;
> -
> - irq_enter();
> -
> - if ( call_data.wait )
> - {
> - (*func)(info);
> - mb();
> - cpumask_clear_cpu(cpu, &call_data.selected);
> - }
> - else
> - {
> - mb();
> - cpumask_clear_cpu(cpu, &call_data.selected);
> - (*func)(info);
> - }
> -
> - irq_exit();
> -}
> -
> void call_function_interrupt(struct cpu_user_regs *regs)
> {
> ack_APIC_irq();
> perfc_incr(ipis);
> - __smp_call_function_interrupt();
> + smp_call_function_interrupt();
> }
> diff --git a/xen/common/Makefile b/xen/common/Makefile
> index 8a0c506..0dc2050 100644
> --- a/xen/common/Makefile
> +++ b/xen/common/Makefile
> @@ -26,6 +26,7 @@ obj-y += schedule.o
> obj-y += shutdown.o
> obj-y += softirq.o
> obj-y += sort.o
> +obj-y += smp.o
> obj-y += spinlock.o
> obj-y += stop_machine.o
> obj-y += string.o
> diff --git a/xen/common/smp.c b/xen/common/smp.c
> new file mode 100644
> index 0000000..dcd93ad
> --- /dev/null
> +++ b/xen/common/smp.c
> @@ -0,0 +1,94 @@
> +#include <asm/hardirq.h>
> +#include <asm/processor.h>
> +#include <xen/spinlock.h>
> +#include <xen/smp.h>
> +
> +/*
> + * Structure and data for smp_call_function()/on_selected_cpus().
> + */
> +static DEFINE_SPINLOCK(call_lock);
> +static struct call_data_struct {
> + void (*func) (void *info);
> + void *info;
> + int wait;
> + cpumask_t selected;
> +} call_data;
> +
> +void smp_call_function(
> + void (*func) (void *info),
> + void *info,
> + int wait)
> +{
> + cpumask_t allbutself;
> +
> + cpumask_andnot(&allbutself, &cpu_online_map,
> + cpumask_of(smp_processor_id()));
> + on_selected_cpus(&allbutself, func, info, wait);
> +}
> +
> +void on_selected_cpus(
> + const cpumask_t *selected,
> + void (*func) (void *info),
> + void *info,
> + int wait)
> +{
> + unsigned int nr_cpus;
> +
> + ASSERT(local_irq_is_enabled());
> +
> + spin_lock(&call_lock);
> +
> + cpumask_copy(&call_data.selected, selected);
> +
> + nr_cpus = cpumask_weight(&call_data.selected);
> + if ( nr_cpus == 0 )
> + goto out;
> +
> + call_data.func = func;
> + call_data.info = info;
> + call_data.wait = wait;
> +
> + smp_send_call_function_mask(&call_data.selected);
> +
> + while ( !cpumask_empty(&call_data.selected) )
> + cpu_relax();
> +
> +out:
> + spin_unlock(&call_lock);
> +}
> +
> +void smp_call_function_interrupt(void)
> +{
> + void (*func)(void *info) = call_data.func;
> + void *info = call_data.info;
> + unsigned int cpu = smp_processor_id();
> +
> + if ( !cpumask_test_cpu(cpu, &call_data.selected) )
> + return;
> +
> + irq_enter();
> +
> + if ( call_data.wait )
> + {
> + (*func)(info);
> + mb();
> + cpumask_clear_cpu(cpu, &call_data.selected);
> + }
> + else
> + {
> + mb();
> + cpumask_clear_cpu(cpu, &call_data.selected);
> + (*func)(info);
> + }
> +
> + irq_exit();
> +}
> +
> +/*
> + * Local variables:
> + * mode: C
> + * c-file-style: "BSD"
> + * c-basic-offset: 4
> + * indent-tabs-mode: nil
> + * End:
> + */
> diff --git a/xen/include/asm-arm/gic.h b/xen/include/asm-arm/gic.h
> index 4f2c8b8..47354dd 100644
> --- a/xen/include/asm-arm/gic.h
> +++ b/xen/include/asm-arm/gic.h
> @@ -173,6 +173,7 @@ extern void gic_restore_state(struct vcpu *v);
> enum gic_sgi {
> GIC_SGI_EVENT_CHECK = 0,
> GIC_SGI_DUMP_STATE = 1,
> + GIC_SGI_CALL_FUNCTION = 2,
> };
> extern void send_SGI_mask(const cpumask_t *cpumask, enum gic_sgi sgi);
> extern void send_SGI_one(unsigned int cpu, enum gic_sgi sgi);
> diff --git a/xen/include/asm-x86/hardirq.h b/xen/include/asm-x86/hardirq.h
> index e573007..01a41b9 100644
> --- a/xen/include/asm-x86/hardirq.h
> +++ b/xen/include/asm-x86/hardirq.h
> @@ -3,6 +3,7 @@
>
> #include <xen/config.h>
> #include <xen/cache.h>
> +#include <xen/types.h>
>
> typedef struct {
> unsigned int __softirq_pending;
> diff --git a/xen/include/xen/smp.h b/xen/include/xen/smp.h
> index e05f390..6febb56 100644
> --- a/xen/include/xen/smp.h
> +++ b/xen/include/xen/smp.h
> @@ -58,6 +58,13 @@ static inline void on_each_cpu(
> on_selected_cpus(&cpu_online_map, func, info, wait);
> }
>
> +/*
> + * Call a function on the current CPU
> + */
> +void smp_call_function_interrupt(void);
> +
> +void smp_send_call_function_mask(const cpumask_t *mask);
> +
> #define smp_processor_id() raw_smp_processor_id()
>
> int alloc_cpu_id(void);
next prev parent reply other threads:[~2013-05-03 20:27 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-16 13:38 [PATCH V2 0/2] xen/arm: implement smp_call_function Julien Grall
2013-04-16 13:38 ` [PATCH V2 1/2] xen/arm: gic_disable_cpu must be called with interrupts disabled Julien Grall
2013-04-16 14:16 ` Ian Campbell
2013-05-01 11:55 ` Ian Campbell
2013-05-01 12:25 ` Julien Grall
2013-05-10 14:22 ` Ian Campbell
2013-04-16 13:38 ` [PATCH V2 2/2] xen/arm: implement smp_call_function Julien Grall
2013-04-16 14:20 ` Ian Campbell
2013-05-03 20:27 ` Keir Fraser [this message]
2013-04-22 11:44 ` [PATCH V2 0/2] " Ian Campbell
2013-04-30 15:42 ` Ian Campbell
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=CDA9DC24.240EB%keir.xen@gmail.com \
--to=keir.xen@gmail.com \
--cc=Ian.Campbell@citrix.com \
--cc=Stefano.Stabellini@eu.citrix.com \
--cc=julien.grall@citrix.com \
--cc=xen-devel@lists.xen.org \
/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.