All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoffer Dall <christoffer.dall@linaro.org>
To: "Paolo Bonzini" <pbonzini@redhat.com>,
	"Radim Krčmář" <rkrcmar@redhat.com>
Cc: kvm@vger.kernel.org, Marc Zyngier <marc.zyngier@arm.com>,
	linux-arm-kernel@lists.infradead.org,
	kvmarm@lists.cs.columbia.edu
Subject: [PULL 23/26] KVM: arm/arm64: Document KVM_DEV_ARM_ITS_CTRL_RESET
Date: Tue,  7 Nov 2017 11:47:56 +0100	[thread overview]
Message-ID: <20171107104800.30021-24-christoffer.dall@linaro.org> (raw)
In-Reply-To: <20171107104800.30021-1-christoffer.dall@linaro.org>

From: Eric Auger <eric.auger@redhat.com>

At the moment, the in-kernel emulated ITS is not properly reset.
On guest restart/reset some registers keep their old values and
internal structures like device, ITE, and collection lists are not
freed.

This may lead to various bugs. Among them, we can have incorrect state
backup or failure when saving the ITS state at early guest boot stage.

This patch documents a new attribute, KVM_DEV_ARM_ITS_CTRL_RESET in
the KVM_DEV_ARM_VGIC_GRP_CTRL group.

Upon this action, we can reset registers and especially those
pointing to tables previously allocated by the guest and free
the internal data structures storing the list of devices, collections
and lpis.

The usual approach for device reset of having userspace write
the reset values of the registers to the kernel via the register
read/write APIs doesn't work for the ITS because it has some
internal state (caches) which is not exposed as registers,
and there is no register interface for "drop cached data without
writing it back to RAM". So we need a KVM API which mimics the
hardware's reset line, to provide the equivalent behaviour to
a "pull the power cord out of the back of the machine" reset.

Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
Reviewed-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Eric Auger <eric.auger@redhat.com>
Reported-by: wanghaibin <wanghaibin.wang@huawei.com>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
---
 Documentation/virtual/kvm/devices/arm-vgic-its.txt | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/Documentation/virtual/kvm/devices/arm-vgic-its.txt b/Documentation/virtual/kvm/devices/arm-vgic-its.txt
index eb06beb75960..8d5830eab26a 100644
--- a/Documentation/virtual/kvm/devices/arm-vgic-its.txt
+++ b/Documentation/virtual/kvm/devices/arm-vgic-its.txt
@@ -33,6 +33,10 @@ Groups:
       request the initialization of the ITS, no additional parameter in
       kvm_device_attr.addr.
 
+    KVM_DEV_ARM_ITS_CTRL_RESET
+      reset the ITS, no additional parameter in kvm_device_attr.addr.
+      See "ITS Reset State" section.
+
     KVM_DEV_ARM_ITS_SAVE_TABLES
       save the ITS table data into guest RAM, at the location provisioned
       by the guest in corresponding registers/table entries.
@@ -157,3 +161,19 @@ Then vcpus can be started.
  - pINTID is the physical LPI ID; if zero, it means the entry is not valid
    and other fields are not meaningful.
  - ICID is the collection ID
+
+ ITS Reset State:
+ ----------------
+
+RESET returns the ITS to the same state that it was when first created and
+initialized. When the RESET command returns, the following things are
+guaranteed:
+
+- The ITS is not enabled and quiescent
+  GITS_CTLR.Enabled = 0 .Quiescent=1
+- There is no internally cached state
+- No collection or device table are used
+  GITS_BASER<n>.Valid = 0
+- GITS_CBASER = 0, GITS_CREADR = 0, GITS_CWRITER = 0
+- The ABI version is unchanged and remains the one set when the ITS
+  device was first created.
-- 
2.14.2

WARNING: multiple messages have this Message-ID (diff)
From: christoffer.dall@linaro.org (Christoffer Dall)
To: linux-arm-kernel@lists.infradead.org
Subject: [PULL 23/26] KVM: arm/arm64: Document KVM_DEV_ARM_ITS_CTRL_RESET
Date: Tue,  7 Nov 2017 11:47:56 +0100	[thread overview]
Message-ID: <20171107104800.30021-24-christoffer.dall@linaro.org> (raw)
In-Reply-To: <20171107104800.30021-1-christoffer.dall@linaro.org>

From: Eric Auger <eric.auger@redhat.com>

At the moment, the in-kernel emulated ITS is not properly reset.
On guest restart/reset some registers keep their old values and
internal structures like device, ITE, and collection lists are not
freed.

This may lead to various bugs. Among them, we can have incorrect state
backup or failure when saving the ITS state at early guest boot stage.

This patch documents a new attribute, KVM_DEV_ARM_ITS_CTRL_RESET in
the KVM_DEV_ARM_VGIC_GRP_CTRL group.

Upon this action, we can reset registers and especially those
pointing to tables previously allocated by the guest and free
the internal data structures storing the list of devices, collections
and lpis.

