From: "Alex Bennée" <alex.bennee@linaro.org>
To: Christoffer Dall <cdall@linaro.org>
Cc: Julien Thierry <julien.thierry@arm.com>,
kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
kvmarm@lists.cs.columbia.edu, christoffer.dall@linaro.org,
marc.zyngier@arm.com, Russell King <linux@armlinux.org.uk>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will.deacon@arm.com>,
open list <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v1 2/2] kvm: arm64: handle single-step of userspace mmio instructions
Date: Fri, 13 Oct 2017 10:23:21 +0100 [thread overview]
Message-ID: <87po9r9zau.fsf@linaro.org> (raw)
In-Reply-To: <20171013085947.GE8927@cbox>
Christoffer Dall <cdall@linaro.org> writes:
> On Fri, Oct 06, 2017 at 02:45:35PM +0100, Alex Bennée wrote:
>>
>> Julien Thierry <julien.thierry@arm.com> writes:
>>
>> > On 06/10/17 12:39, Alex Bennée wrote:
>> >> The system state of KVM when using userspace emulation is not complete
>> >> until we return into KVM_RUN. To handle mmio related updates we wait
>> >> until they have been committed and then schedule our KVM_EXIT_DEBUG.
>> >>
>> >> I've introduced a new function kvm_arm_maybe_return_debug() to wrap up
>> >> the differences between arm/arm64 which is currently null for arm.
>> >>
>> >> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>> >> ---
>> >> arch/arm/include/asm/kvm_host.h | 2 ++
>> >> arch/arm64/include/asm/kvm_host.h | 1 +
>> >> arch/arm64/kvm/debug.c | 21 +++++++++++++++++++++
>> >> arch/arm64/kvm/handle_exit.c | 9 +++------
>> >> virt/kvm/arm/arm.c | 2 +-
>> >> virt/kvm/arm/mmio.c | 3 ++-
>> >> 6 files changed, 30 insertions(+), 8 deletions(-)
>> >>
>> >> diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h
>> >> index 4a879f6ff13b..aec943f6d123 100644
>> >> --- a/arch/arm/include/asm/kvm_host.h
>> >> +++ b/arch/arm/include/asm/kvm_host.h
>> >> @@ -285,6 +285,8 @@ static inline void kvm_arm_init_debug(void) {}
>> >> static inline void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) {}
>> >> static inline void kvm_arm_clear_debug(struct kvm_vcpu *vcpu) {}
>> >> static inline void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu) {}
>> >> +static inline int kvm_arm_maybe_return_debug(struct kvm_vcpu *vcpu,
>> >> + struct kvm_run *run) {}
>> >>
>> >
>> > This function should return 1.
>>
>> So I did ponder making this a bool, returning true if we need to exit
>> and testing in v/k/a/arm.c exit leg rather than in the mmio handler.
>>
>> At the moment it mirrors the existing exit logic which follows -1 err, 0
>> return, >0 handled. But as I mentioned in the cover letter this fell
>> down a bit when dealing with the mmio case.
>>
>> >
>> >> int kvm_arm_vcpu_arch_set_attr(struct kvm_vcpu *vcpu,
>> >> struct kvm_device_attr *attr);
>> >> diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
>> >> index e923b58606e2..fa67d21662f6 100644
>> >> --- a/arch/arm64/include/asm/kvm_host.h
>> >> +++ b/arch/arm64/include/asm/kvm_host.h
>> >> @@ -369,6 +369,7 @@ void kvm_arm_init_debug(void);
>> >> void kvm_arm_setup_debug(struct kvm_vcpu *vcpu);
>> >> void kvm_arm_clear_debug(struct kvm_vcpu *vcpu);
>> >> void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu);
>> >> +int kvm_arm_maybe_return_debug(struct kvm_vcpu *vcpu, struct kvm_run *run);
>> >
>> > I feel the name could be a little bit more explicit:
>> >
>> > kvm_arm_trap_need_step_debug, kvm_arm_trap_step_return_debug,
>> > kvm_arm_trap_need_return_debug.
>>
>> I wanted to keep the debug suffix so that's fine although I'm not so
>> sure trap is correct because on the tail end of mmio emulation are we
>> still trapping?
>>
>> Maybe kvm_arm_step_emulated_debug?
>
> I think you should name it:
>
> kvm_arm_should_complete_emulated_instr_debug() - or something better -
Naming is hard :-/
> and call it directly from kvm_arch_vcpu_ioctl_run, so that it becomes:
>
> ret = kvm_handle_mmio_return(vcpu, vcpu->run);
> if (ret)
> return ret;
> ret = kvm_arm_should_complete_emulated_instr_debug(vcpu);
> if (ret)
> return ret;
This runs into the problem of slightly different ret semantics for here
and in handle_exit. Maybe just having a bool response and:
if (kvm_arm_should_complete_emulated_instr_debug(vcpu))
return 0;
And then in handle_exit:
if (handled == 1 && kvm_arm_should_complete_emulated_instr_debug(vcpu))
return 0;
else
return handled;
?
>
>>
>> > At least, I think it would be nice that the name reflect that this
>> > check is meant for emulated instructions.
>> >
>> > Otherwise:
>> >
>> > Reviewed-by: Julien Thierry <julien.thierry@arm.com>
>> >
>> > Thanks,
>>
>>
> Thanks,
> -Christoffer
--
Alex Bennée
WARNING: multiple messages have this Message-ID (diff)
From: alex.bennee@linaro.org (Alex Bennée)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v1 2/2] kvm: arm64: handle single-step of userspace mmio instructions
Date: Fri, 13 Oct 2017 10:23:21 +0100 [thread overview]
Message-ID: <87po9r9zau.fsf@linaro.org> (raw)
In-Reply-To: <20171013085947.GE8927@cbox>
Christoffer Dall <cdall@linaro.org> writes:
> On Fri, Oct 06, 2017 at 02:45:35PM +0100, Alex Benn?e wrote:
>>
>> Julien Thierry <julien.thierry@arm.com> writes:
>>
>> > On 06/10/17 12:39, Alex Benn?e wrote:
>> >> The system state of KVM when using userspace emulation is not complete
>> >> until we return into KVM_RUN. To handle mmio related updates we wait
>> >> until they have been committed and then schedule our KVM_EXIT_DEBUG.
>> >>
>> >> I've introduced a new function kvm_arm_maybe_return_debug() to wrap up
>> >> the differences between arm/arm64 which is currently null for arm.
>> >>
>> >> Signed-off-by: Alex Benn?e <alex.bennee@linaro.org>
>> >> ---
>> >> arch/arm/include/asm/kvm_host.h | 2 ++
>> >> arch/arm64/include/asm/kvm_host.h | 1 +
>> >> arch/arm64/kvm/debug.c | 21 +++++++++++++++++++++
>> >> arch/arm64/kvm/handle_exit.c | 9 +++------
>> >> virt/kvm/arm/arm.c | 2 +-
>> >> virt/kvm/arm/mmio.c | 3 ++-
>> >> 6 files changed, 30 insertions(+), 8 deletions(-)
>> >>
>> >> diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h
>> >> index 4a879f6ff13b..aec943f6d123 100644
>> >> --- a/arch/arm/include/asm/kvm_host.h
>> >> +++ b/arch/arm/include/asm/kvm_host.h
>> >> @@ -285,6 +285,8 @@ static inline void kvm_arm_init_debug(void) {}
>> >> static inline void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) {}
>> >> static inline void kvm_arm_clear_debug(struct kvm_vcpu *vcpu) {}
>> >> static inline void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu) {}
>> >> +static inline int kvm_arm_maybe_return_debug(struct kvm_vcpu *vcpu,
>> >> + struct kvm_run *run) {}
>> >>
>> >
>> > This function should return 1.
>>
>> So I did ponder making this a bool, returning true if we need to exit
>> and testing in v/k/a/arm.c exit leg rather than in the mmio handler.
>>
>> At the moment it mirrors the existing exit logic which follows -1 err, 0
>> return, >0 handled. But as I mentioned in the cover letter this fell
>> down a bit when dealing with the mmio case.
>>
>> >
>> >> int kvm_arm_vcpu_arch_set_attr(struct kvm_vcpu *vcpu,
>> >> struct kvm_device_attr *attr);
>> >> diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
>> >> index e923b58606e2..fa67d21662f6 100644
>> >> --- a/arch/arm64/include/asm/kvm_host.h
>> >> +++ b/arch/arm64/include/asm/kvm_host.h
>> >> @@ -369,6 +369,7 @@ void kvm_arm_init_debug(void);
>> >> void kvm_arm_setup_debug(struct kvm_vcpu *vcpu);
>> >> void kvm_arm_clear_debug(struct kvm_vcpu *vcpu);
>> >> void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu);
>> >> +int kvm_arm_maybe_return_debug(struct kvm_vcpu *vcpu, struct kvm_run *run);
>> >
>> > I feel the name could be a little bit more explicit:
>> >
>> > kvm_arm_trap_need_step_debug, kvm_arm_trap_step_return_debug,
>> > kvm_arm_trap_need_return_debug.
>>
>> I wanted to keep the debug suffix so that's fine although I'm not so
>> sure trap is correct because on the tail end of mmio emulation are we
>> still trapping?
>>
>> Maybe kvm_arm_step_emulated_debug?
>
> I think you should name it:
>
> kvm_arm_should_complete_emulated_instr_debug() - or something better -
Naming is hard :-/
> and call it directly from kvm_arch_vcpu_ioctl_run, so that it becomes:
>
> ret = kvm_handle_mmio_return(vcpu, vcpu->run);
> if (ret)
> return ret;
> ret = kvm_arm_should_complete_emulated_instr_debug(vcpu);
> if (ret)
> return ret;
This runs into the problem of slightly different ret semantics for here
and in handle_exit. Maybe just having a bool response and:
if (kvm_arm_should_complete_emulated_instr_debug(vcpu))
return 0;
And then in handle_exit:
if (handled == 1 && kvm_arm_should_complete_emulated_instr_debug(vcpu))
return 0;
else
return handled;
?
>
>>
>> > At least, I think it would be nice that the name reflect that this
>> > check is meant for emulated instructions.
>> >
>> > Otherwise:
>> >
>> > Reviewed-by: Julien Thierry <julien.thierry@arm.com>
>> >
>> > Thanks,
>>
>>
> Thanks,
> -Christoffer
--
Alex Benn?e
next prev parent reply other threads:[~2017-10-13 9:23 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-06 11:39 [PATCH v1 0/2] KVM: arm64: single step emulation instructions Alex Bennée
2017-10-06 11:39 ` Alex Bennée
2017-10-06 11:39 ` [PATCH v1 1/2] KVM: arm64: handle single-stepping trapped instructions Alex Bennée
2017-10-06 11:39 ` Alex Bennée
2017-10-06 11:39 ` Alex Bennée
2017-10-06 12:27 ` Marc Zyngier
2017-10-06 12:27 ` Marc Zyngier
2017-10-06 12:34 ` Julien Thierry
2017-10-06 12:34 ` Julien Thierry
2017-10-06 12:46 ` Marc Zyngier
2017-10-06 12:46 ` Marc Zyngier
2017-10-06 13:15 ` Julien Thierry
2017-10-06 13:15 ` Julien Thierry
2017-10-13 8:26 ` Christoffer Dall
2017-10-13 8:26 ` Christoffer Dall
2017-10-13 8:26 ` Christoffer Dall
2017-10-13 9:15 ` Alex Bennée
2017-10-13 9:15 ` Alex Bennée
2017-10-13 9:15 ` Alex Bennée
2017-10-14 14:16 ` Christoffer Dall
2017-10-14 14:16 ` Christoffer Dall
2017-10-14 14:16 ` Christoffer Dall
2017-10-06 11:39 ` [PATCH v1 2/2] kvm: arm64: handle single-step of userspace mmio instructions Alex Bennée
2017-10-06 11:39 ` Alex Bennée
2017-10-06 11:39 ` Alex Bennée
2017-10-06 12:37 ` Marc Zyngier
2017-10-06 12:37 ` Marc Zyngier
2017-10-06 12:44 ` Marc Zyngier
2017-10-06 12:44 ` Marc Zyngier
2017-10-06 13:47 ` Alex Bennée
2017-10-06 13:47 ` Alex Bennée
2017-10-06 13:47 ` Alex Bennée
2017-10-06 14:00 ` Marc Zyngier
2017-10-06 14:00 ` Marc Zyngier
2017-10-06 14:26 ` Julien Thierry
2017-10-06 14:26 ` Julien Thierry
2017-10-06 14:43 ` Marc Zyngier
2017-10-06 14:43 ` Marc Zyngier
2017-10-06 14:43 ` Marc Zyngier
2017-10-06 13:13 ` Julien Thierry
2017-10-06 13:13 ` Julien Thierry
2017-10-06 13:13 ` Julien Thierry
2017-10-06 13:45 ` Alex Bennée
2017-10-06 13:45 ` Alex Bennée
2017-10-06 14:27 ` Julien Thierry
2017-10-06 14:27 ` Julien Thierry
2017-10-06 14:27 ` Julien Thierry
2017-10-13 8:59 ` Christoffer Dall
2017-10-13 8:59 ` Christoffer Dall
2017-10-13 8:59 ` Christoffer Dall
2017-10-13 9:23 ` Alex Bennée [this message]
2017-10-13 9:23 ` Alex Bennée
2017-10-14 14:18 ` Christoffer Dall
2017-10-14 14:18 ` Christoffer Dall
2017-10-13 8:56 ` Christoffer Dall
2017-10-13 8:56 ` Christoffer Dall
2017-10-13 9:27 ` Alex Bennée
2017-10-13 9:27 ` Alex Bennée
2017-10-14 14:20 ` Christoffer Dall
2017-10-14 14:20 ` Christoffer Dall
2017-10-14 14:20 ` Christoffer Dall
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=87po9r9zau.fsf@linaro.org \
--to=alex.bennee@linaro.org \
--cc=catalin.marinas@arm.com \
--cc=cdall@linaro.org \
--cc=christoffer.dall@linaro.org \
--cc=julien.thierry@arm.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=marc.zyngier@arm.com \
--cc=will.deacon@arm.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.