From: Marc Zyngier <maz@kernel.org>
To: kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu,
linux-arm-kernel@lists.infradead.org
Cc: kernel-team@android.com,
Christoffer Dall <Christoffer.Dall@arm.com>,
Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
James Morse <james.morse@arm.com>,
Julien Thierry <julien.thierry.kdev@gmail.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>
Subject: [PATCH 23/23] KVM: arm64: Add debugfs files for the rVIC/rVID implementation
Date: Thu, 3 Sep 2020 16:26:10 +0100 [thread overview]
Message-ID: <20200903152610.1078827-24-maz@kernel.org> (raw)
In-Reply-To: <20200903152610.1078827-1-maz@kernel.org>
It turns out that having these debugfs information is really
useful when trying to understand what is going wrong in a
guest, or even in the host kernel...
Signed-off-by: Marc Zyngier <maz@kernel.org>
---
arch/arm64/kvm/rvic-cpu.c | 140 ++++++++++++++++++++++++++++++++++++++
1 file changed, 140 insertions(+)
diff --git a/arch/arm64/kvm/rvic-cpu.c b/arch/arm64/kvm/rvic-cpu.c
index 5fb200c637d9..0e91bf6633d5 100644
--- a/arch/arm64/kvm/rvic-cpu.c
+++ b/arch/arm64/kvm/rvic-cpu.c
@@ -6,6 +6,7 @@
* Author: Marc Zyngier <maz@kernel.org>
*/
+#include <linux/debugfs.h>
#include <linux/kernel.h>
#include <linux/kvm_host.h>
#include <linux/list.h>
@@ -707,6 +708,8 @@ static int rvic_inject_userspace_irq(struct kvm *kvm, unsigned int type,
}
}
+static void rvic_create_debugfs(struct kvm_vcpu *vcpu);
+
static int rvic_vcpu_init(struct kvm_vcpu *vcpu)
{
struct rvic_vm_data *data = vcpu->kvm->arch.irqchip_data;
@@ -743,6 +746,8 @@ static int rvic_vcpu_init(struct kvm_vcpu *vcpu)
irq->line_level = false;
}
+ rvic_create_debugfs(vcpu);
+
return 0;
}
@@ -913,6 +918,8 @@ static void rvic_device_destroy(struct kvm_device *dev)
kfree(dev);
}
+static void rvid_create_debugfs(struct kvm *kvm);
+
static int rvic_set_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
{
struct rvic_vm_data *data;
@@ -969,6 +976,7 @@ static int rvic_set_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
}
dev->kvm->arch.irqchip_data = data;
+ rvid_create_debugfs(dev->kvm);
ret = 0;
break;
@@ -1071,3 +1079,135 @@ int kvm_register_rvic_device(void)
{
return kvm_register_device_ops(&rvic_dev_ops, KVM_DEV_TYPE_ARM_RVIC);
}
+
+static void rvic_irq_debug_show_one(struct seq_file *s, struct rvic_irq *irq)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&irq->lock, flags);
+
+ seq_printf(s, "%d: [%d] %c %c %ps %c %c\n",
+ irq->intid, irq->host_irq,
+ irq->pending ? 'P' : 'p',
+ irq->masked ? 'M' : 'm',
+ irq->get_line_level,
+ irq->get_line_level ? 'x' : (irq->line_level ? 'H' : 'L'),
+ rvic_irq_queued(irq) ? 'Q' : 'i');
+
+ spin_unlock_irqrestore(&irq->lock, flags);
+}
+
+static int rvic_irq_debug_show(struct seq_file *s, void *p)
+{
+ rvic_irq_debug_show_one(s, s->private);
+ return 0;
+}
+
+static int rvic_irq_debug_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, rvic_irq_debug_show, inode->i_private);
+}
+
+static const struct file_operations rvic_irq_debug_fops = {
+ .open = rvic_irq_debug_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+static int rvic_debug_show(struct seq_file *s, void *p)
+{
+ struct kvm_vcpu *vcpu = s->private;
+ struct rvic *rvic = kvm_vcpu_to_rvic(vcpu);
+ struct rvic_irq *irq;
+ unsigned long flags;
+
+ spin_lock_irqsave(&rvic->lock, flags);
+
+ seq_printf(s, "%s\n", rvic->enabled ? "Enabled" : "Disabled");
+ seq_printf(s, "%d Trusted\n", rvic->nr_trusted);
+ seq_printf(s, "%d Total\n", rvic->nr_total);
+ list_for_each_entry(irq, &rvic->delivery, delivery_entry)
+ rvic_irq_debug_show_one(s, irq);
+
+ spin_unlock_irqrestore(&rvic->lock, flags);
+
+ return 0;
+}
+
+static int rvic_debug_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, rvic_debug_show, inode->i_private);
+}
+
+static const struct file_operations rvic_debug_fops = {
+ .open = rvic_debug_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+static void rvic_create_debugfs(struct kvm_vcpu *vcpu)
+{
+ struct rvic *rvic = kvm_vcpu_to_rvic(vcpu);
+ struct dentry *rvic_root;
+ char dname[128];
+ int i;
+
+ snprintf(dname, sizeof(dname), "rvic-%d", vcpu->vcpu_id);
+ rvic_root = debugfs_create_dir(dname, vcpu->kvm->debugfs_dentry);
+ if (!rvic_root)
+ return;
+
+ debugfs_create_file("state", 0444, rvic_root, vcpu, &rvic_debug_fops);
+ for (i = 0; i < rvic->nr_total; i++) {
+ snprintf(dname, sizeof(dname), "%d", i);
+ debugfs_create_file(dname, 0444, rvic_root,
+ rvic_get_irq(rvic, i),
+ &rvic_irq_debug_fops);
+ }
+}
+
+static int rvid_debug_show(struct seq_file *s, void *p)
+{
+ struct kvm *kvm = s->private;
+ struct rvic_vm_data *data = kvm->arch.irqchip_data;
+ unsigned long flags;
+ int i;
+
+ spin_lock_irqsave(&data->lock, flags);
+
+ seq_printf(s, "%d Trusted\n", data->nr_trusted);
+ seq_printf(s, "%d Total\n", data->nr_total);
+
+ for (i = 0; i < rvic_nr_untrusted(data); i++) {
+ if (data->rvid_map[i].intid < data->nr_trusted)
+ continue;
+
+ seq_printf(s, "%4u: vcpu-%u %u\n",
+ i, data->rvid_map[i].target_vcpu,
+ data->rvid_map[i].intid);
+ }
+
+ spin_unlock_irqrestore(&data->lock, flags);
+
+ return 0;
+}
+
+static int rvid_debug_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, rvid_debug_show, inode->i_private);
+}
+
+static const struct file_operations rvid_debug_fops = {
+ .open = rvid_debug_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+static void rvid_create_debugfs(struct kvm *kvm)
+{
+ debugfs_create_file("rvid", 0444, kvm->debugfs_dentry,
+ kvm, &rvid_debug_fops);
+}
--
2.27.0
prev parent reply other threads:[~2020-09-03 15:56 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-03 15:25 [PATCH 00/23] KVM: arm64: rVIC/rVID PV interrupt controller Marc Zyngier
2020-09-03 15:25 ` [PATCH 01/23] irqchip: Add Reduced Virtual Interrupt Controller driver Marc Zyngier
2020-09-03 15:25 ` [PATCH 02/23] irqchip/rvic: Add support for untrusted interrupt allocation Marc Zyngier
2020-09-04 13:40 ` Jonathan Cameron
2020-09-03 15:25 ` [PATCH 03/23] irqchip: Add Reduced Virtual Interrupt Distributor support Marc Zyngier
2020-09-04 13:56 ` Jonathan Cameron
2020-09-03 15:25 ` [PATCH 04/23] irqchip/rvid: Add PCI MSI support Marc Zyngier
2020-09-04 14:15 ` Jonathan Cameron
2020-09-05 13:08 ` Marc Zyngier
2020-09-03 15:25 ` [PATCH 05/23] KVM: arm64: Move GIC model out of the distributor Marc Zyngier
2020-09-04 14:37 ` Jonathan Cameron
2020-09-03 15:25 ` [PATCH 06/23] KVM: arm64: vgic-v3: Move early init to kvm_vgic_create() Marc Zyngier
2020-09-03 15:25 ` [PATCH 07/23] KVM: arm64: Add irqchip callback structure to kvm_arch Marc Zyngier
2020-09-03 15:25 ` [PATCH 08/23] KVM: arm64: Move kvm_vgic_destroy to kvm_irqchip_flow Marc Zyngier
2020-09-03 15:25 ` [PATCH 09/23] KVM: arm64: Move kvm_vgic_vcpu_init() to irqchip_flow Marc Zyngier
2020-09-03 15:25 ` [PATCH 10/23] KVM: arm64: Move kvm_vgic_vcpu_[un]blocking() " Marc Zyngier
2020-09-03 15:25 ` [PATCH 11/23] KVM: arm64: Move kvm_vgic_vcpu_load/put() " Marc Zyngier
2020-09-03 15:25 ` [PATCH 12/23] KVM: arm64: Move kvm_vgic_vcpu_pending_irq() " Marc Zyngier
2020-09-04 14:57 ` Jonathan Cameron
2020-09-03 15:26 ` [PATCH 13/23] KVM: arm64: Move vgic resource mapping on first run " Marc Zyngier
2020-09-03 15:26 ` [PATCH 14/23] KVM: arm64: Move kvm_vgic_vcpu_{sync,flush}_hwstate() " Marc Zyngier
2020-09-03 15:26 ` [PATCH 15/23] KVM: arm64: nVHE: Only save/restore GICv3 state if modeling a GIC Marc Zyngier
2020-09-03 15:26 ` [PATCH 16/23] KVM: arm64: Move interrupt injection to irqchip_flow Marc Zyngier
2020-09-03 15:26 ` [PATCH 17/23] KVM: arm64: Move mapping of HW interrupts into irqchip_flow Marc Zyngier
2020-09-03 15:26 ` [PATCH 18/23] KVM: arm64: Move set_owner " Marc Zyngier
2020-09-03 15:26 ` [PATCH 19/23] KVM: arm64: Turn vgic_initialized into irqchip_finalized Marc Zyngier
2020-09-03 15:26 ` [PATCH 20/23] KVM: arm64: Move irqfd routing to irqchip_flow Marc Zyngier
2020-09-03 15:26 ` [PATCH 21/23] KVM: arm64: Tighten msis_require_devid reporting Marc Zyngier
2020-09-03 15:26 ` [PATCH 22/23] KVM: arm64: Add a rVIC/rVID in-kernel implementation Marc Zyngier
2020-09-04 16:00 ` Jonathan Cameron
2020-09-05 13:16 ` Marc Zyngier
2020-09-29 15:13 ` Lorenzo Pieralisi
2020-09-29 15:27 ` Marc Zyngier
2020-09-29 16:09 ` Lorenzo Pieralisi
2020-09-03 15:26 ` Marc Zyngier [this message]
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=20200903152610.1078827-24-maz@kernel.org \
--to=maz@kernel.org \
--cc=Christoffer.Dall@arm.com \
--cc=james.morse@arm.com \
--cc=julien.thierry.kdev@gmail.com \
--cc=kernel-team@android.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=lorenzo.pieralisi@arm.com \
--cc=suzuki.poulose@arm.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;
as well as URLs for NNTP newsgroup(s).