Skip to content

Commit

Permalink
KVM: make pid available for uevents without debugfs
Browse files Browse the repository at this point in the history
Simplify and improve the code so that the PID is always available in
the uevent even when debugfs is not available.

This adds a userspace_pid field to struct kvm, as per Radim's
suggestion, so that the PID can be retrieved on destruction too.

Acked-by: Janosch Frank <[email protected]>
Fixes: 286de8f ("KVM: trigger uevents when creating or destroying a VM")
Signed-off-by: Claudio Imbrenda <[email protected]>
Signed-off-by: Paolo Bonzini <[email protected]>
  • Loading branch information
Claudio Imbrenda authored and bonzini committed Jul 26, 2017
1 parent fa19871 commit fdeaf7e
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 23 deletions.
1 change: 1 addition & 0 deletions include/linux/kvm_host.h
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,7 @@ struct kvm {
struct kvm_stat_data **debugfs_stat_data;
struct srcu_struct srcu;
struct srcu_struct irq_srcu;
pid_t userspace_pid;
};

#define kvm_err(fmt, ...) \
Expand Down
35 changes: 12 additions & 23 deletions virt/kvm/kvm_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -3883,7 +3883,6 @@ static const struct file_operations *stat_fops[] = {
static void kvm_uevent_notify_change(unsigned int type, struct kvm *kvm)
{
struct kobj_uevent_env *env;
char *tmp, *pathbuf = NULL;
unsigned long long created, active;

if (!kvm_dev.this_device || !kvm)
Expand All @@ -3907,38 +3906,28 @@ static void kvm_uevent_notify_change(unsigned int type, struct kvm *kvm)
add_uevent_var(env, "CREATED=%llu", created);
add_uevent_var(env, "COUNT=%llu", active);

if (type == KVM_EVENT_CREATE_VM)
if (type == KVM_EVENT_CREATE_VM) {
add_uevent_var(env, "EVENT=create");
else if (type == KVM_EVENT_DESTROY_VM)
kvm->userspace_pid = task_pid_nr(current);
} else if (type == KVM_EVENT_DESTROY_VM) {
add_uevent_var(env, "EVENT=destroy");
}
add_uevent_var(env, "PID=%d", kvm->userspace_pid);

if (kvm->debugfs_dentry) {
char p[ITOA_MAX_LEN];

snprintf(p, sizeof(p), "%s", kvm->debugfs_dentry->d_name.name);
tmp = strchrnul(p + 1, '-');
*tmp = '\0';
add_uevent_var(env, "PID=%s", p);
pathbuf = kmalloc(PATH_MAX, GFP_KERNEL);
if (pathbuf) {
/* sizeof counts the final '\0' */
int len = sizeof("STATS_PATH=") - 1;
const char *pvar = "STATS_PATH=";

tmp = dentry_path_raw(kvm->debugfs_dentry,
pathbuf + len,
PATH_MAX - len);
if (!IS_ERR(tmp)) {
memcpy(tmp - len, pvar, len);
env->envp[env->envp_idx++] = tmp - len;
}
char *tmp, *p = kmalloc(PATH_MAX, GFP_KERNEL);

if (p) {
tmp = dentry_path_raw(kvm->debugfs_dentry, p, PATH_MAX);
if (!IS_ERR(tmp))
add_uevent_var(env, "STATS_PATH=%s", tmp);
kfree(p);
}
}
/* no need for checks, since we are adding at most only 5 keys */
env->envp[env->envp_idx++] = NULL;
kobject_uevent_env(&kvm_dev.this_device->kobj, KOBJ_CHANGE, env->envp);
kfree(env);
kfree(pathbuf);
}

static int kvm_init_debug(void)
Expand Down

0 comments on commit fdeaf7e

Please sign in to comment.