Commit 7b1b7961 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

cpuidle: Fail cpuidle device registration if there is one already



Refuse to register a cpuidle device if the given CPU has a cpuidle
device already and print a message regarding it.

Without this, an attempt to register a new cpuidle device without
unregistering the existing one leads to the removal of the existing
cpuidle device without removing its sysfs interface.

Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 8dba0fd9
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -635,8 +635,14 @@ static void __cpuidle_device_init(struct cpuidle_device *dev)
static int __cpuidle_register_device(struct cpuidle_device *dev)
{
	struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev);
	unsigned int cpu = dev->cpu;
	int i, ret;

	if (per_cpu(cpuidle_devices, cpu)) {
		pr_info("CPU%d: cpuidle device already registered\n", cpu);
		return -EEXIST;
	}

	if (!try_module_get(drv->owner))
		return -EINVAL;

@@ -648,7 +654,7 @@ static int __cpuidle_register_device(struct cpuidle_device *dev)
			dev->states_usage[i].disable |= CPUIDLE_STATE_DISABLED_BY_USER;
	}

	per_cpu(cpuidle_devices, dev->cpu) = dev;
	per_cpu(cpuidle_devices, cpu) = dev;
	list_add(&dev->device_list, &cpuidle_detected_devices);

	ret = cpuidle_coupled_register_device(dev);