From: Palmer Dabbelt <palmer@sifive.com>
To: anup@brainfault.org, Atish Patra <Atish.Patra@wdc.com>
Cc: aou@eecs.berkeley.edu, atish.patra@wdc.com,
Christoph Hellwig <hch@infradead.org>,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
anup@brainfault.org
Subject: Re: [PATCH v3] RISC-V: Show IPI stats
Date: Mon, 01 Oct 2018 09:42:41 -0700 (PDT) [thread overview]
Message-ID: <mhng-db76292c-f906-4cc7-abe6-de6dac888c78@palmer-si-x1c4> (raw)
In-Reply-To: <20180929062605.12888-1-anup@brainfault.org>
On Fri, 28 Sep 2018 23:26:05 PDT (-0700), anup@brainfault.org wrote:
> This patch provides arch_show_interrupts() implementation to
> show IPI stats via /proc/interrupts.
>
> Now the contents of /proc/interrupts" will look like below:
> CPU0 CPU1 CPU2 CPU3
> 8: 17 7 6 14 SiFive PLIC 8 virtio0
> 10: 10 10 9 11 SiFive PLIC 10 ttyS0
> IPI0: 170 673 251 79 Rescheduling interrupts
> IPI1: 1 12 27 1 Function call interrupts
>
> Signed-off-by: Anup Patel <anup@brainfault.org>
>
> Changes since v2:
> - Remove use of IPI_CALL_WAKEUP because it's being removed
>
> Changes since v1:
> - Add stub inline show_ipi_stats() function for !CONFIG_SMP
> - Make ipi_names[] dynamically sized at compile time
> - Minor beautification of ipi_names[] using tabs
Reviewed-by: Palmer Dabbelt <palmer@sifive.com>
This is going in through Atish's patch set.
>
> ---
> arch/riscv/include/asm/smp.h | 9 +++++++++
> arch/riscv/kernel/irq.c | 8 ++++++++
> arch/riscv/kernel/smp.c | 39 +++++++++++++++++++++++++++++-------
> 3 files changed, 49 insertions(+), 7 deletions(-)
>
> diff --git a/arch/riscv/include/asm/smp.h b/arch/riscv/include/asm/smp.h
> index fce312ce3516..5278ae8f1346 100644
> --- a/arch/riscv/include/asm/smp.h
> +++ b/arch/riscv/include/asm/smp.h
> @@ -25,8 +25,13 @@
> extern unsigned long __cpuid_to_hardid_map[NR_CPUS];
> #define cpuid_to_hardid_map(cpu) __cpuid_to_hardid_map[cpu]
>
> +struct seq_file;
> +
> #ifdef CONFIG_SMP
>
> +/* print IPI stats */
> +void show_ipi_stats(struct seq_file *p, int prec);
> +
> /* SMP initialization hook for setup_arch */
> void __init setup_smp(void);
>
> @@ -47,6 +52,10 @@ void riscv_cpuid_to_hartid_mask(const struct cpumask *in, struct cpumask *out);
>
> #else
>
> +static inline void show_ipi_stats(struct seq_file *p, int prec)
> +{
> +}
> +
> static inline int riscv_hartid_to_cpuid(int hartid)
> {
> return 0;
> diff --git a/arch/riscv/kernel/irq.c b/arch/riscv/kernel/irq.c
> index ca4593317e45..48e6b7db83a1 100644
> --- a/arch/riscv/kernel/irq.c
> +++ b/arch/riscv/kernel/irq.c
> @@ -8,6 +8,8 @@
> #include <linux/interrupt.h>
> #include <linux/irqchip.h>
> #include <linux/irqdomain.h>
> +#include <linux/seq_file.h>
> +#include <asm/smp.h>
>
> /*
> * Possible interrupt causes:
> @@ -24,6 +26,12 @@
> */
> #define INTERRUPT_CAUSE_FLAG (1UL << (__riscv_xlen - 1))
>
> +int arch_show_interrupts(struct seq_file *p, int prec)
> +{
> + show_ipi_stats(p, prec);
> + return 0;
> +}
> +
> asmlinkage void __irq_entry do_IRQ(struct pt_regs *regs)
> {
> struct pt_regs *old_regs = set_irq_regs(regs);
> diff --git a/arch/riscv/kernel/smp.c b/arch/riscv/kernel/smp.c
> index 89d95866f562..686fa7a427ff 100644
> --- a/arch/riscv/kernel/smp.c
> +++ b/arch/riscv/kernel/smp.c
> @@ -22,22 +22,24 @@
> #include <linux/interrupt.h>
> #include <linux/smp.h>
> #include <linux/sched.h>
> +#include <linux/seq_file.h>
>
> #include <asm/sbi.h>
> #include <asm/tlbflush.h>
> #include <asm/cacheflush.h>
>
> -/* A collection of single bit ipi messages. */
> -static struct {
> - unsigned long bits ____cacheline_aligned;
> -} ipi_data[NR_CPUS] __cacheline_aligned;
> -
> enum ipi_message_type {
> IPI_RESCHEDULE,
> IPI_CALL_FUNC,
> IPI_MAX
> };
>
> +/* A collection of single bit ipi messages. */
> +static struct {
> + unsigned long stats[IPI_MAX] ____cacheline_aligned;
> + unsigned long bits ____cacheline_aligned;
> +} ipi_data[NR_CPUS] __cacheline_aligned;
> +
> int riscv_hartid_to_cpuid(int hartid)
> {
> int i = -1;
> @@ -67,6 +69,7 @@ int setup_profiling_timer(unsigned int multiplier)
> void riscv_software_interrupt(void)
> {
> unsigned long *pending_ipis = &ipi_data[smp_processor_id()].bits;
> + unsigned long *stats = ipi_data[smp_processor_id()].stats;
>
> /* Clear pending IPI */
> csr_clear(sip, SIE_SSIE);
> @@ -81,11 +84,15 @@ void riscv_software_interrupt(void)
> if (ops == 0)
> return;
>
> - if (ops & (1 << IPI_RESCHEDULE))
> + if (ops & (1 << IPI_RESCHEDULE)) {
> + stats[IPI_RESCHEDULE]++;
> scheduler_ipi();
> + }
>
> - if (ops & (1 << IPI_CALL_FUNC))
> + if (ops & (1 << IPI_CALL_FUNC)) {
> + stats[IPI_CALL_FUNC]++;
> generic_smp_call_function_interrupt();
> + }
>
> BUG_ON((ops >> IPI_MAX) != 0);
>
> @@ -111,6 +118,24 @@ send_ipi_message(const struct cpumask *to_whom, enum ipi_message_type operation)
> sbi_send_ipi(cpumask_bits(&hartid_mask));
> }
>
> +static const char *ipi_names[] = {
> + [IPI_RESCHEDULE] = "Rescheduling interrupts",
> + [IPI_CALL_FUNC] = "Function call interrupts",
> +};
> +
> +void show_ipi_stats(struct seq_file *p, int prec)
> +{
> + unsigned int cpu, i;
> +
> + for (i = 0; i < IPI_MAX; i++) {
> + seq_printf(p, "%*s%u:%s", prec - 1, "IPI", i,
> + prec >= 4 ? " " : "");
> + for_each_online_cpu(cpu)
> + seq_printf(p, "%10lu ", ipi_data[cpu].stats[i]);
> + seq_printf(p, " %s\n", ipi_names[i]);
> + }
> +}
> +
> void arch_send_call_function_ipi_mask(struct cpumask *mask)
> {
> send_ipi_message(mask, IPI_CALL_FUNC);
WARNING: multiple messages have this Message-ID (diff)
From: palmer@sifive.com (Palmer Dabbelt)
To: linux-riscv@lists.infradead.org
Subject: [PATCH v3] RISC-V: Show IPI stats
Date: Mon, 01 Oct 2018 09:42:41 -0700 (PDT) [thread overview]
Message-ID: <mhng-db76292c-f906-4cc7-abe6-de6dac888c78@palmer-si-x1c4> (raw)
In-Reply-To: <20180929062605.12888-1-anup@brainfault.org>
On Fri, 28 Sep 2018 23:26:05 PDT (-0700), anup at brainfault.org wrote:
> This patch provides arch_show_interrupts() implementation to
> show IPI stats via /proc/interrupts.
>
> Now the contents of /proc/interrupts" will look like below:
> CPU0 CPU1 CPU2 CPU3
> 8: 17 7 6 14 SiFive PLIC 8 virtio0
> 10: 10 10 9 11 SiFive PLIC 10 ttyS0
> IPI0: 170 673 251 79 Rescheduling interrupts
> IPI1: 1 12 27 1 Function call interrupts
>
> Signed-off-by: Anup Patel <anup@brainfault.org>
>
> Changes since v2:
> - Remove use of IPI_CALL_WAKEUP because it's being removed
>
> Changes since v1:
> - Add stub inline show_ipi_stats() function for !CONFIG_SMP
> - Make ipi_names[] dynamically sized at compile time
> - Minor beautification of ipi_names[] using tabs
Reviewed-by: Palmer Dabbelt <palmer@sifive.com>
This is going in through Atish's patch set.
>
> ---
> arch/riscv/include/asm/smp.h | 9 +++++++++
> arch/riscv/kernel/irq.c | 8 ++++++++
> arch/riscv/kernel/smp.c | 39 +++++++++++++++++++++++++++++-------
> 3 files changed, 49 insertions(+), 7 deletions(-)
>
> diff --git a/arch/riscv/include/asm/smp.h b/arch/riscv/include/asm/smp.h
> index fce312ce3516..5278ae8f1346 100644
> --- a/arch/riscv/include/asm/smp.h
> +++ b/arch/riscv/include/asm/smp.h
> @@ -25,8 +25,13 @@
> extern unsigned long __cpuid_to_hardid_map[NR_CPUS];
> #define cpuid_to_hardid_map(cpu) __cpuid_to_hardid_map[cpu]
>
> +struct seq_file;
> +
> #ifdef CONFIG_SMP
>
> +/* print IPI stats */
> +void show_ipi_stats(struct seq_file *p, int prec);
> +
> /* SMP initialization hook for setup_arch */
> void __init setup_smp(void);
>
> @@ -47,6 +52,10 @@ void riscv_cpuid_to_hartid_mask(const struct cpumask *in, struct cpumask *out);
>
> #else
>
> +static inline void show_ipi_stats(struct seq_file *p, int prec)
> +{
> +}
> +
> static inline int riscv_hartid_to_cpuid(int hartid)
> {
> return 0;
> diff --git a/arch/riscv/kernel/irq.c b/arch/riscv/kernel/irq.c
> index ca4593317e45..48e6b7db83a1 100644
> --- a/arch/riscv/kernel/irq.c
> +++ b/arch/riscv/kernel/irq.c
> @@ -8,6 +8,8 @@
> #include <linux/interrupt.h>
> #include <linux/irqchip.h>
> #include <linux/irqdomain.h>
> +#include <linux/seq_file.h>
> +#include <asm/smp.h>
>
> /*
> * Possible interrupt causes:
> @@ -24,6 +26,12 @@
> */
> #define INTERRUPT_CAUSE_FLAG (1UL << (__riscv_xlen - 1))
>
> +int arch_show_interrupts(struct seq_file *p, int prec)
> +{
> + show_ipi_stats(p, prec);
> + return 0;
> +}
> +
> asmlinkage void __irq_entry do_IRQ(struct pt_regs *regs)
> {
> struct pt_regs *old_regs = set_irq_regs(regs);
> diff --git a/arch/riscv/kernel/smp.c b/arch/riscv/kernel/smp.c
> index 89d95866f562..686fa7a427ff 100644
> --- a/arch/riscv/kernel/smp.c
> +++ b/arch/riscv/kernel/smp.c
> @@ -22,22 +22,24 @@
> #include <linux/interrupt.h>
> #include <linux/smp.h>
> #include <linux/sched.h>
> +#include <linux/seq_file.h>
>
> #include <asm/sbi.h>
> #include <asm/tlbflush.h>
> #include <asm/cacheflush.h>
>
> -/* A collection of single bit ipi messages. */
> -static struct {
> - unsigned long bits ____cacheline_aligned;
> -} ipi_data[NR_CPUS] __cacheline_aligned;
> -
> enum ipi_message_type {
> IPI_RESCHEDULE,
> IPI_CALL_FUNC,
> IPI_MAX
> };
>
> +/* A collection of single bit ipi messages. */
> +static struct {
> + unsigned long stats[IPI_MAX] ____cacheline_aligned;
> + unsigned long bits ____cacheline_aligned;
> +} ipi_data[NR_CPUS] __cacheline_aligned;
> +
> int riscv_hartid_to_cpuid(int hartid)
> {
> int i = -1;
> @@ -67,6 +69,7 @@ int setup_profiling_timer(unsigned int multiplier)
> void riscv_software_interrupt(void)
> {
> unsigned long *pending_ipis = &ipi_data[smp_processor_id()].bits;
> + unsigned long *stats = ipi_data[smp_processor_id()].stats;
>
> /* Clear pending IPI */
> csr_clear(sip, SIE_SSIE);
> @@ -81,11 +84,15 @@ void riscv_software_interrupt(void)
> if (ops == 0)
> return;
>
> - if (ops & (1 << IPI_RESCHEDULE))
> + if (ops & (1 << IPI_RESCHEDULE)) {
> + stats[IPI_RESCHEDULE]++;
> scheduler_ipi();
> + }
>
> - if (ops & (1 << IPI_CALL_FUNC))
> + if (ops & (1 << IPI_CALL_FUNC)) {
> + stats[IPI_CALL_FUNC]++;
> generic_smp_call_function_interrupt();
> + }
>
> BUG_ON((ops >> IPI_MAX) != 0);
>
> @@ -111,6 +118,24 @@ send_ipi_message(const struct cpumask *to_whom, enum ipi_message_type operation)
> sbi_send_ipi(cpumask_bits(&hartid_mask));
> }
>
> +static const char *ipi_names[] = {
> + [IPI_RESCHEDULE] = "Rescheduling interrupts",
> + [IPI_CALL_FUNC] = "Function call interrupts",
> +};
> +
> +void show_ipi_stats(struct seq_file *p, int prec)
> +{
> + unsigned int cpu, i;
> +
> + for (i = 0; i < IPI_MAX; i++) {
> + seq_printf(p, "%*s%u:%s", prec - 1, "IPI", i,
> + prec >= 4 ? " " : "");
> + for_each_online_cpu(cpu)
> + seq_printf(p, "%10lu ", ipi_data[cpu].stats[i]);
> + seq_printf(p, " %s\n", ipi_names[i]);
> + }
> +}
> +
> void arch_send_call_function_ipi_mask(struct cpumask *mask)
> {
> send_ipi_message(mask, IPI_CALL_FUNC);
WARNING: multiple messages have this Message-ID (diff)
From: Palmer Dabbelt <palmer@sifive.com>
To: anup@brainfault.org, Atish Patra <Atish.Patra@wdc.com>
Cc: aou@eecs.berkeley.edu, anup@brainfault.org,
linux-kernel@vger.kernel.org,
Christoph Hellwig <hch@infradead.org>,
atish.patra@wdc.com, linux-riscv@lists.infradead.org
Subject: Re: [PATCH v3] RISC-V: Show IPI stats
Date: Mon, 01 Oct 2018 09:42:41 -0700 (PDT) [thread overview]
Message-ID: <mhng-db76292c-f906-4cc7-abe6-de6dac888c78@palmer-si-x1c4> (raw)
Message-ID: <20181001164241.FuxREaY_ugrapABX5cQwVtRS4XBPp2xfn7lyzZmt8M8@z> (raw)
In-Reply-To: <20180929062605.12888-1-anup@brainfault.org>
On Fri, 28 Sep 2018 23:26:05 PDT (-0700), anup@brainfault.org wrote:
> This patch provides arch_show_interrupts() implementation to
> show IPI stats via /proc/interrupts.
>
> Now the contents of /proc/interrupts" will look like below:
> CPU0 CPU1 CPU2 CPU3
> 8: 17 7 6 14 SiFive PLIC 8 virtio0
> 10: 10 10 9 11 SiFive PLIC 10 ttyS0
> IPI0: 170 673 251 79 Rescheduling interrupts
> IPI1: 1 12 27 1 Function call interrupts
>
> Signed-off-by: Anup Patel <anup@brainfault.org>
>
> Changes since v2:
> - Remove use of IPI_CALL_WAKEUP because it's being removed
>
> Changes since v1:
> - Add stub inline show_ipi_stats() function for !CONFIG_SMP
> - Make ipi_names[] dynamically sized at compile time
> - Minor beautification of ipi_names[] using tabs
Reviewed-by: Palmer Dabbelt <palmer@sifive.com>
This is going in through Atish's patch set.
>
> ---
> arch/riscv/include/asm/smp.h | 9 +++++++++
> arch/riscv/kernel/irq.c | 8 ++++++++
> arch/riscv/kernel/smp.c | 39 +++++++++++++++++++++++++++++-------
> 3 files changed, 49 insertions(+), 7 deletions(-)
>
> diff --git a/arch/riscv/include/asm/smp.h b/arch/riscv/include/asm/smp.h
> index fce312ce3516..5278ae8f1346 100644
> --- a/arch/riscv/include/asm/smp.h
> +++ b/arch/riscv/include/asm/smp.h
> @@ -25,8 +25,13 @@
> extern unsigned long __cpuid_to_hardid_map[NR_CPUS];
> #define cpuid_to_hardid_map(cpu) __cpuid_to_hardid_map[cpu]
>
> +struct seq_file;
> +
> #ifdef CONFIG_SMP
>
> +/* print IPI stats */
> +void show_ipi_stats(struct seq_file *p, int prec);
> +
> /* SMP initialization hook for setup_arch */
> void __init setup_smp(void);
>
> @@ -47,6 +52,10 @@ void riscv_cpuid_to_hartid_mask(const struct cpumask *in, struct cpumask *out);
>
> #else
>
> +static inline void show_ipi_stats(struct seq_file *p, int prec)
> +{
> +}
> +
> static inline int riscv_hartid_to_cpuid(int hartid)
> {
> return 0;
> diff --git a/arch/riscv/kernel/irq.c b/arch/riscv/kernel/irq.c
> index ca4593317e45..48e6b7db83a1 100644
> --- a/arch/riscv/kernel/irq.c
> +++ b/arch/riscv/kernel/irq.c
> @@ -8,6 +8,8 @@
> #include <linux/interrupt.h>
> #include <linux/irqchip.h>
> #include <linux/irqdomain.h>
> +#include <linux/seq_file.h>
> +#include <asm/smp.h>
>
> /*
> * Possible interrupt causes:
> @@ -24,6 +26,12 @@
> */
> #define INTERRUPT_CAUSE_FLAG (1UL << (__riscv_xlen - 1))
>
> +int arch_show_interrupts(struct seq_file *p, int prec)
> +{
> + show_ipi_stats(p, prec);
> + return 0;
> +}
> +
> asmlinkage void __irq_entry do_IRQ(struct pt_regs *regs)
> {
> struct pt_regs *old_regs = set_irq_regs(regs);
> diff --git a/arch/riscv/kernel/smp.c b/arch/riscv/kernel/smp.c
> index 89d95866f562..686fa7a427ff 100644
> --- a/arch/riscv/kernel/smp.c
> +++ b/arch/riscv/kernel/smp.c
> @@ -22,22 +22,24 @@
> #include <linux/interrupt.h>
> #include <linux/smp.h>
> #include <linux/sched.h>
> +#include <linux/seq_file.h>
>
> #include <asm/sbi.h>
> #include <asm/tlbflush.h>
> #include <asm/cacheflush.h>
>
> -/* A collection of single bit ipi messages. */
> -static struct {
> - unsigned long bits ____cacheline_aligned;
> -} ipi_data[NR_CPUS] __cacheline_aligned;
> -
> enum ipi_message_type {
> IPI_RESCHEDULE,
> IPI_CALL_FUNC,
> IPI_MAX
> };
>
> +/* A collection of single bit ipi messages. */
> +static struct {
> + unsigned long stats[IPI_MAX] ____cacheline_aligned;
> + unsigned long bits ____cacheline_aligned;
> +} ipi_data[NR_CPUS] __cacheline_aligned;
> +
> int riscv_hartid_to_cpuid(int hartid)
> {
> int i = -1;
> @@ -67,6 +69,7 @@ int setup_profiling_timer(unsigned int multiplier)
> void riscv_software_interrupt(void)
> {
> unsigned long *pending_ipis = &ipi_data[smp_processor_id()].bits;
> + unsigned long *stats = ipi_data[smp_processor_id()].stats;
>
> /* Clear pending IPI */
> csr_clear(sip, SIE_SSIE);
> @@ -81,11 +84,15 @@ void riscv_software_interrupt(void)
> if (ops == 0)
> return;
>
> - if (ops & (1 << IPI_RESCHEDULE))
> + if (ops & (1 << IPI_RESCHEDULE)) {
> + stats[IPI_RESCHEDULE]++;
> scheduler_ipi();
> + }
>
> - if (ops & (1 << IPI_CALL_FUNC))
> + if (ops & (1 << IPI_CALL_FUNC)) {
> + stats[IPI_CALL_FUNC]++;
> generic_smp_call_function_interrupt();
> + }
>
> BUG_ON((ops >> IPI_MAX) != 0);
>
> @@ -111,6 +118,24 @@ send_ipi_message(const struct cpumask *to_whom, enum ipi_message_type operation)
> sbi_send_ipi(cpumask_bits(&hartid_mask));
> }
>
> +static const char *ipi_names[] = {
> + [IPI_RESCHEDULE] = "Rescheduling interrupts",
> + [IPI_CALL_FUNC] = "Function call interrupts",
> +};
> +
> +void show_ipi_stats(struct seq_file *p, int prec)
> +{
> + unsigned int cpu, i;
> +
> + for (i = 0; i < IPI_MAX; i++) {
> + seq_printf(p, "%*s%u:%s", prec - 1, "IPI", i,
> + prec >= 4 ? " " : "");
> + for_each_online_cpu(cpu)
> + seq_printf(p, "%10lu ", ipi_data[cpu].stats[i]);
> + seq_printf(p, " %s\n", ipi_names[i]);
> + }
> +}
> +
> void arch_send_call_function_ipi_mask(struct cpumask *mask)
> {
> send_ipi_message(mask, IPI_CALL_FUNC);
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
next prev parent reply other threads:[~2018-10-01 16:42 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-29 6:26 [PATCH v3] RISC-V: Show IPI stats Anup Patel
2018-09-29 6:26 ` Anup Patel
2018-09-29 6:26 ` Anup Patel
2018-10-01 16:42 ` Palmer Dabbelt [this message]
2018-10-01 16:42 ` Palmer Dabbelt
2018-10-01 16:42 ` Palmer Dabbelt
2018-10-02 19:17 ` Atish Patra
2018-10-02 19:17 ` Atish Patra
2018-10-02 19:17 ` Atish Patra
2018-10-02 3:15 ` Atish Patra
2018-10-02 3:15 ` Atish Patra
2018-10-02 3:15 ` Atish Patra
2018-10-02 3:28 ` Anup Patel
2018-10-02 3:28 ` Anup Patel
2018-10-02 3:28 ` Anup Patel
2018-10-02 19:18 ` Atish Patra
2018-10-02 19:18 ` Atish Patra
2018-10-02 19:18 ` Atish Patra
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=mhng-db76292c-f906-4cc7-abe6-de6dac888c78@palmer-si-x1c4 \
--to=palmer@sifive.com \
--cc=Atish.Patra@wdc.com \
--cc=anup@brainfault.org \
--cc=aou@eecs.berkeley.edu \
--cc=hch@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.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.