Skip to content

Commit

Permalink
KVM: PPC: Merge powerpc's debugfs entry content into generic entry
Browse files Browse the repository at this point in the history
At the moment KVM on PPC creates 3 types of entries under the kvm debugfs:
1) "%pid-%fd" per a KVM instance (for all platforms);
2) "vm%pid" (for PPC Book3s HV KVM);
3) "vm%u_vcpu%u_timing" (for PPC Book3e KVM).

The problem with this is that multiple VMs per process is not allowed for
2) and 3) which makes it possible for userspace to trigger errors when
creating duplicated debugfs entries.

This merges all these into 1).

This defines kvm_arch_create_kvm_debugfs() similar to
kvm_arch_create_vcpu_debugfs().

This defines 2 hooks in kvmppc_ops that allow specific KVM implementations
add necessary entries, this adds the _e500 suffix to
kvmppc_create_vcpu_debugfs_e500() to make it clear what platform it is for.

This makes use of already existing kvm_arch_create_vcpu_debugfs() on PPC.

This removes no more used debugfs_dir pointers from PPC kvm_arch structs.

This stops removing vcpu entries as once created vcpus stay around
for the entire life of a VM and removed when the KVM instance is closed,
see commit d56f513 ("KVM: let kvm_destroy_vm_debugfs clean up vCPU
debugfs directories").

Suggested-by: Fabiano Rosas <farosas@linux.ibm.com>
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
  • Loading branch information
aik authored and intel-lab-lkp committed Dec 15, 2021
1 parent 7920209 commit bb4c492
Show file tree
Hide file tree
Showing 10 changed files with 41 additions and 49 deletions.
6 changes: 2 additions & 4 deletions arch/powerpc/include/asm/kvm_host.h
Expand Up @@ -26,6 +26,8 @@
#include <asm/hvcall.h>
#include <asm/mce.h>

#define __KVM_HAVE_ARCH_VCPU_DEBUGFS

#define KVM_MAX_VCPUS NR_CPUS
#define KVM_MAX_VCORES NR_CPUS

Expand Down Expand Up @@ -295,7 +297,6 @@ struct kvm_arch {
bool dawr1_enabled;
pgd_t *pgtable;
u64 process_table;
struct dentry *debugfs_dir;
struct kvm_resize_hpt *resize_hpt; /* protected by kvm->lock */
#endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */
#ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
Expand Down Expand Up @@ -673,7 +674,6 @@ struct kvm_vcpu_arch {
u64 timing_min_duration[__NUMBER_OF_KVM_EXIT_TYPES];
u64 timing_max_duration[__NUMBER_OF_KVM_EXIT_TYPES];
u64 timing_last_exit;
struct dentry *debugfs_exit_timing;
#endif

#ifdef CONFIG_PPC_BOOK3S
Expand Down Expand Up @@ -829,8 +829,6 @@ struct kvm_vcpu_arch {
struct kvmhv_tb_accumulator rm_exit; /* real-mode exit code */
struct kvmhv_tb_accumulator guest_time; /* guest execution */
struct kvmhv_tb_accumulator cede_time; /* time napping inside guest */

struct dentry *debugfs_dir;
#endif /* CONFIG_KVM_BOOK3S_HV_EXIT_TIMING */
};

Expand Down
2 changes: 2 additions & 0 deletions arch/powerpc/include/asm/kvm_ppc.h
Expand Up @@ -316,6 +316,8 @@ struct kvmppc_ops {
int (*svm_off)(struct kvm *kvm);
int (*enable_dawr1)(struct kvm *kvm);
bool (*hash_v3_possible)(void);
int (*create_vm_debugfs)(struct kvm *kvm);
int (*create_vcpu_debugfs)(struct kvm_vcpu *vcpu, struct dentry *debugfs_dentry);
};

extern struct kvmppc_ops *kvmppc_hv_ops;
Expand Down
2 changes: 1 addition & 1 deletion arch/powerpc/kvm/book3s_64_mmu_hv.c
Expand Up @@ -2112,7 +2112,7 @@ static const struct file_operations debugfs_htab_fops = {

void kvmppc_mmu_debugfs_init(struct kvm *kvm)
{
debugfs_create_file("htab", 0400, kvm->arch.debugfs_dir, kvm,
debugfs_create_file("htab", 0400, kvm->debugfs_dentry, kvm,
&debugfs_htab_fops);
}

Expand Down
2 changes: 1 addition & 1 deletion arch/powerpc/kvm/book3s_64_mmu_radix.c
Expand Up @@ -1454,7 +1454,7 @@ static const struct file_operations debugfs_radix_fops = {

void kvmhv_radix_debugfs_init(struct kvm *kvm)
{
debugfs_create_file("radix", 0400, kvm->arch.debugfs_dir, kvm,
debugfs_create_file("radix", 0400, kvm->debugfs_dentry, kvm,
&debugfs_radix_fops);
}

Expand Down
31 changes: 12 additions & 19 deletions arch/powerpc/kvm/book3s_hv.c
Expand Up @@ -2768,20 +2768,17 @@ static const struct file_operations debugfs_timings_ops = {
};

/* Create a debugfs directory for the vcpu */
static void debugfs_vcpu_init(struct kvm_vcpu *vcpu, unsigned int id)
static int kvmppc_arch_create_vcpu_debugfs_hv(struct kvm_vcpu *vcpu, struct dentry *debugfs_dentry)
{
char buf[16];
struct kvm *kvm = vcpu->kvm;

snprintf(buf, sizeof(buf), "vcpu%u", id);
vcpu->arch.debugfs_dir = debugfs_create_dir(buf, kvm->arch.debugfs_dir);
debugfs_create_file("timings", 0444, vcpu->arch.debugfs_dir, vcpu,
debugfs_create_file("timings", 0444, debugfs_dentry, vcpu,
&debugfs_timings_ops);
return 0;
}

#else /* CONFIG_KVM_BOOK3S_HV_EXIT_TIMING */
static void debugfs_vcpu_init(struct kvm_vcpu *vcpu, unsigned int id)
static int kvmppc_arch_create_vcpu_debugfs_hv(struct kvm_vcpu *vcpu, struct dentry *debugfs_dentry)
{
return 0;
}
#endif /* CONFIG_KVM_BOOK3S_HV_EXIT_TIMING */

Expand Down Expand Up @@ -2904,8 +2901,6 @@ static int kvmppc_core_vcpu_create_hv(struct kvm_vcpu *vcpu)
vcpu->arch.cpu_type = KVM_CPU_3S_64;
kvmppc_sanity_check(vcpu);

debugfs_vcpu_init(vcpu, id);

return 0;
}

Expand Down Expand Up @@ -5226,7 +5221,6 @@ void kvmppc_free_host_rm_ops(void)
static int kvmppc_core_init_vm_hv(struct kvm *kvm)
{
unsigned long lpcr, lpid;
char buf[32];
int ret;

mutex_init(&kvm->arch.uvmem_lock);
Expand Down Expand Up @@ -5359,15 +5353,14 @@ static int kvmppc_core_init_vm_hv(struct kvm *kvm)
kvm->arch.smt_mode = 1;
kvm->arch.emul_smt_mode = 1;

/*
* Create a debugfs directory for the VM
*/
snprintf(buf, sizeof(buf), "vm%d", current->pid);
kvm->arch.debugfs_dir = debugfs_create_dir(buf, kvm_debugfs_dir);
return 0;
}

static int kvmppc_arch_create_vm_debugfs_hv(struct kvm *kvm)
{
kvmppc_mmu_debugfs_init(kvm);
if (radix_enabled())
kvmhv_radix_debugfs_init(kvm);

return 0;
}

Expand All @@ -5382,8 +5375,6 @@ static void kvmppc_free_vcores(struct kvm *kvm)

static void kvmppc_core_destroy_vm_hv(struct kvm *kvm)
{
debugfs_remove_recursive(kvm->arch.debugfs_dir);

if (!cpu_has_feature(CPU_FTR_ARCH_300))
kvm_hv_vm_deactivated();

Expand Down Expand Up @@ -6044,6 +6035,8 @@ static struct kvmppc_ops kvm_ops_hv = {
.svm_off = kvmhv_svm_off,
.enable_dawr1 = kvmhv_enable_dawr1,
.hash_v3_possible = kvmppc_hash_v3_possible,
.create_vcpu_debugfs = kvmppc_arch_create_vcpu_debugfs_hv,
.create_vm_debugfs = kvmppc_arch_create_vm_debugfs_hv,
};

static int kvm_init_subcore_bitmap(void)
Expand Down
1 change: 1 addition & 0 deletions arch/powerpc/kvm/e500.c
Expand Up @@ -495,6 +495,7 @@ static struct kvmppc_ops kvm_ops_e500 = {
.emulate_op = kvmppc_core_emulate_op_e500,
.emulate_mtspr = kvmppc_core_emulate_mtspr_e500,
.emulate_mfspr = kvmppc_core_emulate_mfspr_e500,
.create_vcpu_debugfs = kvmppc_create_vcpu_debugfs_e500,
};

static int __init kvmppc_e500_init(void)
Expand Down
1 change: 1 addition & 0 deletions arch/powerpc/kvm/e500mc.c
Expand Up @@ -381,6 +381,7 @@ static struct kvmppc_ops kvm_ops_e500mc = {
.emulate_op = kvmppc_core_emulate_op_e500,
.emulate_mtspr = kvmppc_core_emulate_mtspr_e500,
.emulate_mfspr = kvmppc_core_emulate_mfspr_e500,
.create_vcpu_debugfs = kvmppc_create_vcpu_debugfs_e500,
};

static int __init kvmppc_e500mc_init(void)
Expand Down
16 changes: 13 additions & 3 deletions arch/powerpc/kvm/powerpc.c
Expand Up @@ -763,7 +763,6 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
goto out_vcpu_uninit;

vcpu->arch.waitp = &vcpu->wait;
kvmppc_create_vcpu_debugfs(vcpu, vcpu->vcpu_id);
return 0;

out_vcpu_uninit:
Expand All @@ -780,8 +779,6 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
/* Make sure we're not using the vcpu anymore */
hrtimer_cancel(&vcpu->arch.dec_timer);

kvmppc_remove_vcpu_debugfs(vcpu);

switch (vcpu->arch.irq_type) {
case KVMPPC_IRQ_MPIC:
kvmppc_mpic_disconnect_vcpu(vcpu->arch.mpic, vcpu);
Expand Down Expand Up @@ -2505,3 +2502,16 @@ int kvm_arch_init(void *opaque)
}

EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_ppc_instr);

void kvm_arch_create_vcpu_debugfs(struct kvm_vcpu *vcpu, struct dentry *debugfs_dentry)
{
if (vcpu->kvm->arch.kvm_ops->create_vcpu_debugfs)
vcpu->kvm->arch.kvm_ops->create_vcpu_debugfs(vcpu, debugfs_dentry);
}

int kvm_arch_create_vm_debugfs(struct kvm *kvm)
{
if (kvm->arch.kvm_ops->create_vm_debugfs)
kvm->arch.kvm_ops->create_vm_debugfs(kvm);
return 0;
}
20 changes: 4 additions & 16 deletions arch/powerpc/kvm/timing.c
Expand Up @@ -204,21 +204,9 @@ static const struct file_operations kvmppc_exit_timing_fops = {
.release = single_release,
};

void kvmppc_create_vcpu_debugfs(struct kvm_vcpu *vcpu, unsigned int id)
void kvmppc_create_vcpu_debugfs_e500(struct kvm_vcpu *vcpu,
struct dentry *debugfs_dentry)
{
static char dbg_fname[50];
struct dentry *debugfs_file;

snprintf(dbg_fname, sizeof(dbg_fname), "vm%u_vcpu%u_timing",
current->pid, id);
debugfs_file = debugfs_create_file(dbg_fname, 0666, kvm_debugfs_dir,
vcpu, &kvmppc_exit_timing_fops);

vcpu->arch.debugfs_exit_timing = debugfs_file;
}

void kvmppc_remove_vcpu_debugfs(struct kvm_vcpu *vcpu)
{
debugfs_remove(vcpu->arch.debugfs_exit_timing);
vcpu->arch.debugfs_exit_timing = NULL;
debugfs_create_file("timing", 0666, debugfs_dentry,
vcpu, &kvmppc_exit_timing_fops);
}
9 changes: 4 additions & 5 deletions arch/powerpc/kvm/timing.h
Expand Up @@ -14,8 +14,8 @@
#ifdef CONFIG_KVM_EXIT_TIMING
void kvmppc_init_timing_stats(struct kvm_vcpu *vcpu);
void kvmppc_update_timing_stats(struct kvm_vcpu *vcpu);
void kvmppc_create_vcpu_debugfs(struct kvm_vcpu *vcpu, unsigned int id);
void kvmppc_remove_vcpu_debugfs(struct kvm_vcpu *vcpu);
void kvmppc_create_vcpu_debugfs_e500(struct kvm_vcpu *vcpu,
struct dentry *debugfs_dentry);

static inline void kvmppc_set_exit_type(struct kvm_vcpu *vcpu, int type)
{
Expand All @@ -26,9 +26,8 @@ static inline void kvmppc_set_exit_type(struct kvm_vcpu *vcpu, int type)
/* if exit timing is not configured there is no need to build the c file */
static inline void kvmppc_init_timing_stats(struct kvm_vcpu *vcpu) {}
static inline void kvmppc_update_timing_stats(struct kvm_vcpu *vcpu) {}
static inline void kvmppc_create_vcpu_debugfs(struct kvm_vcpu *vcpu,
unsigned int id) {}
static inline void kvmppc_remove_vcpu_debugfs(struct kvm_vcpu *vcpu) {}
static inline void kvmppc_create_vcpu_debugfs_e500(struct kvm_vcpu *vcpu,
struct dentry *debugfs_dentry) {}
static inline void kvmppc_set_exit_type(struct kvm_vcpu *vcpu, int type) {}
#endif /* CONFIG_KVM_EXIT_TIMING */

Expand Down

0 comments on commit bb4c492

Please sign in to comment.