[kernel] KVM: PPC: Expose userspace mm context id via debugfs

Message ID 20180712073026.19463-1-aik@ozlabs.ru
State New
Headers show
Series
  • [kernel] KVM: PPC: Expose userspace mm context id via debugfs
Related show

Commit Message

Alexey Kardashevskiy July 12, 2018, 7:30 a.m.
This adds a debugfs entry with mm context id of a process which is using
KVM. This id is an index in the process table so the userspace can dump
that tree provided it is granted access to /dev/mem.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
 arch/powerpc/include/asm/kvm_host.h |  1 +
 arch/powerpc/kvm/book3s_64_mmu_hv.c | 58 +++++++++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+)

Comments

Paul Mackerras July 17, 2018, 2:01 a.m. | #1
On Thu, Jul 12, 2018 at 05:30:26PM +1000, Alexey Kardashevskiy wrote:
> This adds a debugfs entry with mm context id of a process which is using
> KVM. This id is an index in the process table so the userspace can dump
> that tree provided it is granted access to /dev/mem.

Is the main intention here to be able to look at the PTEs for the
process that owns the VM?  If so, that doesn't seem particularly
KVM-specific, so perhaps something under powerpc/ in debugfs would be
more appropriate.

Is the information in /proc/<pid>/pagemap sufficient for what you
need?

Also, this doesn't seem very useful if /dev/mem is unavailable or
restricted, as it is in most distros these days.

How about a file under debugfs where you can just read out the PTEs
for a given process?

Paul.
--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
index fa4efa7..bb72667 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -284,6 +284,7 @@  struct kvm_arch {
 	u64 process_table;
 	struct dentry *debugfs_dir;
 	struct dentry *htab_dentry;
+	struct dentry *mm_ctxid_dentry;
 	struct kvm_resize_hpt *resize_hpt; /* protected by kvm->lock */
 #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */
 #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c
index 7f3a8cf..3b9eb17 100644
--- a/arch/powerpc/kvm/book3s_64_mmu_hv.c
+++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c
@@ -2138,11 +2138,69 @@  static const struct file_operations debugfs_htab_fops = {
 	.llseek	 = generic_file_llseek,
 };
 
+static int debugfs_mm_ctxid_open(struct inode *inode, struct file *file)
+{
+	struct kvm *kvm = inode->i_private;
+
+	kvm_get_kvm(kvm);
+	file->private_data = kvm;
+
+	return nonseekable_open(inode, file);
+}
+
+static int debugfs_mm_ctxid_release(struct inode *inode, struct file *file)
+{
+	struct kvm *kvm = file->private_data;
+
+	kvm_put_kvm(kvm);
+	return 0;
+}
+
+static ssize_t debugfs_mm_ctxid_read(struct file *file, char __user *buf,
+				 size_t len, loff_t *ppos)
+{
+	struct kvm *kvm = file->private_data;
+	ssize_t n, left, ret;
+	char tmp[64];
+
+	if (!kvm_is_radix(kvm))
+		return 0;
+
+	ret = snprintf(tmp, sizeof(tmp) - 1, "%lu\n", kvm->mm->context.id);
+	if (*ppos >= ret)
+		return 0;
+
+	left = min_t(ssize_t, ret - *ppos, len);
+	n = copy_to_user(buf, tmp + *ppos, left);
+	ret = left - n;
+	*ppos += ret;
+
+	return ret;
+}
+
+static ssize_t debugfs_mm_ctxid_write(struct file *file, const char __user *buf,
+			   size_t len, loff_t *ppos)
+{
+	return -EACCES;
+}
+
+static const struct file_operations debugfs_mm_ctxid_fops = {
+	.owner	 = THIS_MODULE,
+	.open	 = debugfs_mm_ctxid_open,
+	.release = debugfs_mm_ctxid_release,
+	.read	 = debugfs_mm_ctxid_read,
+	.write	 = debugfs_mm_ctxid_write,
+	.llseek	 = generic_file_llseek,
+};
+
 void kvmppc_mmu_debugfs_init(struct kvm *kvm)
 {
 	kvm->arch.htab_dentry = debugfs_create_file("htab", 0400,
 						    kvm->arch.debugfs_dir, kvm,
 						    &debugfs_htab_fops);
+	kvm->arch.mm_ctxid_dentry = debugfs_create_file("mm_ctxid", 0400,
+						    kvm->arch.debugfs_dir, kvm,
+						    &debugfs_mm_ctxid_fops);
 }
 
 void kvmppc_mmu_book3s_hv_init(struct kvm_vcpu *vcpu)