diff mbox series

KVM: PPC: powerpc: Add count cache flush parameters to kvmppc_get_cpu_char()

Message ID 20190301032516.29919-1-sjitindarsingh@gmail.com
State Accepted
Headers show
Series KVM: PPC: powerpc: Add count cache flush parameters to kvmppc_get_cpu_char() | expand

Commit Message

Suraj Jitindar Singh March 1, 2019, 3:25 a.m. UTC
Add KVM_PPC_CPU_CHAR_BCCTR_FLUSH_ASSIST &
KVM_PPC_CPU_BEHAV_FLUSH_COUNT_CACHE to the characteristics returned from
the H_GET_CPU_CHARACTERISTICS H-CALL, as queried from either the
hypervisor or the device tree.

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
---
 arch/powerpc/include/uapi/asm/kvm.h |  2 ++
 arch/powerpc/kvm/powerpc.c          | 18 ++++++++++++++----
 2 files changed, 16 insertions(+), 4 deletions(-)

Comments

Michael Ellerman March 1, 2019, 6:52 a.m. UTC | #1
Suraj Jitindar Singh <sjitindarsingh@gmail.com> writes:

> Add KVM_PPC_CPU_CHAR_BCCTR_FLUSH_ASSIST &
> KVM_PPC_CPU_BEHAV_FLUSH_COUNT_CACHE to the characteristics returned from
> the H_GET_CPU_CHARACTERISTICS H-CALL, as queried from either the
> hypervisor or the device tree.
>
> Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
> ---
>  arch/powerpc/include/uapi/asm/kvm.h |  2 ++
>  arch/powerpc/kvm/powerpc.c          | 18 ++++++++++++++----
>  2 files changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
> index b90a7d154180..a99dcac91e50 100644
> --- a/arch/powerpc/kvm/powerpc.c
> +++ b/arch/powerpc/kvm/powerpc.c
> @@ -2251,12 +2253,16 @@ static int kvmppc_get_cpu_char(struct kvm_ppc_cpu_char *cp)
>  		if (have_fw_feat(fw_features, "enabled",
>  				 "fw-count-cache-disabled"))
>  			cp->character |= KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS;
> +		if (have_fw_feat(fw_features, "enabled",
> +				 "fw-count-cache-flush-bcctr2,0,0"))

I don't think there's any reason KVM needs to be querying the device
tree directly, is there?

Can't it just use the security flags (security_features.h), that are
initialised by the powernv platform code based on the device tree.

I seem to remember we didn't do it that way originally just because we
didn't have time to get everything lined up.

cheers
Paul Mackerras March 1, 2019, 8:01 a.m. UTC | #2
On Fri, Mar 01, 2019 at 05:52:51PM +1100, Michael Ellerman wrote:
> Suraj Jitindar Singh <sjitindarsingh@gmail.com> writes:
> 
> > Add KVM_PPC_CPU_CHAR_BCCTR_FLUSH_ASSIST &
> > KVM_PPC_CPU_BEHAV_FLUSH_COUNT_CACHE to the characteristics returned from
> > the H_GET_CPU_CHARACTERISTICS H-CALL, as queried from either the
> > hypervisor or the device tree.
> >
> > Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
> > ---
> >  arch/powerpc/include/uapi/asm/kvm.h |  2 ++
> >  arch/powerpc/kvm/powerpc.c          | 18 ++++++++++++++----
> >  2 files changed, 16 insertions(+), 4 deletions(-)
> >
> > diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
> > index b90a7d154180..a99dcac91e50 100644
> > --- a/arch/powerpc/kvm/powerpc.c
> > +++ b/arch/powerpc/kvm/powerpc.c
> > @@ -2251,12 +2253,16 @@ static int kvmppc_get_cpu_char(struct kvm_ppc_cpu_char *cp)
> >  		if (have_fw_feat(fw_features, "enabled",
> >  				 "fw-count-cache-disabled"))
> >  			cp->character |= KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS;
> > +		if (have_fw_feat(fw_features, "enabled",
> > +				 "fw-count-cache-flush-bcctr2,0,0"))
> 
> I don't think there's any reason KVM needs to be querying the device
> tree directly, is there?
> 
> Can't it just use the security flags (security_features.h), that are
> initialised by the powernv platform code based on the device tree.

My recollection is that the security flags didn't have all the
information we need.  It's possible that's no longer true.

I merged the patch and sent a pull request to Paolo; using the same
pattern as the existing code made it a low-risk patch and I wanted to
get it in for 5.1.  For 5.2 we can look at changing it over if you
like.

Paul.
Michael Ellerman March 3, 2019, 9:06 a.m. UTC | #3
Paul Mackerras <paulus@ozlabs.org> writes:

> On Fri, Mar 01, 2019 at 05:52:51PM +1100, Michael Ellerman wrote:
>> Suraj Jitindar Singh <sjitindarsingh@gmail.com> writes:
>> 
>> > Add KVM_PPC_CPU_CHAR_BCCTR_FLUSH_ASSIST &
>> > KVM_PPC_CPU_BEHAV_FLUSH_COUNT_CACHE to the characteristics returned from
>> > the H_GET_CPU_CHARACTERISTICS H-CALL, as queried from either the
>> > hypervisor or the device tree.
>> >
>> > Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
>> > ---
>> >  arch/powerpc/include/uapi/asm/kvm.h |  2 ++
>> >  arch/powerpc/kvm/powerpc.c          | 18 ++++++++++++++----
>> >  2 files changed, 16 insertions(+), 4 deletions(-)
>> >
>> > diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
>> > index b90a7d154180..a99dcac91e50 100644
>> > --- a/arch/powerpc/kvm/powerpc.c
>> > +++ b/arch/powerpc/kvm/powerpc.c
>> > @@ -2251,12 +2253,16 @@ static int kvmppc_get_cpu_char(struct kvm_ppc_cpu_char *cp)
>> >  		if (have_fw_feat(fw_features, "enabled",
>> >  				 "fw-count-cache-disabled"))
>> >  			cp->character |= KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS;
>> > +		if (have_fw_feat(fw_features, "enabled",
>> > +				 "fw-count-cache-flush-bcctr2,0,0"))
>> 
>> I don't think there's any reason KVM needs to be querying the device
>> tree directly, is there?
>> 
>> Can't it just use the security flags (security_features.h), that are
>> initialised by the powernv platform code based on the device tree.
>
> My recollection is that the security flags didn't have all the
> information we need.  It's possible that's no longer true.

