Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fdeaf7e3 authored by Claudio Imbrenda's avatar Claudio Imbrenda Committed by Paolo Bonzini
Browse files

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: default avatarJanosch Frank <frankja@linux.vnet.ibm.com>
Fixes: 286de8f6 ("KVM: trigger uevents when creating or destroying a VM")
Signed-off-by: default avatarClaudio Imbrenda <imbrenda@linux.vnet.ibm.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent fa19871a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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, ...) \
+12 −23
Original line number Diff line number Diff line
@@ -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)
@@ -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];
		char *tmp, *p = kmalloc(PATH_MAX, GFP_KERNEL);

		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;
			}
		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)