KVM: make pid available for uevents without debugfs
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 <frankja@linux.vnet.ibm.com>
Fixes: 286de8f6ac
("KVM: trigger uevents when creating or destroying a VM")
Signed-off-by: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
fa19871a16
commit
fdeaf7e3eb
|
@ -445,6 +445,7 @@ struct kvm {
|
||||||
struct kvm_stat_data **debugfs_stat_data;
|
struct kvm_stat_data **debugfs_stat_data;
|
||||||
struct srcu_struct srcu;
|
struct srcu_struct srcu;
|
||||||
struct srcu_struct irq_srcu;
|
struct srcu_struct irq_srcu;
|
||||||
|
pid_t userspace_pid;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define kvm_err(fmt, ...) \
|
#define kvm_err(fmt, ...) \
|
||||||
|
|
|
@ -3883,7 +3883,6 @@ static const struct file_operations *stat_fops[] = {
|
||||||
static void kvm_uevent_notify_change(unsigned int type, struct kvm *kvm)
|
static void kvm_uevent_notify_change(unsigned int type, struct kvm *kvm)
|
||||||
{
|
{
|
||||||
struct kobj_uevent_env *env;
|
struct kobj_uevent_env *env;
|
||||||
char *tmp, *pathbuf = NULL;
|
|
||||||
unsigned long long created, active;
|
unsigned long long created, active;
|
||||||
|
|
||||||
if (!kvm_dev.this_device || !kvm)
|
if (!kvm_dev.this_device || !kvm)
|
||||||
|
@ -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, "CREATED=%llu", created);
|
||||||
add_uevent_var(env, "COUNT=%llu", active);
|
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");
|
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, "EVENT=destroy");
|
||||||
|
}
|
||||||
|
add_uevent_var(env, "PID=%d", kvm->userspace_pid);
|
||||||
|
|
||||||
if (kvm->debugfs_dentry) {
|
if (kvm->debugfs_dentry) {
|
||||||
char p[ITOA_MAX_LEN];
|
char *tmp, *p = kmalloc(PATH_MAX, GFP_KERNEL);
|
||||||
|
|
||||||
snprintf(p, sizeof(p), "%s", kvm->debugfs_dentry->d_name.name);
|
if (p) {
|
||||||
tmp = strchrnul(p + 1, '-');
|
tmp = dentry_path_raw(kvm->debugfs_dentry, p, PATH_MAX);
|
||||||
*tmp = '\0';
|
if (!IS_ERR(tmp))
|
||||||
add_uevent_var(env, "PID=%s", p);
|
add_uevent_var(env, "STATS_PATH=%s", tmp);
|
||||||
pathbuf = kmalloc(PATH_MAX, GFP_KERNEL);
|
kfree(p);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* no need for checks, since we are adding at most only 5 keys */
|
/* no need for checks, since we are adding at most only 5 keys */
|
||||||
env->envp[env->envp_idx++] = NULL;
|
env->envp[env->envp_idx++] = NULL;
|
||||||
kobject_uevent_env(&kvm_dev.this_device->kobj, KOBJ_CHANGE, env->envp);
|
kobject_uevent_env(&kvm_dev.this_device->kobj, KOBJ_CHANGE, env->envp);
|
||||||
kfree(env);
|
kfree(env);
|
||||||
kfree(pathbuf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int kvm_init_debug(void)
|
static int kvm_init_debug(void)
|
||||||
|
|
Loading…
Reference in New Issue