All of lore.kernel.org
 help / color / mirror / Atom feed
From: Atish Patra <atish.patra@wdc.com>
To: Anup Patel <anup@brainfault.org>
Cc: Palmer Dabbelt <palmer@sifive.com>,
	Albert Ou <aou@eecs.berkeley.edu>,
	Christoph Hellwig <hch@infradead.org>,
	"linux-riscv@lists.infradead.org"
	<linux-riscv@lists.infradead.org>,
	"linux-kernel@vger.kernel.org List"
	<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v3] RISC-V: Show IPI stats
Date: Tue, 2 Oct 2018 12:18:01 -0700	[thread overview]
Message-ID: <54503b86-cb77-9eaf-6bd9-5e8caa2ebb78@wdc.com> (raw)
In-Reply-To: <CAAhSdy1DQFNEvW2Nr6g5mv9y_+GrhFL4nVxOROwGwGcqsHhqtg@mail.gmail.com>

On 10/1/18 8:29 PM, Anup Patel wrote:
> On Tue, Oct 2, 2018 at 8:45 AM Atish Patra <atish.patra@wdc.com> wrote:
>>
>> On 9/28/18 11:26 PM, Anup Patel 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
>>>
>>> ---
>>>    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);
>>>
>> some checkpatch errors.
>>
>> patches/smp_cleanup/0014-RISC-V-Show-IPI-stats.patch
>> ----------------------------------------------------
>> WARNING: Missing a blank line after declarations
>> #115: FILE: arch/riscv/kernel/smp.c:40:
>> +       unsigned long stats[IPI_MAX] ____cacheline_aligned;
>> +       unsigned long bits ____cacheline_aligned;
> 
> This was already there in existing code.
> 
>>
>> WARNING: usage of NR_CPUS is often wrong - consider using
>> cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc
>> #116: FILE: arch/riscv/kernel/smp.c:41:
>> +} ipi_data[NR_CPUS] __cacheline_aligned;
> 
> Even this was already there in existing code.
> 
>>
>> WARNING: static const char * array should probably be static const char
>> * const
>> #151: FILE: arch/riscv/kernel/smp.c:121:
>> +static const char *ipi_names[] = {
>>
>> total: 0 errors, 3 warnings, 120 lines checked
>>
>> Let me know if they were ignored on purpose.
>>
> 
> Yes, this one was added by this patch.
> 
> Do you want me to send revised patch?
> 

Nope. That's just a one line fix. I fixed it and submitted the patch as 
part of my v6.

I will send a separate patch fix for the patch errors introduced by the 
existing code as the fix was bit involved.

Regards,
Atish
> Regards,
> Anup
> 


Regards,
Atish

WARNING: multiple messages have this Message-ID (diff)
From: atish.patra@wdc.com (Atish Patra)
To: linux-riscv@lists.infradead.org
Subject: [PATCH v3] RISC-V: Show IPI stats
Date: Tue, 2 Oct 2018 12:18:01 -0700	[thread overview]
Message-ID: <54503b86-cb77-9eaf-6bd9-5e8caa2ebb78@wdc.com> (raw)
In-Reply-To: <CAAhSdy1DQFNEvW2Nr6g5mv9y_+GrhFL4nVxOROwGwGcqsHhqtg@mail.gmail.com>

On 10/1/18 8:29 PM, Anup Patel wrote:
> On Tue, Oct 2, 2018 at 8:45 AM Atish Patra <atish.patra@wdc.com> wrote:
>>
>> On 9/28/18 11:26 PM, Anup Patel 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
>>>
>>> ---
>>>    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);
>>>
>> some checkpatch errors.
>>
>> patches/smp_cleanup/0014-RISC-V-Show-IPI-stats.patch
>> ----------------------------------------------------
>> WARNING: Missing a blank line after declarations
>> #115: FILE: arch/riscv/kernel/smp.c:40:
>> +       unsigned long stats[IPI_MAX] ____cacheline_aligned;
>> +       unsigned long bits ____cacheline_aligned;
> 
> This was already there in existing code.
> 
>>
>> WARNING: usage of NR_CPUS is often wrong - consider using
>> cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc
>> #116: FILE: arch/riscv/kernel/smp.c:41:
>> +} ipi_data[NR_CPUS] __cacheline_aligned;
> 
> Even this was already there in existing code.
> 
>>
>> WARNING: static const char * array should probably be static const char
>> * const
>> #151: FILE: arch/riscv/kernel/smp.c:121:
>> +static const char *ipi_names[] = {
>>
>> total: 0 errors, 3 warnings, 120 lines checked
>>
>> Let me know if they were ignored on purpose.
>>
> 
> Yes, this one was added by this patch.
> 
> Do you want me to send revised patch?
> 

Nope. That's just a one line fix. I fixed it and submitted the patch as 
part of my v6.

I will send a separate patch fix for the patch errors introduced by the 
existing code as the fix was bit involved.

Regards,
Atish
> Regards,
> Anup
> 


Regards,
Atish

WARNING: multiple messages have this Message-ID (diff)
From: Atish Patra <atish.patra@wdc.com>
To: Anup Patel <anup@brainfault.org>
Cc: Christoph Hellwig <hch@infradead.org>,
	"linux-riscv@lists.infradead.org"
	<linux-riscv@lists.infradead.org>,
	Palmer Dabbelt <palmer@sifive.com>,
	"linux-kernel@vger.kernel.org List"
	<linux-kernel@vger.kernel.org>, Albert Ou <aou@eecs.berkeley.edu>
Subject: Re: [PATCH v3] RISC-V: Show IPI stats
Date: Tue, 2 Oct 2018 12:18:01 -0700	[thread overview]
Message-ID: <54503b86-cb77-9eaf-6bd9-5e8caa2ebb78@wdc.com> (raw)
Message-ID: <20181002191801.pssqvjSM42oFIp1nxfsXl6MH0QCatvHZWRxkMDdjTDA@z> (raw)
In-Reply-To: <CAAhSdy1DQFNEvW2Nr6g5mv9y_+GrhFL4nVxOROwGwGcqsHhqtg@mail.gmail.com>

On 10/1/18 8:29 PM, Anup Patel wrote:
> On Tue, Oct 2, 2018 at 8:45 AM Atish Patra <atish.patra@wdc.com> wrote:
>>
>> On 9/28/18 11:26 PM, Anup Patel 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
>>>
>>> ---
>>>    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);
>>>
>> some checkpatch errors.
>>
>> patches/smp_cleanup/0014-RISC-V-Show-IPI-stats.patch
>> ----------------------------------------------------
>> WARNING: Missing a blank line after declarations
>> #115: FILE: arch/riscv/kernel/smp.c:40:
>> +       unsigned long stats[IPI_MAX] ____cacheline_aligned;
>> +       unsigned long bits ____cacheline_aligned;
> 
> This was already there in existing code.
> 
>>
>> WARNING: usage of NR_CPUS is often wrong - consider using
>> cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc
>> #116: FILE: arch/riscv/kernel/smp.c:41:
>> +} ipi_data[NR_CPUS] __cacheline_aligned;
> 
> Even this was already there in existing code.
> 
>>
>> WARNING: static const char * array should probably be static const char
>> * const
>> #151: FILE: arch/riscv/kernel/smp.c:121:
>> +static const char *ipi_names[] = {
>>
>> total: 0 errors, 3 warnings, 120 lines checked
>>
>> Let me know if they were ignored on purpose.
>>
> 
> Yes, this one was added by this patch.
> 
> Do you want me to send revised patch?
> 

Nope. That's just a one line fix. I fixed it and submitted the patch as 
part of my v6.

I will send a separate patch fix for the patch errors introduced by the 
existing code as the fix was bit involved.

Regards,
Atish
> Regards,
> Anup
> 


Regards,
Atish

_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv

  reply	other threads:[~2018-10-02 19:18 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
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 [this message]
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=54503b86-cb77-9eaf-6bd9-5e8caa2ebb78@wdc.com \
    --to=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 \
    --cc=palmer@sifive.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.