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

Commit 58dbcd1a authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "thermal-core: Use rcu for accessing sensor list"

parents 9b1012bb c975089f
Loading
Loading
Loading
Loading
+28 −19
Original line number Diff line number Diff line
@@ -212,29 +212,38 @@ static DEFINE_MUTEX(sensor_list_lock);

static struct sensor_info *get_sensor(uint32_t sensor_id)
{
	struct sensor_info *pos, *var;
	struct sensor_info *pos = NULL, *matching_sensor = NULL;

	list_for_each_entry_safe(pos, var, &sensor_info_list, sensor_list) {
		if (pos->sensor_id == sensor_id)
			return pos;
	rcu_read_lock();
	list_for_each_entry_rcu(pos, &sensor_info_list, sensor_list) {
		if (pos->sensor_id == sensor_id) {
			matching_sensor = pos;
			break;
		}
	}
	rcu_read_unlock();

	return NULL;
	return matching_sensor;
}

int sensor_get_id(char *name)
{
	struct sensor_info *pos, *var;
	struct sensor_info *pos = NULL;
	int matching_id = -ENODEV;

	if (!name)
		return -ENODEV;
		return matching_id;

	list_for_each_entry_safe(pos, var, &sensor_info_list, sensor_list) {
		if (!strcmp(pos->tz->type, name))
			return pos->sensor_id;
	rcu_read_lock();
	list_for_each_entry_rcu(pos, &sensor_info_list, sensor_list) {
		if (!strcmp(pos->tz->type, name)) {
			matching_id = pos->sensor_id;
			break;
		}
	}
	rcu_read_unlock();

	return -ENODEV;
	return matching_id;
}
EXPORT_SYMBOL(sensor_get_id);

@@ -572,7 +581,7 @@ int sensor_init(struct thermal_zone_device *tz)
	sensor->max_idx = -1;
	sensor->min_idx = -1;
	mutex_init(&sensor->lock);
	INIT_LIST_HEAD(&sensor->sensor_list);
	INIT_LIST_HEAD_RCU(&sensor->sensor_list);
	INIT_LIST_HEAD_RCU(&sensor->threshold_list);
	INIT_LIST_HEAD(&tz->tz_threshold[0].list);
	INIT_LIST_HEAD(&tz->tz_threshold[1].list);
@@ -582,7 +591,7 @@ int sensor_init(struct thermal_zone_device *tz)
	tz->tz_threshold[1].notify = tz_notify_trip;
	tz->tz_threshold[1].data = tz;
	tz->tz_threshold[1].trip = THERMAL_TRIP_CONFIGURABLE_LOW;
	list_add(&sensor->sensor_list, &sensor_info_list);
	list_add_rcu(&sensor->sensor_list, &sensor_info_list);
	INIT_WORK(&sensor->work, sensor_update_work);
	init_completion(&sensor->sysfs_notify_complete);
	sensor->sysfs_notify_thread = kthread_run(sensor_sysfs_notify,
@@ -2378,7 +2387,7 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
	}

	mutex_lock(&thermal_list_lock);
	list_add_tail(&tz->node, &thermal_tz_list);
	list_add_tail_rcu(&tz->node, &thermal_tz_list);
	sensor_init(tz);
	mutex_unlock(&thermal_list_lock);

@@ -2426,7 +2435,7 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
		mutex_unlock(&thermal_list_lock);
		return;
	}
	list_del(&tz->node);
	list_del_rcu(&tz->node);

	/* Unbind all cdevs associated with 'this' thermal zone */
	list_for_each_entry(cdev, &thermal_cdev_list, node) {
@@ -2464,7 +2473,7 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
	flush_work(&tz->sensor.work);
	kthread_stop(tz->sensor.sysfs_notify_thread);
	mutex_lock(&thermal_list_lock);
	list_del(&tz->sensor.sensor_list);
	list_del_rcu(&tz->sensor.sensor_list);
	mutex_unlock(&thermal_list_lock);
	release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id);
	idr_destroy(&tz->idr);
@@ -2492,13 +2501,13 @@ struct thermal_zone_device *thermal_zone_get_zone_by_name(const char *name)
	if (!name)
		goto exit;

	mutex_lock(&thermal_list_lock);
	list_for_each_entry(pos, &thermal_tz_list, node)
	rcu_read_lock();
	list_for_each_entry_rcu(pos, &thermal_tz_list, node)
		if (!strncasecmp(name, pos->type, THERMAL_NAME_LENGTH)) {
			found++;
			ref = pos;
		}
	mutex_unlock(&thermal_list_lock);
	rcu_read_unlock();

	/* nothing has been found, thus an error code for it */
	if (found == 0)