2020-04-01 06:14:49

by Ravi Bangoria

[permalink] [raw]
Subject: [PATCH v2 03/16] powerpc/watchpoint: Introduce function to get nr watchpoints dynamically

So far we had only one watchpoint, so we have hardcoded HBP_NUM to 1.
But future Power architecture is introducing 2nd DAWR and thus kernel
should be able to dynamically find actual number of watchpoints
supported by hw it's running on. Introduce function for the same.
Also convert HBP_NUM macro to HBP_NUM_MAX, which will now represent
maximum number of watchpoints supported by Powerpc.

Signed-off-by: Ravi Bangoria <[email protected]>
---
arch/powerpc/include/asm/cputable.h | 6 +++++-
arch/powerpc/include/asm/hw_breakpoint.h | 5 +++++
arch/powerpc/include/asm/processor.h | 2 +-
arch/powerpc/kernel/hw_breakpoint.c | 2 +-
4 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h
index 40a4d3c6fd99..c67b94f3334c 100644
--- a/arch/powerpc/include/asm/cputable.h
+++ b/arch/powerpc/include/asm/cputable.h
@@ -614,7 +614,11 @@ enum {
};
#endif /* __powerpc64__ */

-#define HBP_NUM 1
+/*
+ * Maximum number of hw breakpoint supported on powerpc. Number of
+ * breakpoints supported by actual hw might be less than this.
+ */
+#define HBP_NUM_MAX 1

#endif /* !__ASSEMBLY__ */

diff --git a/arch/powerpc/include/asm/hw_breakpoint.h b/arch/powerpc/include/asm/hw_breakpoint.h
index f2f8d8aa8e3b..518b41eef924 100644
--- a/arch/powerpc/include/asm/hw_breakpoint.h
+++ b/arch/powerpc/include/asm/hw_breakpoint.h
@@ -43,6 +43,11 @@ struct arch_hw_breakpoint {
#define DABR_MAX_LEN 8
#define DAWR_MAX_LEN 512

+static inline int nr_wp_slots(void)
+{
+ return HBP_NUM_MAX;
+}
+
#ifdef CONFIG_HAVE_HW_BREAKPOINT
#include <linux/kdebug.h>
#include <asm/reg.h>
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
index eedcbfb9a6ff..90f6dbc7ff00 100644
--- a/arch/powerpc/include/asm/processor.h
+++ b/arch/powerpc/include/asm/processor.h
@@ -180,7 +180,7 @@ struct thread_struct {
int fpexc_mode; /* floating-point exception mode */
unsigned int align_ctl; /* alignment handling control */
#ifdef CONFIG_HAVE_HW_BREAKPOINT
- struct perf_event *ptrace_bps[HBP_NUM];
+ struct perf_event *ptrace_bps[HBP_NUM_MAX];
/*
* Helps identify source of single-step exception and subsequent
* hw-breakpoint enablement
diff --git a/arch/powerpc/kernel/hw_breakpoint.c b/arch/powerpc/kernel/hw_breakpoint.c
index 72f461bd70fb..4120349e2abe 100644
--- a/arch/powerpc/kernel/hw_breakpoint.c
+++ b/arch/powerpc/kernel/hw_breakpoint.c
@@ -38,7 +38,7 @@ static DEFINE_PER_CPU(struct perf_event *, bp_per_reg);
int hw_breakpoint_slots(int type)
{
if (type == TYPE_DATA)
- return HBP_NUM;
+ return nr_wp_slots();
return 0; /* no instruction breakpoints available */
}

--
2.21.1


2020-04-01 06:45:01

by Christophe Leroy

[permalink] [raw]
Subject: Re: [PATCH v2 03/16] powerpc/watchpoint: Introduce function to get nr watchpoints dynamically



Le 01/04/2020 à 08:12, Ravi Bangoria a écrit :
> So far we had only one watchpoint, so we have hardcoded HBP_NUM to 1.
> But future Power architecture is introducing 2nd DAWR and thus kernel
> should be able to dynamically find actual number of watchpoints
> supported by hw it's running on. Introduce function for the same.
> Also convert HBP_NUM macro to HBP_NUM_MAX, which will now represent
> maximum number of watchpoints supported by Powerpc.


Everywhere else in the code, it is called 'breakpoint', not 'watchpoint'.

Wouldn't it be more consistent to call the function nr_bp_slots()
instead of nr_wp_slots() ?

Especially as we are likely going to extend your changes to support
DABR2 in addition to DABR on BOOK3S/32.

Christophe

>
> Signed-off-by: Ravi Bangoria <[email protected]>
> ---
> arch/powerpc/include/asm/cputable.h | 6 +++++-
> arch/powerpc/include/asm/hw_breakpoint.h | 5 +++++
> arch/powerpc/include/asm/processor.h | 2 +-
> arch/powerpc/kernel/hw_breakpoint.c | 2 +-
> 4 files changed, 12 insertions(+), 3 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h
> index 40a4d3c6fd99..c67b94f3334c 100644
> --- a/arch/powerpc/include/asm/cputable.h
> +++ b/arch/powerpc/include/asm/cputable.h
> @@ -614,7 +614,11 @@ enum {
> };
> #endif /* __powerpc64__ */
>
> -#define HBP_NUM 1
> +/*
> + * Maximum number of hw breakpoint supported on powerpc. Number of
> + * breakpoints supported by actual hw might be less than this.
> + */
> +#define HBP_NUM_MAX 1
>
> #endif /* !__ASSEMBLY__ */
>
> diff --git a/arch/powerpc/include/asm/hw_breakpoint.h b/arch/powerpc/include/asm/hw_breakpoint.h
> index f2f8d8aa8e3b..518b41eef924 100644
> --- a/arch/powerpc/include/asm/hw_breakpoint.h
> +++ b/arch/powerpc/include/asm/hw_breakpoint.h
> @@ -43,6 +43,11 @@ struct arch_hw_breakpoint {
> #define DABR_MAX_LEN 8
> #define DAWR_MAX_LEN 512
>
> +static inline int nr_wp_slots(void)
> +{
> + return HBP_NUM_MAX;
> +}
> +
> #ifdef CONFIG_HAVE_HW_BREAKPOINT
> #include <linux/kdebug.h>
> #include <asm/reg.h>
> diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
> index eedcbfb9a6ff..90f6dbc7ff00 100644
> --- a/arch/powerpc/include/asm/processor.h
> +++ b/arch/powerpc/include/asm/processor.h
> @@ -180,7 +180,7 @@ struct thread_struct {
> int fpexc_mode; /* floating-point exception mode */
> unsigned int align_ctl; /* alignment handling control */
> #ifdef CONFIG_HAVE_HW_BREAKPOINT
> - struct perf_event *ptrace_bps[HBP_NUM];
> + struct perf_event *ptrace_bps[HBP_NUM_MAX];
> /*
> * Helps identify source of single-step exception and subsequent
> * hw-breakpoint enablement
> diff --git a/arch/powerpc/kernel/hw_breakpoint.c b/arch/powerpc/kernel/hw_breakpoint.c
> index 72f461bd70fb..4120349e2abe 100644
> --- a/arch/powerpc/kernel/hw_breakpoint.c
> +++ b/arch/powerpc/kernel/hw_breakpoint.c
> @@ -38,7 +38,7 @@ static DEFINE_PER_CPU(struct perf_event *, bp_per_reg);
> int hw_breakpoint_slots(int type)
> {
> if (type == TYPE_DATA)
> - return HBP_NUM;
> + return nr_wp_slots();
> return 0; /* no instruction breakpoints available */
> }
>
>

2020-04-01 06:52:26

by Ravi Bangoria

[permalink] [raw]
Subject: Re: [PATCH v2 03/16] powerpc/watchpoint: Introduce function to get nr watchpoints dynamically



On 4/1/20 11:59 AM, Christophe Leroy wrote:
>
>
> Le 01/04/2020 à 08:12, Ravi Bangoria a écrit :
>> So far we had only one watchpoint, so we have hardcoded HBP_NUM to 1.
>> But future Power architecture is introducing 2nd DAWR and thus kernel
>> should be able to dynamically find actual number of watchpoints
>> supported by hw it's running on. Introduce function for the same.
>> Also convert HBP_NUM macro to HBP_NUM_MAX, which will now represent
>> maximum number of watchpoints supported by Powerpc.
>
>
> Everywhere else in the code, it is called 'breakpoint', not 'watchpoint'.
>
> Wouldn't it be more consistent to call the function nr_bp_slots() instead of nr_wp_slots() ?
>
> Especially as we are likely going to extend your changes to support DABR2 in addition to DABR on BOOK3S/32.

Sure. I don't have strong onion for nr_wp_slots() and I can rename it to
nr_bp_slots(). but...

Even though existing code uses breakpoint and watchpoint interchangeably,
I'm using wp/watchpoint to represent data-breakpoint, to distinguish it
from instruction-breakpoint (CIABR). So IMHO, nr_wp_slots() should return
number DAWRs/DABRs and nr_bp_slots() should return number of CIABRs. Is
that okay?

Ravi

2020-04-01 07:08:11

by Christophe Leroy

[permalink] [raw]
Subject: Re: [PATCH v2 03/16] powerpc/watchpoint: Introduce function to get nr watchpoints dynamically



Le 01/04/2020 à 08:50, Ravi Bangoria a écrit :
>
>
> On 4/1/20 11:59 AM, Christophe Leroy wrote:
>>
>>
>> Le 01/04/2020 à 08:12, Ravi Bangoria a écrit :
>>> So far we had only one watchpoint, so we have hardcoded HBP_NUM to 1.
>>> But future Power architecture is introducing 2nd DAWR and thus kernel
>>> should be able to dynamically find actual number of watchpoints
>>> supported by hw it's running on. Introduce function for the same.
>>> Also convert HBP_NUM macro to HBP_NUM_MAX, which will now represent
>>> maximum number of watchpoints supported by Powerpc.
>>
>>
>> Everywhere else in the code, it is called 'breakpoint', not 'watchpoint'.
>>
>> Wouldn't it be more consistent to call the function nr_bp_slots()
>> instead of nr_wp_slots() ?
>>
>> Especially as we are likely going to extend your changes to support
>> DABR2 in addition to DABR on BOOK3S/32.
>
> Sure. I don't have strong onion for nr_wp_slots() and I can rename it to
> nr_bp_slots(). but...
>
> Even though existing code uses breakpoint and watchpoint interchangeably,
> I'm using wp/watchpoint to represent data-breakpoint, to distinguish it
> from instruction-breakpoint (CIABR). So IMHO, nr_wp_slots() should return
> number DAWRs/DABRs and nr_bp_slots() should return number of CIABRs. Is
> that okay?
>


Yes that makes sense too. Up to you.

Christophe