From: Alexander Graf <agraf@suse.de>
To: Paul Mackerras <paulus@samba.org>,
kvm-ppc@vger.kernel.org, kvm@vger.kernel.org
Subject: Re: [PATCH 12/23] KVM: PPC: Book3S HV: Create debugfs file for each guest's HPT
Date: Fri, 20 Mar 2015 12:20:45 +0100 [thread overview]
Message-ID: <550C028D.9020504@suse.de> (raw)
In-Reply-To: <1426844400-12017-13-git-send-email-paulus@samba.org>
On 20.03.15 10:39, Paul Mackerras wrote:
> This creates a debugfs directory for each HV guest (assuming debugfs
> is enabled in the kernel config), and within that directory, a file
> by which the contents of the guest's HPT (hashed page table) can be
> read. The directory is named vmnnnn, where nnnn is the PID of the
> process that created the guest. The file is named "htab". This is
> intended to help in debugging problems in the host's management
> of guest memory.
>
> The contents of the file consist of a series of lines like this:
>
> 3f48 4000d032bf003505 0000000bd7ff1196 00000003b5c71196
>
> The first field is the index of the entry in the HPT, the second and
> third are the HPT entry, so the third entry contains the real page
> number that is mapped by the entry if the entry's valid bit is set.
> The fourth field is the guest's view of the second doubleword of the
> entry, so it contains the guest physical address. (The format of the
> second through fourth fields are described in the Power ISA and also
> in arch/powerpc/include/asm/mmu-hash64.h.)
>
> Signed-off-by: Paul Mackerras <paulus@samba.org>
> ---
> arch/powerpc/include/asm/kvm_book3s_64.h | 2 +
> arch/powerpc/include/asm/kvm_host.h | 2 +
> arch/powerpc/kvm/book3s_64_mmu_hv.c | 136 +++++++++++++++++++++++++++++++
> arch/powerpc/kvm/book3s_hv.c | 12 +++
> virt/kvm/kvm_main.c | 1 +
> 5 files changed, 153 insertions(+)
>
> diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h b/arch/powerpc/include/asm/kvm_book3s_64.h
> index 0789a0f..869c53f 100644
> --- a/arch/powerpc/include/asm/kvm_book3s_64.h
> +++ b/arch/powerpc/include/asm/kvm_book3s_64.h
> @@ -436,6 +436,8 @@ static inline struct kvm_memslots *kvm_memslots_raw(struct kvm *kvm)
> return rcu_dereference_raw_notrace(kvm->memslots);
> }
>
> +extern void kvmppc_mmu_debugfs_init(struct kvm *kvm);
> +
> #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */
>
> #endif /* __ASM_KVM_BOOK3S_64_H__ */
> diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
> index 015773f..f1d0bbc 100644
> --- a/arch/powerpc/include/asm/kvm_host.h
> +++ b/arch/powerpc/include/asm/kvm_host.h
> @@ -238,6 +238,8 @@ struct kvm_arch {
> atomic_t hpte_mod_interest;
> cpumask_t need_tlb_flush;
> int hpt_cma_alloc;
> + struct dentry *debugfs_dir;
> + struct dentry *htab_dentry;
> #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */
> #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
> struct mutex hpt_mutex;
> diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c
> index 6c6825a..d6fe308 100644
> --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c
> +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c
> @@ -27,6 +27,7 @@
> #include <linux/srcu.h>
> #include <linux/anon_inodes.h>
> #include <linux/file.h>
> +#include <linux/debugfs.h>
>
> #include <asm/tlbflush.h>
> #include <asm/kvm_ppc.h>
> @@ -1490,6 +1491,141 @@ int kvm_vm_ioctl_get_htab_fd(struct kvm *kvm, struct kvm_get_htab_fd *ghf)
> return ret;
> }
>
> +struct debugfs_htab_state {
> + struct kvm *kvm;
> + struct mutex mutex;
> + unsigned long hpt_index;
> + int chars_left;
> + int buf_index;
> + char buf[64];
> +};
> +
> +static int debugfs_htab_open(struct inode *inode, struct file *file)
> +{
> + struct kvm *kvm = inode->i_private;
> + struct debugfs_htab_state *p;
> +
> + p = kzalloc(sizeof(*p), GFP_KERNEL);
> + if (!p)
> + return -ENOMEM;
> +
> + kvm_get_kvm(kvm);
> + p->kvm = kvm;
> + mutex_init(&p->mutex);
> + file->private_data = p;
> +
> + return nonseekable_open(inode, file);
> +}
> +
> +static int debugfs_htab_release(struct inode *inode, struct file *file)
> +{
> + struct debugfs_htab_state *p = file->private_data;
> +
> + kvm_put_kvm(p->kvm);
> + kfree(p);
> + return 0;
> +}
> +
> +static ssize_t debugfs_htab_read(struct file *file, char __user *buf,
> + size_t len, loff_t *ppos)
> +{
> + struct debugfs_htab_state *p = file->private_data;
> + ssize_t ret, r;
> + unsigned long i, n;
> + unsigned long v, hr, gr;
> + struct kvm *kvm;
> + __be64 *hptp;
> +
> + ret = mutex_lock_interruptible(&p->mutex);
> + if (ret)
> + return ret;
> +
> + if (p->chars_left) {
> + n = p->chars_left;
> + if (n > len)
> + n = len;
> + r = copy_to_user(buf, p->buf + p->buf_index, n);
> + n -= r;
> + p->chars_left -= n;
> + p->buf_index += n;
> + buf += n;
> + len -= n;
> + ret = n;
> + if (r) {
> + if (!n)
> + ret = -EFAULT;
> + goto out;
> + }
> + }
> +
> + kvm = p->kvm;
> + i = p->hpt_index;
> + hptp = (__be64 *)(kvm->arch.hpt_virt + (i * HPTE_SIZE));
> + for (; len != 0 && i < kvm->arch.hpt_npte; ++i, hptp += 2) {
> + if (!(be64_to_cpu(hptp[0]) & (HPTE_V_VALID | HPTE_V_ABSENT)))
> + continue;
> +
> + /* lock the HPTE so it's stable and read it */
> + preempt_disable();
> + while (!try_lock_hpte(hptp, HPTE_V_HVLOCK))
> + cpu_relax();
> + v = be64_to_cpu(hptp[0]) & ~HPTE_V_HVLOCK;
> + hr = be64_to_cpu(hptp[1]);
> + gr = kvm->arch.revmap[i].guest_rpte;
> + unlock_hpte(hptp, v);
> + preempt_enable();
> +
> + if (!(v & (HPTE_V_VALID | HPTE_V_ABSENT)))
> + continue;
> +
> + n = scnprintf(p->buf, sizeof(p->buf),
> + "%6lx %.16lx %.16lx %.16lx\n",
> + i, v, hr, gr);
> + p->chars_left = n;
> + if (n > len)
> + n = len;
> + r = copy_to_user(buf, p->buf, n);
> + n -= r;
> + p->chars_left -= n;
> + p->buf_index = n;
> + buf += n;
> + len -= n;
> + ret += n;
> + if (r) {
> + if (!ret)
> + ret = -EFAULT;
> + goto out;
> + }
> + }
> + p->hpt_index = i;
> +
> + out:
> + mutex_unlock(&p->mutex);
> + return ret;
> +}
> +
> +ssize_t debugfs_htab_write(struct file *file, const char __user *buf,
> + size_t len, loff_t *ppos)
> +{
> + return -EACCES;
> +}
> +
> +static const struct file_operations debugfs_htab_fops = {
> + .owner = THIS_MODULE,
> + .open = debugfs_htab_open,
> + .release = debugfs_htab_release,
> + .read = debugfs_htab_read,
> + .write = debugfs_htab_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);
> +}
> +
> void kvmppc_mmu_book3s_hv_init(struct kvm_vcpu *vcpu)
> {
> struct kvmppc_mmu *mmu = &vcpu->arch.mmu;
> diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
> index 7b7102a..6631b53 100644
> --- a/arch/powerpc/kvm/book3s_hv.c
> +++ b/arch/powerpc/kvm/book3s_hv.c
> @@ -32,6 +32,7 @@
> #include <linux/page-flags.h>
> #include <linux/srcu.h>
> #include <linux/miscdevice.h>
> +#include <linux/debugfs.h>
>
> #include <asm/reg.h>
> #include <asm/cputable.h>
> @@ -2307,6 +2308,7 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)
> static int kvmppc_core_init_vm_hv(struct kvm *kvm)
> {
> unsigned long lpcr, lpid;
> + char buf[32];
>
> /* Allocate the guest's logical partition ID */
>
> @@ -2347,6 +2349,14 @@ static int kvmppc_core_init_vm_hv(struct kvm *kvm)
> */
> kvm_hv_vm_activated();
>
> + /*
> + * Create a debugfs directory for the VM
> + */
> + sprintf(buf, "vm%d", current->pid);
The same comment stands here. I don't see how you could possibly overrun
32 bytes with vm%d, but I'd feel a lot safer if this was an snprintf.
Alex
next prev parent reply other threads:[~2015-03-20 11:20 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-20 9:39 [PATCH 00/23] Bug fixes and improvements for HV KVM Paul Mackerras
2015-03-20 9:39 ` [PATCH 01/23] KVM: PPC: Book3S HV: Fix spinlock/mutex ordering issue in kvmppc_set_lpcr() Paul Mackerras
2015-03-20 9:39 ` [PATCH 02/23] KVM: PPC: Book3S HV: Endian fix for accessing VPA yield count Paul Mackerras
2015-03-20 9:39 ` [PATCH 03/23] KVM: PPC: Book3S HV: Fix instruction emulation Paul Mackerras
2015-03-20 9:39 ` [PATCH 04/23] KVM: PPC: Book3S HV: Add fast real-mode H_RANDOM implementation Paul Mackerras
2015-03-20 9:39 ` [PATCH 05/23] KVM: PPC: Book3S HV: Remove RMA-related variables from code Paul Mackerras
2015-03-20 9:39 ` [PATCH 06/23] KVM: PPC: Book3S HV: Add helpers for lock/unlock hpte Paul Mackerras
2015-03-20 9:39 ` [PATCH 07/23] KVM: PPC: Book3S: Allow reuse of vCPU object Paul Mackerras
2015-03-20 11:01 ` Alexander Graf
2015-03-20 11:26 ` Paul Mackerras
2015-03-20 11:34 ` Alexander Graf
2015-03-20 15:51 ` Bharata B Rao
2015-03-21 14:58 ` Alexander Graf
2015-03-23 7:50 ` Bharata B Rao
2015-03-23 8:31 ` Alexander Graf
2015-03-20 9:39 ` [PATCH 08/23] KVM: PPC: Book3S HV: Add guest->host real mode completion counters Paul Mackerras
2015-03-20 9:39 ` [PATCH 09/23] KVM: PPC: Book3S HV: Convert ICS mutex lock to spin lock Paul Mackerras
2015-03-20 9:39 ` [PATCH 10/23] KVM: PPC: Book3S HV: Move virtual mode ICP functions to real-mode Paul Mackerras
2015-03-20 9:39 ` [PATCH 11/23] KVM: PPC: Book3S HV: Add ICP real mode counters Paul Mackerras
2015-03-20 9:39 ` [PATCH 12/23] KVM: PPC: Book3S HV: Create debugfs file for each guest's HPT Paul Mackerras
2015-03-20 11:20 ` Alexander Graf [this message]
2015-03-20 9:39 ` [PATCH 13/23] KVM: PPC: Book3S HV: Accumulate timing information for real-mode code Paul Mackerras
2015-03-20 11:15 ` Alexander Graf
2015-03-20 11:25 ` Paul Mackerras
2015-03-20 11:35 ` Alexander Graf
2015-03-22 22:57 ` Paul Mackerras
2015-03-20 9:39 ` [PATCH 14/23] KVM: PPC: Book3S HV: Simplify handling of VCPUs that need a VPA update Paul Mackerras
2015-03-20 9:39 ` [PATCH 15/23] KVM: PPC: Book3S HV: Minor cleanups Paul Mackerras
2015-03-20 9:39 ` [PATCH 16/23] KVM: PPC: Book3S HV: Move vcore preemption point up into kvmppc_run_vcpu Paul Mackerras
2015-03-20 9:39 ` [PATCH 17/23] KVM: PPC: Book3S HV: Get rid of vcore nap_count and n_woken Paul Mackerras
2015-03-20 9:39 ` [PATCH 18/23] KVM: PPC: Book3S HV: Don't wake thread with no vcpu on guest IPI Paul Mackerras
2015-03-20 9:39 ` [PATCH 19/23] KVM: PPC: Book3S HV: Use decrementer to wake napping threads Paul Mackerras
2015-03-20 9:39 ` [PATCH 20/23] KVM: PPC: Book3S HV: Use msgsnd for signalling threads on POWER8 Paul Mackerras
2015-03-20 11:28 ` Alexander Graf
2015-03-23 0:44 ` Paul Mackerras
2015-03-20 9:39 ` [PATCH 21/23] KVM: PPC: Book3S HV: Streamline guest entry and exit Paul Mackerras
2015-03-20 9:39 ` [PATCH 22/23] KVM: PPC: Book3S HV: Use bitmap of active threads rather than count Paul Mackerras
2015-03-20 9:40 ` [PATCH 23/23] KVM: PPC: Book3S HV: Translate kvmhv_commence_exit to C Paul Mackerras
2015-03-20 10:45 ` [PATCH 00/23] Bug fixes and improvements for HV KVM Alexander Graf
2015-03-20 11:36 ` Alexander Graf
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=550C028D.9020504@suse.de \
--to=agraf@suse.de \
--cc=kvm-ppc@vger.kernel.org \
--cc=kvm@vger.kernel.org \
--cc=paulus@samba.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