From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Marc Zyngier <marc.zyngier@arm.com>,
Sasha Levin <sashal@kernel.org>,
kvmarm@lists.cs.columbia.edu
Subject: [PATCH AUTOSEL 4.19 19/68] KVM: arm/arm64: vgic-its: Take the srcu lock when writing to guest memory
Date: Mon, 22 Apr 2019 15:44:27 -0400 [thread overview]
Message-ID: <20190422194516.11634-19-sashal@kernel.org> (raw)
In-Reply-To: <20190422194516.11634-1-sashal@kernel.org>
From: Marc Zyngier <marc.zyngier@arm.com>
[ Upstream commit a6ecfb11bf37743c1ac49b266595582b107b61d4 ]
When halting a guest, QEMU flushes the virtual ITS caches, which
amounts to writing to the various tables that the guest has allocated.
When doing this, we fail to take the srcu lock, and the kernel
shouts loudly if running a lockdep kernel:
[ 69.680416] =============================
[ 69.680819] WARNING: suspicious RCU usage
[ 69.681526] 5.1.0-rc1-00008-g600025238f51-dirty #18 Not tainted
[ 69.682096] -----------------------------
[ 69.682501] ./include/linux/kvm_host.h:605 suspicious rcu_dereference_check() usage!
[ 69.683225]
[ 69.683225] other info that might help us debug this:
[ 69.683225]
[ 69.683975]
[ 69.683975] rcu_scheduler_active = 2, debug_locks = 1
[ 69.684598] 6 locks held by qemu-system-aar/4097:
[ 69.685059] #0: 0000000034196013 (&kvm->lock){+.+.}, at: vgic_its_set_attr+0x244/0x3a0
[ 69.686087] #1: 00000000f2ed935e (&its->its_lock){+.+.}, at: vgic_its_set_attr+0x250/0x3a0
[ 69.686919] #2: 000000005e71ea54 (&vcpu->mutex){+.+.}, at: lock_all_vcpus+0x64/0xd0
[ 69.687698] #3: 00000000c17e548d (&vcpu->mutex){+.+.}, at: lock_all_vcpus+0x64/0xd0
[ 69.688475] #4: 00000000ba386017 (&vcpu->mutex){+.+.}, at: lock_all_vcpus+0x64/0xd0
[ 69.689978] #5: 00000000c2c3c335 (&vcpu->mutex){+.+.}, at: lock_all_vcpus+0x64/0xd0
[ 69.690729]
[ 69.690729] stack backtrace:
[ 69.691151] CPU: 2 PID: 4097 Comm: qemu-system-aar Not tainted 5.1.0-rc1-00008-g600025238f51-dirty #18
[ 69.691984] Hardware name: rockchip evb_rk3399/evb_rk3399, BIOS 2019.04-rc3-00124-g2feec69fb1 03/15/2019
[ 69.692831] Call trace:
[ 69.694072] lockdep_rcu_suspicious+0xcc/0x110
[ 69.694490] gfn_to_memslot+0x174/0x190
[ 69.694853] kvm_write_guest+0x50/0xb0
[ 69.695209] vgic_its_save_tables_v0+0x248/0x330
[ 69.695639] vgic_its_set_attr+0x298/0x3a0
[ 69.696024] kvm_device_ioctl_attr+0x9c/0xd8
[ 69.696424] kvm_device_ioctl+0x8c/0xf8
[ 69.696788] do_vfs_ioctl+0xc8/0x960
[ 69.697128] ksys_ioctl+0x8c/0xa0
[ 69.697445] __arm64_sys_ioctl+0x28/0x38
[ 69.697817] el0_svc_common+0xd8/0x138
[ 69.698173] el0_svc_handler+0x38/0x78
[ 69.698528] el0_svc+0x8/0xc
The fix is to obviously take the srcu lock, just like we do on the
read side of things since bf308242ab98. One wonders why this wasn't
fixed at the same time, but hey...
Fixes: bf308242ab98 ("KVM: arm/arm64: VGIC/ITS: protect kvm_read_guest() calls with SRCU lock")
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Sasha Levin (Microsoft) <sashal@kernel.org>
---
arch/arm/include/asm/kvm_mmu.h | 11 +++++++++++
arch/arm64/include/asm/kvm_mmu.h | 11 +++++++++++
virt/kvm/arm/vgic/vgic-its.c | 8 ++++----
virt/kvm/arm/vgic/vgic-v3.c | 4 ++--
4 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h
index 265ea9cf7df7..523c499e42db 100644
--- a/arch/arm/include/asm/kvm_mmu.h
+++ b/arch/arm/include/asm/kvm_mmu.h
@@ -317,6 +317,17 @@ static inline int kvm_read_guest_lock(struct kvm *kvm,
return ret;
}
+static inline int kvm_write_guest_lock(struct kvm *kvm, gpa_t gpa,
+ const void *data, unsigned long len)
+{
+ int srcu_idx = srcu_read_lock(&kvm->srcu);
+ int ret = kvm_write_guest(kvm, gpa, data, len);
+
+ srcu_read_unlock(&kvm->srcu, srcu_idx);
+
+ return ret;
+}
+
static inline void *kvm_get_hyp_vector(void)
{
switch(read_cpuid_part()) {
diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h
index d6fff7de5539..b2558447c67d 100644
--- a/arch/arm64/include/asm/kvm_mmu.h
+++ b/arch/arm64/include/asm/kvm_mmu.h
@@ -394,6 +394,17 @@ static inline int kvm_read_guest_lock(struct kvm *kvm,
return ret;
}
+static inline int kvm_write_guest_lock(struct kvm *kvm, gpa_t gpa,
+ const void *data, unsigned long len)
+{
+ int srcu_idx = srcu_read_lock(&kvm->srcu);
+ int ret = kvm_write_guest(kvm, gpa, data, len);
+
+ srcu_read_unlock(&kvm->srcu, srcu_idx);
+
+ return ret;
+}
+
#ifdef CONFIG_KVM_INDIRECT_VECTORS
/*
* EL2 vectors can be mapped and rerouted in a number of ways,
diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c
index f376c82afb61..c1071ed888e2 100644
--- a/virt/kvm/arm/vgic/vgic-its.c
+++ b/virt/kvm/arm/vgic/vgic-its.c
@@ -1935,7 +1935,7 @@ static int vgic_its_save_ite(struct vgic_its *its, struct its_device *dev,
((u64)ite->irq->intid << KVM_ITS_ITE_PINTID_SHIFT) |
ite->collection->collection_id;
val = cpu_to_le64(val);
- return kvm_write_guest(kvm, gpa, &val, ite_esz);
+ return kvm_write_guest_lock(kvm, gpa, &val, ite_esz);
}
/**
@@ -2082,7 +2082,7 @@ static int vgic_its_save_dte(struct vgic_its *its, struct its_device *dev,
(itt_addr_field << KVM_ITS_DTE_ITTADDR_SHIFT) |
(dev->num_eventid_bits - 1));
val = cpu_to_le64(val);
- return kvm_write_guest(kvm, ptr, &val, dte_esz);
+ return kvm_write_guest_lock(kvm, ptr, &val, dte_esz);
}
/**
@@ -2262,7 +2262,7 @@ static int vgic_its_save_cte(struct vgic_its *its,
((u64)collection->target_addr << KVM_ITS_CTE_RDBASE_SHIFT) |
collection->collection_id);
val = cpu_to_le64(val);
- return kvm_write_guest(its->dev->kvm, gpa, &val, esz);
+ return kvm_write_guest_lock(its->dev->kvm, gpa, &val, esz);
}
static int vgic_its_restore_cte(struct vgic_its *its, gpa_t gpa, int esz)
@@ -2333,7 +2333,7 @@ static int vgic_its_save_collection_table(struct vgic_its *its)
*/
val = 0;
BUG_ON(cte_esz > sizeof(val));
- ret = kvm_write_guest(its->dev->kvm, gpa, &val, cte_esz);
+ ret = kvm_write_guest_lock(its->dev->kvm, gpa, &val, cte_esz);
return ret;
}
diff --git a/virt/kvm/arm/vgic/vgic-v3.c b/virt/kvm/arm/vgic/vgic-v3.c
index 9c0dd234ebe8..3f2350a4d4ab 100644
--- a/virt/kvm/arm/vgic/vgic-v3.c
+++ b/virt/kvm/arm/vgic/vgic-v3.c
@@ -358,7 +358,7 @@ int vgic_v3_lpi_sync_pending_status(struct kvm *kvm, struct vgic_irq *irq)
if (status) {
/* clear consumed data */
val &= ~(1 << bit_nr);
- ret = kvm_write_guest(kvm, ptr, &val, 1);
+ ret = kvm_write_guest_lock(kvm, ptr, &val, 1);
if (ret)
return ret;
}
@@ -409,7 +409,7 @@ int vgic_v3_save_pending_tables(struct kvm *kvm)
else
val &= ~(1 << bit_nr);
- ret = kvm_write_guest(kvm, ptr, &val, 1);
+ ret = kvm_write_guest_lock(kvm, ptr, &val, 1);
if (ret)
return ret;
}
--
2.19.1
next prev parent reply other threads:[~2019-04-22 20:03 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-22 19:44 [PATCH AUTOSEL 4.19 01/68] ARM: dts: bcm283x: Fix hdmi hpd gpio pull Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 02/68] s390: limit brk randomization to 32MB Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 03/68] net: ieee802154: fix a potential NULL pointer dereference Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 04/68] ieee802154: hwsim: propagate genlmsg_reply return code Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 05/68] net: stmmac: don't set own bit too early for jumbo frames Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 06/68] qlcnic: Avoid potential NULL pointer dereference Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 07/68] xsk: fix umem memory leak on cleanup Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 08/68] staging: axis-fifo: add CONFIG_OF dependency Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 09/68] staging, mt7621-pci: fix build without pci support Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 10/68] netfilter: nft_set_rbtree: check for inactive element after flag mismatch Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 11/68] netfilter: bridge: set skb transport_header before entering NF_INET_PRE_ROUTING Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 12/68] netfilter: fix NETFILTER_XT_TARGET_TEE dependencies Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 13/68] netfilter: ip6t_srh: fix NULL pointer dereferences Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 14/68] s390/qeth: fix race when initializing the IP address table Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 15/68] ARM: imx51: fix a leaked reference by adding missing of_node_put Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 16/68] sc16is7xx: missing unregister/delete driver on error in sc16is7xx_init() Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 17/68] serial: ar933x_uart: Fix build failure with disabled console Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 18/68] KVM: arm64: Reset the PMU in preemptible context Sasha Levin
2019-04-22 19:44 ` Sasha Levin [this message]
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 20/68] KVM: arm/arm64: vgic-its: Take the srcu lock when parsing the memslots Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 21/68] usb: dwc3: pci: add support for Comet Lake PCH ID Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 22/68] usb: gadget: net2280: Fix overrun of OUT messages Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 23/68] usb: gadget: net2280: Fix net2280_dequeue() Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 24/68] usb: gadget: net2272: Fix net2272_dequeue() Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 25/68] ARM: dts: pfla02: increase phy reset duration Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 26/68] i2c: i801: Add support for Intel Comet Lake Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 27/68] net: ks8851: Dequeue RX packets explicitly Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 28/68] net: ks8851: Reassert reset pin if chip ID check fails Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 29/68] net: ks8851: Delay requesting IRQ until opened Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 30/68] net: ks8851: Set initial carrier state to down Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 31/68] staging: rtl8188eu: Fix potential NULL pointer dereference of kcalloc Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 32/68] staging: rtlwifi: rtl8822b: fix to avoid potential NULL pointer dereference Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 33/68] staging: rtl8712: uninitialized memory in read_bbreg_hdl() Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 34/68] staging: rtlwifi: Fix potential NULL pointer dereference of kzalloc Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 35/68] net: macb: Add null check for PCLK and HCLK Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 36/68] net/sched: don't dereference a->goto_chain to read the chain index Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 37/68] ARM: dts: imx6qdl: Fix typo in imx6qdl-icore-rqs.dtsi Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 38/68] drm/tegra: hub: Fix dereference before check Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 39/68] NFS: Fix a typo in nfs_init_timeout_values() Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 40/68] net: xilinx: fix possible object reference leak Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 41/68] net: ibm: " Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 42/68] net: ethernet: ti: " Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 43/68] drm: Fix drm_release() and device unplug Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 44/68] gpio: aspeed: fix a potential NULL pointer dereference Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 45/68] drm/meson: Fix invalid pointer in meson_drv_unbind() Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 46/68] drm/meson: Uninstall IRQ handler Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 47/68] ARM: davinci: fix build failure with allnoconfig Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 48/68] libceph: fix breakage caused by multipage bvecs Sasha Levin
2019-04-23 8:27 ` Ilya Dryomov
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 49/68] scsi: mpt3sas: Fix kernel panic during expander reset Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 50/68] scsi: aacraid: Insure we don't access PCIe space during AER/EEH Sasha Levin
2019-04-22 19:44 ` [PATCH AUTOSEL 4.19 51/68] scsi: qla4xxx: fix a potential NULL pointer dereference Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 52/68] usb: usb251xb: fix to avoid " Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 53/68] leds: trigger: netdev: fix refcnt leak on interface rename Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 54/68] x86/realmode: Don't leak the trampoline kernel address Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 55/68] usb: u132-hcd: fix resource leak Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 56/68] tty: fix NULL pointer issue when tty_port ops is not set Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 57/68] ceph: fix use-after-free on symlink traversal Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 58/68] scsi: zfcp: reduce flood of fcrscn1 trace records on multi-element RSCN Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 59/68] x86/mm: Don't exceed the valid physical address space Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 60/68] libata: fix using DMA buffers on stack Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 61/68] gpio: of: Fix of_gpiochip_add() error path Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 62/68] nvme-multipath: relax ANA state check Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 63/68] perf machine: Update kernel map address and re-order properly Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 64/68] kconfig/[mn]conf: handle backspace (^H) key Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 65/68] iommu/amd: Reserve exclusion range in iova-domain Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 66/68] ptrace: take into account saved_sigmask in PTRACE{GET,SET}SIGMASK Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 67/68] leds: pca9532: fix a potential NULL pointer dereference Sasha Levin
2019-04-22 19:45 ` [PATCH AUTOSEL 4.19 68/68] leds: trigger: netdev: use memcpy in device_name_store Sasha Levin
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=20190422194516.11634-19-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-kernel@vger.kernel.org \
--cc=marc.zyngier@arm.com \
--cc=stable@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome