From: alex.bennee@linaro.org (Alex Bennée)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] arm64: KVM: export current vcpu->pause state via pseudo regs
Date: Thu, 31 Jul 2014 16:14:51 +0100 [thread overview]
Message-ID: <87mwbpimgz.fsf@linaro.org> (raw)
In-Reply-To: <20140731143538.GI11610@cbox>
Christoffer Dall writes:
> On Wed, Jul 09, 2014 at 02:55:12PM +0100, Alex Benn?e wrote:
>> To cleanly restore an SMP VM we need to ensure that the current pause
>> state of each vcpu is correctly recorded. Things could get confused if
>> the CPU starts running after migration restore completes when it was
>> paused before it state was captured.
>>
<snip>
>> +/* Power state (PSCI), not real registers */
>> +#define KVM_REG_ARM_PSCI (0x0014 << KVM_REG_ARM_COPROC_SHIFT)
>> +#define KVM_REG_ARM_PSCI_REG(n) \
>> + (KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_PSCI | \
>> + (n & ~KVM_REG_ARM_COPROC_MASK))
>
> I don't understand this mask, why isn't this
> (n & 0xffff))
I was trying to use the existing masks, but of course if anyone changes
that it would be an ABI change so probably not worth it.
>
>> +#define KVM_REG_ARM_PSCI_STATE KVM_REG_ARM_PSCI_REG(0)
>> +#define NUM_KVM_PSCI_REGS 1
>> +
>
> you're missing updates to Documentation/virtual/kvm/api.txt here.
Will add.
>> /* Device Control API: ARM VGIC */
>> #define KVM_DEV_ARM_VGIC_GRP_ADDR 0
>> #define KVM_DEV_ARM_VGIC_GRP_DIST_REGS 1
>> diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
>> index 205f0d8..31d6439 100644
>> --- a/arch/arm64/kvm/guest.c
>> +++ b/arch/arm64/kvm/guest.c
>> @@ -189,6 +189,54 @@ static int get_timer_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
>> }
>>
>> /**
>> + * PSCI State
>> + *
>> + * These are not real registers as they do not actually exist in the
>> + * hardware but represent the current power state of the vCPU
>
> full stop
>
>> + */
>> +
>> +static bool is_psci_reg(u64 index)
>> +{
>> + switch (index) {
>> + case KVM_REG_ARM_PSCI_STATE:
>> + return true;
>> + }
>> + return false;
>> +}
>> +
>> +static int copy_psci_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
>> +{
>> + if (put_user(KVM_REG_ARM_PSCI_STATE, uindices))
>> + return -EFAULT;
>> + return 0;
>> +}
>> +
>> +static int set_psci_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
>> +{
>> + void __user *uaddr = (void __user *)(long)reg->addr;
>> + u64 val;
>> + int ret;
>> +
>> + ret = copy_from_user(&val, uaddr, KVM_REG_SIZE(reg->id));
>> + if (ret != 0)
>> + return ret;
>> +
>> + vcpu->arch.pause = (val & 0x1) ? false : true;
>
> tabs
Hmmm, apparently the GNU Emacs "linux" style doesn't actually enforce
that. Who knew? I'll beat the editor into submission.
> I really need the documentation of the ABI, why is bit[0] == 1 not
> paused?
I figured 1 == running, but I can switch it round if you want to to map
directly to the .pause flag.
> If we are not complaining when setting the pause value to false if it
> was true before, then we probably also need to wake up the thread in
> case this is called from another thread, right?
>
> or perhaps we should just return an error if you're trying to un-pause a
> CPU through this interface, hmmmm.
Wouldn't it be an error to mess with any register when the system is not
in a quiescent state? I was assuming that the wake state is dealt with
when the run loop finally restarts.
<snip>
>
> please check for use of tabs versus spaces, checkpatch.pl should
> complain.
>
> Can you add the 32-bit counterpart as part of this patch?
Same patch? Sure.
>
> Thanks,
> -Christoffer
--
Alex Benn?e
WARNING: multiple messages have this Message-ID (diff)
From: "Alex Bennée" <alex.bennee@linaro.org>
To: Christoffer Dall <christoffer.dall@linaro.org>
Cc: kvmarm@lists.cs.columbia.edu,
linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org,
Marc Zyngier <marc.zyngier@arm.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will.deacon@arm.com>, Gleb Natapov <gleb@kernel.org>,
Paolo Bonzini <pbonzini@redhat.com>,
open list <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] arm64: KVM: export current vcpu->pause state via pseudo regs
Date: Thu, 31 Jul 2014 16:14:51 +0100 [thread overview]
Message-ID: <87mwbpimgz.fsf@linaro.org> (raw)
In-Reply-To: <20140731143538.GI11610@cbox>
Christoffer Dall writes:
> On Wed, Jul 09, 2014 at 02:55:12PM +0100, Alex Bennée wrote:
>> To cleanly restore an SMP VM we need to ensure that the current pause
>> state of each vcpu is correctly recorded. Things could get confused if
>> the CPU starts running after migration restore completes when it was
>> paused before it state was captured.
>>
<snip>
>> +/* Power state (PSCI), not real registers */
>> +#define KVM_REG_ARM_PSCI (0x0014 << KVM_REG_ARM_COPROC_SHIFT)
>> +#define KVM_REG_ARM_PSCI_REG(n) \
>> + (KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_PSCI | \
>> + (n & ~KVM_REG_ARM_COPROC_MASK))
>
> I don't understand this mask, why isn't this
> (n & 0xffff))
I was trying to use the existing masks, but of course if anyone changes
that it would be an ABI change so probably not worth it.
>
>> +#define KVM_REG_ARM_PSCI_STATE KVM_REG_ARM_PSCI_REG(0)
>> +#define NUM_KVM_PSCI_REGS 1
>> +
>
> you're missing updates to Documentation/virtual/kvm/api.txt here.
Will add.
>> /* Device Control API: ARM VGIC */
>> #define KVM_DEV_ARM_VGIC_GRP_ADDR 0
>> #define KVM_DEV_ARM_VGIC_GRP_DIST_REGS 1
>> diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
>> index 205f0d8..31d6439 100644
>> --- a/arch/arm64/kvm/guest.c
>> +++ b/arch/arm64/kvm/guest.c
>> @@ -189,6 +189,54 @@ static int get_timer_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
>> }
>>
>> /**
>> + * PSCI State
>> + *
>> + * These are not real registers as they do not actually exist in the
>> + * hardware but represent the current power state of the vCPU
>
> full stop
>
>> + */
>> +
>> +static bool is_psci_reg(u64 index)
>> +{
>> + switch (index) {
>> + case KVM_REG_ARM_PSCI_STATE:
>> + return true;
>> + }
>> + return false;
>> +}
>> +
>> +static int copy_psci_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
>> +{
>> + if (put_user(KVM_REG_ARM_PSCI_STATE, uindices))
>> + return -EFAULT;
>> + return 0;
>> +}
>> +
>> +static int set_psci_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
>> +{
>> + void __user *uaddr = (void __user *)(long)reg->addr;
>> + u64 val;
>> + int ret;
>> +
>> + ret = copy_from_user(&val, uaddr, KVM_REG_SIZE(reg->id));
>> + if (ret != 0)
>> + return ret;
>> +
>> + vcpu->arch.pause = (val & 0x1) ? false : true;
>
> tabs
Hmmm, apparently the GNU Emacs "linux" style doesn't actually enforce
that. Who knew? I'll beat the editor into submission.
> I really need the documentation of the ABI, why is bit[0] == 1 not
> paused?
I figured 1 == running, but I can switch it round if you want to to map
directly to the .pause flag.
> If we are not complaining when setting the pause value to false if it
> was true before, then we probably also need to wake up the thread in
> case this is called from another thread, right?
>
> or perhaps we should just return an error if you're trying to un-pause a
> CPU through this interface, hmmmm.
Wouldn't it be an error to mess with any register when the system is not
in a quiescent state? I was assuming that the wake state is dealt with
when the run loop finally restarts.
<snip>
>
> please check for use of tabs versus spaces, checkpatch.pl should
> complain.
>
> Can you add the 32-bit counterpart as part of this patch?
Same patch? Sure.
>
> Thanks,
> -Christoffer
--
Alex Bennée
next prev parent reply other threads:[~2014-07-31 15:14 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-09 13:55 [PATCH] arm64: KVM: export current vcpu->pause state via pseudo regs Alex Bennée
2014-07-09 13:55 ` Alex Bennée
2014-07-31 14:35 ` Christoffer Dall
2014-07-31 14:35 ` Christoffer Dall
2014-07-31 15:14 ` Alex Bennée [this message]
2014-07-31 15:14 ` Alex Bennée
2014-07-31 16:38 ` Christoffer Dall
2014-07-31 16:38 ` Christoffer Dall
2014-07-31 16:45 ` Peter Maydell
2014-07-31 16:45 ` Peter Maydell
2014-07-31 16:50 ` Christoffer Dall
2014-07-31 16:50 ` Christoffer Dall
2014-07-31 16:53 ` Peter Maydell
2014-07-31 16:53 ` Peter Maydell
2014-08-01 9:48 ` Alex Bennée
2014-08-01 9:48 ` Alex Bennée
2014-08-04 12:11 ` Christoffer Dall
2014-08-04 12:11 ` Christoffer Dall
2014-08-01 9:11 ` Alex Bennée
2014-08-01 9:11 ` Alex Bennée
2014-08-04 12:13 ` Christoffer Dall
2014-08-04 12:13 ` Christoffer Dall
2014-07-31 16:57 ` Paolo Bonzini
2014-07-31 16:57 ` Paolo Bonzini
2014-07-31 17:04 ` Peter Maydell
2014-07-31 17:04 ` Peter Maydell
2014-07-31 17:21 ` Paolo Bonzini
2014-07-31 17:21 ` Paolo Bonzini
2014-07-31 17:36 ` Peter Maydell
2014-07-31 17:36 ` Peter Maydell
2014-07-31 17:44 ` Will Deacon
2014-07-31 17:44 ` Will Deacon
2014-08-04 12:16 ` Christoffer Dall
2014-08-04 12:16 ` Christoffer Dall
2014-08-04 12:35 ` Alex Bennée
2014-08-04 12:35 ` Alex Bennée
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=87mwbpimgz.fsf@linaro.org \
--to=alex.bennee@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
/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.