The usual approach for device reset of having userspace write
the reset values of the registers to the kernel via the register
read/write APIs doesn't work for the ITS because it has some
internal state (caches) which is not exposed as registers,
and there is no register interface for "drop cached data without
writing it back to RAM". So we need a KVM API which mimics the
hardware's reset line, to provide the equivalent behaviour to
a "pull the power cord out of the back of the machine" reset.

Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
Reviewed-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Eric Auger <eric.auger@redhat.com>
Reported-by: wanghaibin <wanghaibin.wang@huawei.com>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
---
 Documentation/virtual/kvm/devices/arm-vgic-its.txt | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/Documentation/virtual/kvm/devices/arm-vgic-its.txt b/Documentation/virtual/kvm/devices/arm-vgic-its.txt
index eb06beb75960..8d5830eab26a 100644
--- a/Documentation/virtual/kvm/devices/arm-vgic-its.txt
+++ b/Documentation/virtual/kvm/devices/arm-vgic-its.txt
@@ -33,6 +33,10 @@ Groups:
       request the initialization of the ITS, no additional parameter in
       kvm_device_attr.addr.
 
+    KVM_DEV_ARM_ITS_CTRL_RESET
+      reset the ITS, no additional parameter in kvm_device_attr.addr.
+      See "ITS Reset State" section.
+
     KVM_DEV_ARM_ITS_SAVE_TABLES
       save the ITS table data into guest RAM, at the location provisioned
       by the guest in corresponding registers/table entries.
@@ -157,3 +161,19 @@ Then vcpus can be started.
  - pINTID is the physical LPI ID; if zero, it means the entry is not valid
    and other fields are not meaningful.
  - ICID is the collection ID
+
+ ITS Reset State:
+ ----------------
+
+RESET returns the ITS to the same state that it was when first created and
+initialized. When the RESET command returns, the following things are
+guaranteed:
+
+- The ITS is not enabled and quiescent
+  GITS_CTLR.Enabled = 0 .Quiescent=1
+- There is no internally cached state
+- No collection or device table are used
+  GITS_BASER<n>.Valid = 0
+- GITS_CBASER = 0, GITS_CREADR = 0, GITS_CWRITER = 0
+- The ABI version is unchanged and remains the one set when the ITS
+  device was first created.
-- 
2.14.2

  parent reply	other threads:[~2017-11-07 10:47 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-07 10:47 [PULL 00/26] KVM/ARM Changes for v4.15 Christoffer Dall
2017-11-07 10:47 ` Christoffer Dall
2017-11-07 10:47 ` [PULL 01/26] arm64: Implement arch_counter_get_cntpct to read the physical counter Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 02/26] arm64: Use physical counter for in-kernel reads when booted in EL2 Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 03/26] KVM: arm/arm64: Guard kvm_vgic_map_is_active against !vgic_initialized Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 04/26] KVM: arm/arm64: Support calling vgic_update_irq_pending from irq context Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 05/26] KVM: arm/arm64: Check that system supports split eoi/deactivate Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 06/26] KVM: arm/arm64: Make timer_arm and timer_disarm helpers more generic Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 07/26] KVM: arm/arm64: Rename soft timer to bg_timer Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 08/26] KVM: arm/arm64: Move timer/vgic flush/sync under disabled irq Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 09/26] KVM: arm/arm64: Use separate timer for phys timer emulation Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 10/26] KVM: arm/arm64: Move timer save/restore out of the hyp code Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 11/26] KVM: arm/arm64: Set VCPU affinity for virt timer irq Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 12/26] KVM: arm/arm64: Avoid timer save/restore in vcpu entry/exit Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 13/26] KVM: arm/arm64: Support EL1 phys timer register access in set/get reg Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 14/26] KVM: arm/arm64: Use kvm_arm_timer_set/get_reg for guest register traps Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 15/26] KVM: arm/arm64: Move phys_timer_emulate function Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 16/26] KVM: arm/arm64: Avoid phys timer emulation in vcpu entry/exit Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 17/26] KVM: arm/arm64: Get rid of kvm_timer_flush_hwstate Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 18/26] KVM: arm/arm64: Rework kvm_timer_should_fire Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 19/26] arm/arm64: KVM: Load the timer state when enabling the timer Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 20/26] KVM: arm/arm64: vgic-its: Remove kvm_its_unmap_device Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 21/26] KVM: arm/arm64: vgic-its: New helper functions to free the caches Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 22/26] KVM: arm/arm64: vgic-its: Free caches when GITS_BASER Valid bit is cleared Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` Christoffer Dall [this message]
2017-11-07 10:47   ` [PULL 23/26] KVM: arm/arm64: Document KVM_DEV_ARM_ITS_CTRL_RESET Christoffer Dall
2017-11-07 10:47 ` [PULL 24/26] KVM: arm/arm64: vgic-its: Implement KVM_DEV_ARM_ITS_CTRL_RESET Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 25/26] KVM: arm/arm64: Unify 32bit fault injection Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-07 10:47 ` [PULL 26/26] KVM: arm/arm64: fix the incompatible matching for external abort Christoffer Dall
2017-11-07 10:47   ` Christoffer Dall
2017-11-09 18:04 ` [PULL 00/26] KVM/ARM Changes for v4.15 Radim Krčmář
2017-11-09 18:04   ` Radim Krčmář

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=20171107104800.30021-24-christoffer.dall@linaro.org \
    --to=christoffer.dall@linaro.org \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=marc.zyngier@arm.com \
    --cc=pbonzini@redhat.com \
    --cc=rkrcmar@redhat.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.