From patchwork Thu Jul 12 07:30:26 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexey Kardashevskiy X-Patchwork-Id: 942830 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=kvm-ppc-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=ozlabs.ru Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41R6zX5kJjz9s2t for ; Thu, 12 Jul 2018 17:30:32 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726041AbeGLHit (ORCPT ); Thu, 12 Jul 2018 03:38:49 -0400 Received: from 107-173-13-209-host.colocrossing.com ([107.173.13.209]:34159 "EHLO ozlabs.ru" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1725995AbeGLHit (ORCPT ); Thu, 12 Jul 2018 03:38:49 -0400 Received: from vpl1.ozlabs.ibm.com (localhost [IPv6:::1]) by ozlabs.ru (Postfix) with ESMTP id 04955AE8001F; Thu, 12 Jul 2018 03:29:12 -0400 (EDT) From: Alexey Kardashevskiy To: linuxppc-dev@lists.ozlabs.org Cc: Alexey Kardashevskiy , kvm-ppc@vger.kernel.org, Paul Mackerras Subject: [PATCH kernel] KVM: PPC: Expose userspace mm context id via debugfs Date: Thu, 12 Jul 2018 17:30:26 +1000 Message-Id: <20180712073026.19463-1-aik@ozlabs.ru> X-Mailer: git-send-email 2.11.0 Sender: kvm-ppc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm-ppc@vger.kernel.org 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 --- arch/powerpc/include/asm/kvm_host.h | 1 + arch/powerpc/kvm/book3s_64_mmu_hv.c | 58 +++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) 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)