Thread (127 messages) 127 messages, 11 authors, 2017-12-06
STALE3108d

[PATCH 09/37] KVM: arm64: Move debug dirty flag calculation out of world switch

From: Andrew Jones <hidden>
Date: 2017-12-03 13:17:13
Also in: kvm, kvmarm

On Fri, Dec 01, 2017 at 06:25:46PM +0100, Christoffer Dall wrote:
On Tue, Nov 07, 2017 at 03:09:19PM +0100, Andrew Jones wrote:
quoted
On Thu, Oct 12, 2017 at 12:41:13PM +0200, Christoffer Dall wrote:
quoted
There is no need to figure out inside the world-switch if we should
save/restore the debug registers or not, we can might as well do that in
the higher level debug setup code, making it easier to optimize down the
line.

Signed-off-by: Christoffer Dall <redacted>
---
 arch/arm64/kvm/debug.c        | 9 +++++++++
 arch/arm64/kvm/hyp/debug-sr.c | 6 ------
 2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c
index dbadfaf..62550de19 100644
--- a/arch/arm64/kvm/debug.c
+++ b/arch/arm64/kvm/debug.c
@@ -193,6 +193,15 @@ void kvm_arm_setup_debug(struct kvm_vcpu *vcpu)
 	if (trap_debug)
 		vcpu->arch.mdcr_el2 |= MDCR_EL2_TDA;
 
+	/*
+	 * If any of KDE, MDE or KVM_ARM64_DEBUG_DIRTY is set, perform
+	 * a full save/restore cycle.
The commit message implies testing KVM_ARM64_DEBUG_DIRTY, but it only
tests KDE and MDE.
You meant the comment, right?
yup
quoted
quoted
+	 */
+	if ((vcpu_sys_reg(vcpu, MDSCR_EL1) & DBG_MDSCR_KDE) ||
+	    (vcpu_sys_reg(vcpu, MDSCR_EL1) & DBG_MDSCR_MDE))
nit: could also write as

 if (vcpu_sys_reg(vcpu, MDSCR_EL1) & (DBG_MDSCR_KDE | DBG_MDSCR_MDE))
I actually prefer it the other way, and I think the compiler will figure
out what to do in terms of efficiency.
I won't argue about code aesthetics (although I disagree here :-). I will
point out that in this case the compiler will no doubt do the right thing,
as vcpu_sys_reg() is just a macro, but for a pointer taking function in
general there would be potential to get both calls emitted, as the
compiler wouldn't be sure there would be no side effect.
quoted
quoted
+		vcpu->arch.debug_flags |= KVM_ARM64_DEBUG_DIRTY;
+
It looks like there's only one flag for debug_flags - this dirty flag,
which I guess is also used to trigger trapping. So maybe this could be a
second flag of a "lazy state" field, as I suggested earlier?
I'm going to leave this one for now, but we can improve that later on if
we want to save a little space in the vcpu struct, or rather if we want
to rearrange things to make frequently accessed fields fit in the same
cache line.
OK

Thanks,
drew
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help