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

Commit 7d366a63 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "PM / devfreq: Fix race condition between suspend/resume and governor_store"

parents cf504cec 6262d6bc
Loading
Loading
Loading
Loading
+21 −12
Original line number Diff line number Diff line
@@ -522,7 +522,7 @@ static void devfreq_dev_release(struct device *dev)
		devfreq->profile->exit(devfreq->dev.parent);

	mutex_destroy(&devfreq->lock);
	mutex_destroy(&devfreq->sysfs_lock);
	mutex_destroy(&devfreq->event_lock);
	kfree(devfreq);
}

@@ -565,7 +565,7 @@ struct devfreq *devfreq_add_device(struct device *dev,
	}

	mutex_init(&devfreq->lock);
	mutex_init(&devfreq->sysfs_lock);
	mutex_init(&devfreq->event_lock);
	mutex_lock(&devfreq->lock);
	devfreq->dev.parent = dev;
	devfreq->dev.class = devfreq_class;
@@ -777,14 +777,19 @@ EXPORT_SYMBOL(devm_devfreq_remove_device);
 */
int devfreq_suspend_device(struct devfreq *devfreq)
{
	int ret;

	if (!devfreq)
		return -EINVAL;

	if (!devfreq->governor)
		return 0;

	return devfreq->governor->event_handler(devfreq,
	mutex_lock(&devfreq->event_lock);
	ret = devfreq->governor->event_handler(devfreq,
				DEVFREQ_GOV_SUSPEND, NULL);
	mutex_unlock(&devfreq->event_lock);
	return ret;
}
EXPORT_SYMBOL(devfreq_suspend_device);

@@ -798,14 +803,18 @@ EXPORT_SYMBOL(devfreq_suspend_device);
 */
int devfreq_resume_device(struct devfreq *devfreq)
{
	int ret;
	if (!devfreq)
		return -EINVAL;

	if (!devfreq->governor)
		return 0;

	return devfreq->governor->event_handler(devfreq,
	mutex_lock(&devfreq->event_lock);
	ret = devfreq->governor->event_handler(devfreq,
				DEVFREQ_GOV_RESUME, NULL);
	mutex_unlock(&devfreq->event_lock);
	return ret;
}
EXPORT_SYMBOL(devfreq_resume_device);

@@ -965,7 +974,7 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
		goto out;
	}

	mutex_lock(&df->sysfs_lock);
	mutex_lock(&df->event_lock);
	if (df->governor) {
		ret = df->governor->event_handler(df, DEVFREQ_GOV_STOP, NULL);
		if (ret) {
@@ -991,7 +1000,7 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
	}

gov_stop_out:
	mutex_unlock(&df->sysfs_lock);
	mutex_unlock(&df->event_lock);
out:
	mutex_unlock(&devfreq_list_lock);

@@ -1086,10 +1095,10 @@ static ssize_t polling_interval_store(struct device *dev,
	if (ret != 1)
		return -EINVAL;

	mutex_lock(&df->sysfs_lock);
	mutex_lock(&df->event_lock);
	df->governor->event_handler(df, DEVFREQ_GOV_INTERVAL, &value);
	ret = count;
	mutex_unlock(&df->sysfs_lock);
	mutex_unlock(&df->event_lock);

	return ret;
}
@@ -1107,7 +1116,7 @@ static ssize_t min_freq_store(struct device *dev, struct device_attribute *attr,
	if (ret != 1)
		return -EINVAL;

	mutex_lock(&df->sysfs_lock);
	mutex_lock(&df->event_lock);
	mutex_lock(&df->lock);
	max = df->max_freq;
	if (value && max && value > max) {
@@ -1120,7 +1129,7 @@ static ssize_t min_freq_store(struct device *dev, struct device_attribute *attr,
	ret = count;
unlock:
	mutex_unlock(&df->lock);
	mutex_unlock(&df->sysfs_lock);
	mutex_unlock(&df->event_lock);
	return ret;
}

@@ -1136,7 +1145,7 @@ static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr,
	if (ret != 1)
		return -EINVAL;

	mutex_lock(&df->sysfs_lock);
	mutex_lock(&df->event_lock);
	mutex_lock(&df->lock);
	min = df->min_freq;
	if (value && min && value < min) {
@@ -1149,7 +1158,7 @@ static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr,
	ret = count;
unlock:
	mutex_unlock(&df->lock);
	mutex_unlock(&df->sysfs_lock);
	mutex_unlock(&df->event_lock);
	return ret;
}

+1 −1
Original line number Diff line number Diff line
@@ -139,7 +139,7 @@ struct devfreq {
	struct list_head node;

	struct mutex lock;
	struct mutex sysfs_lock;
	struct mutex event_lock;
	struct device dev;
	struct devfreq_dev_profile *profile;
	const struct devfreq_governor *governor;