diff mbox

[1/5] s390x/cpu: Use ioctl to reset state in the kernel

Message ID 1393414708-37739-2-git-send-email-borntraeger@de.ibm.com
State New
Headers show

Commit Message

Christian Borntraeger Feb. 26, 2014, 11:38 a.m. UTC
From: Thomas Huth <thuth@linux.vnet.ibm.com>

Some of the state in the kernel can not be reset from QEMU yet.
For this we've got to use the KVM_S390_INITIAL_RESET ioctl to make
sure that the state in the kernel is set to the right values during
initial CPU reset, too.

Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
 target-s390x/cpu.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Alexander Graf April 14, 2014, 10:14 a.m. UTC | #1
On 26.02.14 12:38, Christian Borntraeger wrote:
> From: Thomas Huth <thuth@linux.vnet.ibm.com>
>
> Some of the state in the kernel can not be reset from QEMU yet.
> For this we've got to use the KVM_S390_INITIAL_RESET ioctl to make
> sure that the state in the kernel is set to the right values during
> initial CPU reset, too.
>
> Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
> Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
> ---
>   target-s390x/cpu.c | 9 +++++++++
>   1 file changed, 9 insertions(+)
>
> diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c
> index f1319e5..1a8c1cc 100644
> --- a/target-s390x/cpu.c
> +++ b/target-s390x/cpu.c
> @@ -108,6 +108,15 @@ static void s390_cpu_initial_reset(CPUState *s)
>       env->cregs[14] = CR14_RESET;
>   
>       env->pfault_token = -1UL;
> +
> +#if defined(CONFIG_KVM)
> +    /* Reset state inside the kernel that we cannot access yet from QEMU. */
> +    if (kvm_enabled()) {
> +        if (kvm_vcpu_ioctl(s, KVM_S390_INITIAL_RESET, NULL)) {

Could we put this into the vcpu register sync function? It gets a 
parameter that indicates when we are on RESET level, right?

That way we don't have to put kvm-only code in cpu.c :).


Alex
Thomas Huth April 14, 2014, 11:54 a.m. UTC | #2
On Mon, 14 Apr 2014 12:14:49 +0200
Alexander Graf <agraf@suse.de> wrote:

> 
> On 26.02.14 12:38, Christian Borntraeger wrote:
> > From: Thomas Huth <thuth@linux.vnet.ibm.com>
> >
> > Some of the state in the kernel can not be reset from QEMU yet.
> > For this we've got to use the KVM_S390_INITIAL_RESET ioctl to make
> > sure that the state in the kernel is set to the right values during
> > initial CPU reset, too.
> >
> > Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
> > Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
> > Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
> > ---
> >   target-s390x/cpu.c | 9 +++++++++
> >   1 file changed, 9 insertions(+)
> >
> > diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c
> > index f1319e5..1a8c1cc 100644
> > --- a/target-s390x/cpu.c
> > +++ b/target-s390x/cpu.c
> > @@ -108,6 +108,15 @@ static void s390_cpu_initial_reset(CPUState *s)
> >       env->cregs[14] = CR14_RESET;
> >   
> >       env->pfault_token = -1UL;
> > +
> > +#if defined(CONFIG_KVM)
> > +    /* Reset state inside the kernel that we cannot access yet from QEMU. */
> > +    if (kvm_enabled()) {
> > +        if (kvm_vcpu_ioctl(s, KVM_S390_INITIAL_RESET, NULL)) {
> 
> Could we put this into the vcpu register sync function? It gets a 
> parameter that indicates when we are on RESET level, right?

No, sorry, as far as I can see, this is not that easily possible:

On S390, we've got five different levels of reset (CPU reset,
Initial CPU reset, Subsystem reset, Clear reset & Power-on reset).
The ioctl is about initial CPU reset only, while the register sync
function flag is rather only used by system/clear reset instead.

So for example when the guest OS sends a SIGP INITIAL CPU RESET from
one CPU to another, only the s390_cpu_initial_reset() will be called,
but not the register sync with KVM_PUT_RESET_STATE.

 Thomas
Alexander Graf April 14, 2014, 12:03 p.m. UTC | #3
On 14.04.14 13:54, Thomas Huth wrote:
> On Mon, 14 Apr 2014 12:14:49 +0200
> Alexander Graf <agraf@suse.de> wrote:
>
>> On 26.02.14 12:38, Christian Borntraeger wrote:
>>> From: Thomas Huth <thuth@linux.vnet.ibm.com>
>>>
>>> Some of the state in the kernel can not be reset from QEMU yet.
>>> For this we've got to use the KVM_S390_INITIAL_RESET ioctl to make
>>> sure that the state in the kernel is set to the right values during
>>> initial CPU reset, too.
>>>
>>> Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
>>> Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
>>> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
>>> ---
>>>    target-s390x/cpu.c | 9 +++++++++
>>>    1 file changed, 9 insertions(+)
>>>
>>> diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c
>>> index f1319e5..1a8c1cc 100644
>>> --- a/target-s390x/cpu.c
>>> +++ b/target-s390x/cpu.c
>>> @@ -108,6 +108,15 @@ static void s390_cpu_initial_reset(CPUState *s)
>>>        env->cregs[14] = CR14_RESET;
>>>    
>>>        env->pfault_token = -1UL;
>>> +
>>> +#if defined(CONFIG_KVM)
>>> +    /* Reset state inside the kernel that we cannot access yet from QEMU. */
>>> +    if (kvm_enabled()) {
>>> +        if (kvm_vcpu_ioctl(s, KVM_S390_INITIAL_RESET, NULL)) {
>> Could we put this into the vcpu register sync function? It gets a
>> parameter that indicates when we are on RESET level, right?
> No, sorry, as far as I can see, this is not that easily possible:
>
> On S390, we've got five different levels of reset (CPU reset,
> Initial CPU reset, Subsystem reset, Clear reset & Power-on reset).
> The ioctl is about initial CPU reset only, while the register sync
> function flag is rather only used by system/clear reset instead.
>
> So for example when the guest OS sends a SIGP INITIAL CPU RESET from
> one CPU to another, only the s390_cpu_initial_reset() will be called,
> but not the register sync with KVM_PUT_RESET_STATE.

Right, I keep forgetting these details :)


Alex
diff mbox

Patch

diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c
index f1319e5..1a8c1cc 100644
--- a/target-s390x/cpu.c
+++ b/target-s390x/cpu.c
@@ -108,6 +108,15 @@  static void s390_cpu_initial_reset(CPUState *s)
     env->cregs[14] = CR14_RESET;
 
     env->pfault_token = -1UL;
+
+#if defined(CONFIG_KVM)
+    /* Reset state inside the kernel that we cannot access yet from QEMU. */
+    if (kvm_enabled()) {
+        if (kvm_vcpu_ioctl(s, KVM_S390_INITIAL_RESET, NULL)) {
+            perror("Initial CPU reset failed");
+        }
+    }
+#endif
 }
 
 /* CPUClass:reset() */