Actually I don't think they existed at all back then, we didn't add them
until after the initial panic.

> I merged the patch and sent a pull request to Paolo; using the same
> pattern as the existing code made it a low-risk patch and I wanted to
> get it in for 5.1.  For 5.2 we can look at changing it over if you
> like.

Yep that's fine.

cheers
diff mbox series

Patch

diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h
index 8c876c166ef2..26ca425f4c2c 100644
--- a/arch/powerpc/include/uapi/asm/kvm.h
+++ b/arch/powerpc/include/uapi/asm/kvm.h
@@ -463,10 +463,12 @@  struct kvm_ppc_cpu_char {
 #define KVM_PPC_CPU_CHAR_BR_HINT_HONOURED	(1ULL << 58)
 #define KVM_PPC_CPU_CHAR_MTTRIG_THR_RECONF	(1ULL << 57)
 #define KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS	(1ULL << 56)
+#define KVM_PPC_CPU_CHAR_BCCTR_FLUSH_ASSIST	(1ull << 54)
 
 #define KVM_PPC_CPU_BEHAV_FAVOUR_SECURITY	(1ULL << 63)
 #define KVM_PPC_CPU_BEHAV_L1D_FLUSH_PR		(1ULL << 62)
 #define KVM_PPC_CPU_BEHAV_BNDS_CHK_SPEC_BAR	(1ULL << 61)
+#define KVM_PPC_CPU_BEHAV_FLUSH_COUNT_CACHE	(1ull << 58)
 
 /* Per-vcpu XICS interrupt controller state */
 #define KVM_REG_PPC_ICP_STATE	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x8c)
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index b90a7d154180..a99dcac91e50 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -2189,10 +2189,12 @@  static int pseries_get_cpu_char(struct kvm_ppc_cpu_char *cp)
 			KVM_PPC_CPU_CHAR_L1D_THREAD_PRIV |
 			KVM_PPC_CPU_CHAR_BR_HINT_HONOURED |
 			KVM_PPC_CPU_CHAR_MTTRIG_THR_RECONF |
-			KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS;
+			KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS |
+			KVM_PPC_CPU_CHAR_BCCTR_FLUSH_ASSIST;
 		cp->behaviour_mask = KVM_PPC_CPU_BEHAV_FAVOUR_SECURITY |
 			KVM_PPC_CPU_BEHAV_L1D_FLUSH_PR |
-			KVM_PPC_CPU_BEHAV_BNDS_CHK_SPEC_BAR;
+			KVM_PPC_CPU_BEHAV_BNDS_CHK_SPEC_BAR |
+			KVM_PPC_CPU_BEHAV_FLUSH_COUNT_CACHE;
 	}
 	return 0;
 }
@@ -2251,12 +2253,16 @@  static int kvmppc_get_cpu_char(struct kvm_ppc_cpu_char *cp)
 		if (have_fw_feat(fw_features, "enabled",
 				 "fw-count-cache-disabled"))
 			cp->character |= KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS;
+		if (have_fw_feat(fw_features, "enabled",
+				 "fw-count-cache-flush-bcctr2,0,0"))
+			cp->character |= KVM_PPC_CPU_CHAR_BCCTR_FLUSH_ASSIST;
 		cp->character_mask = KVM_PPC_CPU_CHAR_SPEC_BAR_ORI31 |
 			KVM_PPC_CPU_CHAR_BCCTRL_SERIALISED |
 			KVM_PPC_CPU_CHAR_L1D_FLUSH_ORI30 |
 			KVM_PPC_CPU_CHAR_L1D_FLUSH_TRIG2 |
 			KVM_PPC_CPU_CHAR_L1D_THREAD_PRIV |
-			KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS;
+			KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS |
+			KVM_PPC_CPU_CHAR_BCCTR_FLUSH_ASSIST;
 
 		if (have_fw_feat(fw_features, "enabled",
 				 "speculation-policy-favor-security"))
@@ -2267,9 +2273,13 @@  static int kvmppc_get_cpu_char(struct kvm_ppc_cpu_char *cp)
 		if (!have_fw_feat(fw_features, "disabled",
 				  "needs-spec-barrier-for-bound-checks"))
 			cp->behaviour |= KVM_PPC_CPU_BEHAV_BNDS_CHK_SPEC_BAR;
+		if (have_fw_feat(fw_features, "enabled",
+				 "needs-count-cache-flush-on-context-switch"))
+			cp->behaviour |= KVM_PPC_CPU_BEHAV_FLUSH_COUNT_CACHE;
 		cp->behaviour_mask = KVM_PPC_CPU_BEHAV_FAVOUR_SECURITY |
 			KVM_PPC_CPU_BEHAV_L1D_FLUSH_PR |
-			KVM_PPC_CPU_BEHAV_BNDS_CHK_SPEC_BAR;
+			KVM_PPC_CPU_BEHAV_BNDS_CHK_SPEC_BAR |
+			KVM_PPC_CPU_BEHAV_FLUSH_COUNT_CACHE;
 
 		of_node_put(fw_features);
 	}