From: Marc Zyngier <maz@kernel.org>
To: Zenghui Yu <yuzenghui@huawei.com>
Cc: kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu,
pbonzini@redhat.com, peterx@redhat.com
Subject: Re: BUG: using __this_cpu_read() in preemptible [00000000] code
Date: Fri, 07 Feb 2020 09:19:40 +0000 [thread overview]
Message-ID: <828d3b538b7258f692f782b6798277cf@kernel.org> (raw)
In-Reply-To: <318984f6-bc36-33a3-abc6-bf2295974b06@huawei.com>
Hi Zenghui,
On 2020-02-07 09:00, Zenghui Yu wrote:
> Hi,
>
> Running a latest preemptible kernel and some guests on it,
> I got the following message,
>
> ---8<---
>
> [ 630.031870] BUG: using __this_cpu_read() in preemptible [00000000]
> code: qemu-system-aar/37270
> [ 630.031872] caller is kvm_get_running_vcpu+0x1c/0x38
> [ 630.031874] CPU: 32 PID: 37270 Comm: qemu-system-aar Kdump: loaded
> Not tainted 5.5.0+
> [ 630.031876] Hardware name: Huawei TaiShan 2280 /BC11SPCD, BIOS 1.58
> 10/29/2018
> [ 630.031876] Call trace:
> [ 630.031878] dump_backtrace+0x0/0x200
> [ 630.031880] show_stack+0x24/0x30
> [ 630.031882] dump_stack+0xb0/0xf4
> [ 630.031884] __this_cpu_preempt_check+0xc8/0xd0
> [ 630.031886] kvm_get_running_vcpu+0x1c/0x38
> [ 630.031888] vgic_mmio_change_active.isra.4+0x2c/0xe0
> [ 630.031890] __vgic_mmio_write_cactive+0x80/0xc8
> [ 630.031892] vgic_mmio_uaccess_write_cactive+0x3c/0x50
> [ 630.031894] vgic_uaccess+0xcc/0x138
> [ 630.031896] vgic_v3_redist_uaccess+0x7c/0xa8
> [ 630.031898] vgic_v3_attr_regs_access+0x1a8/0x230
> [ 630.031901] vgic_v3_set_attr+0x1b4/0x290
> [ 630.031903] kvm_device_ioctl_attr+0xbc/0x110
> [ 630.031905] kvm_device_ioctl+0xc4/0x108
> [ 630.031907] ksys_ioctl+0xb4/0xd0
> [ 630.031909] __arm64_sys_ioctl+0x28/0x38
> [ 630.031911] el0_svc_common.constprop.1+0x7c/0x1a0
> [ 630.031913] do_el0_svc+0x34/0xa0
> [ 630.031915] el0_sync_handler+0x124/0x274
> [ 630.031916] el0_sync+0x140/0x180
>
> ---8<---
>
> I'm now at commit 90568ecf561540fa330511e21fcd823b0c3829c6.
>
> And it looks like vgic_get_mmio_requester_vcpu() was broken by
> 7495e22bb165 ("KVM: Move running VCPU from ARM to common code").
>
> Could anyone please have a look?
Here you go:
diff --git a/virt/kvm/arm/vgic/vgic-mmio.c
b/virt/kvm/arm/vgic/vgic-mmio.c
index d656ebd5f9d4..e1735f19c924 100644
--- a/virt/kvm/arm/vgic/vgic-mmio.c
+++ b/virt/kvm/arm/vgic/vgic-mmio.c
@@ -190,6 +190,15 @@ unsigned long vgic_mmio_read_pending(struct
kvm_vcpu *vcpu,
* value later will give us the same value as we update the per-CPU
variable
* in the preempt notifier handlers.
*/
+static struct kvm_vcpu *vgic_get_mmio_requester_vcpu(void)
+{
+ struct kvm_vcpu *vcpu;
+
+ preempt_disable();
+ vcpu = kvm_get_running_vcpu();
+ preempt_enable();
+ return vcpu;
+}
/* Must be called with irq->irq_lock held */
static void vgic_hw_irq_spending(struct kvm_vcpu *vcpu, struct vgic_irq
*irq,
@@ -212,7 +221,7 @@ void vgic_mmio_write_spending(struct kvm_vcpu *vcpu,
gpa_t addr, unsigned int len,
unsigned long val)
{
- bool is_uaccess = !kvm_get_running_vcpu();
+ bool is_uaccess = !vgic_get_mmio_requester_vcpu();
u32 intid = VGIC_ADDR_TO_INTID(addr, 1);
int i;
unsigned long flags;
@@ -265,7 +274,7 @@ void vgic_mmio_write_cpending(struct kvm_vcpu *vcpu,
gpa_t addr, unsigned int len,
unsigned long val)
{
- bool is_uaccess = !kvm_get_running_vcpu();
+ bool is_uaccess = !vgic_get_mmio_requester_vcpu();
u32 intid = VGIC_ADDR_TO_INTID(addr, 1);
int i;
unsigned long flags;
@@ -326,7 +335,7 @@ static void vgic_mmio_change_active(struct kvm_vcpu
*vcpu, struct vgic_irq *irq,
bool active)
{
unsigned long flags;
- struct kvm_vcpu *requester_vcpu = kvm_get_running_vcpu();
+ struct kvm_vcpu *requester_vcpu = vgic_get_mmio_requester_vcpu();
raw_spin_lock_irqsave(&irq->irq_lock, flags);
That's basically a revert of the offending code. The comment right above
vgic_get_mmio_requester_vcpu() explains *why* this is valid, and why
preempt_disable() is needed.
Can you please give it a shot?
Thanks,
M.
--
Jazz is not dead. It just smells funny...
next prev parent reply other threads:[~2020-02-07 9:19 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-07 9:00 BUG: using __this_cpu_read() in preemptible [00000000] code Zenghui Yu
2020-02-07 9:19 ` Marc Zyngier [this message]
2020-02-07 10:19 ` Zenghui Yu
2020-02-07 10:25 ` Marc Zyngier
2020-02-07 16:18 ` Peter Xu
2020-02-07 16:25 ` Marc Zyngier
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=828d3b538b7258f692f782b6798277cf@kernel.org \
--to=maz@kernel.org \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=yuzenghui@huawei.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox