mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
ACPI: Thermal: Drop concurrent thermal checks
Fix for #3686, where get_temperature() may cause thermal notify, which causes one more get_temperature(). Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
21bc42ab85
commit
6e2157858a
1 changed files with 10 additions and 5 deletions
|
@ -195,6 +195,7 @@ struct acpi_thermal {
|
||||||
struct acpi_thermal_trips trips;
|
struct acpi_thermal_trips trips;
|
||||||
struct acpi_handle_list devices;
|
struct acpi_handle_list devices;
|
||||||
struct timer_list timer;
|
struct timer_list timer;
|
||||||
|
struct mutex lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct file_operations acpi_thermal_state_fops = {
|
static const struct file_operations acpi_thermal_state_fops = {
|
||||||
|
@ -721,11 +722,15 @@ static void acpi_thermal_check(void *data)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if someone else is already running */
|
||||||
|
if (!mutex_trylock(&tz->lock))
|
||||||
|
return;
|
||||||
|
|
||||||
state = tz->state;
|
state = tz->state;
|
||||||
|
|
||||||
result = acpi_thermal_get_temperature(tz);
|
result = acpi_thermal_get_temperature(tz);
|
||||||
if (result)
|
if (result)
|
||||||
return;
|
goto unlock;
|
||||||
|
|
||||||
memset(&tz->state, 0, sizeof(tz->state));
|
memset(&tz->state, 0, sizeof(tz->state));
|
||||||
|
|
||||||
|
@ -816,8 +821,8 @@ static void acpi_thermal_check(void *data)
|
||||||
add_timer(&(tz->timer));
|
add_timer(&(tz->timer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
unlock:
|
||||||
return;
|
mutex_unlock(&tz->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
|
@ -1254,7 +1259,7 @@ static int acpi_thermal_add(struct acpi_device *device)
|
||||||
strcpy(acpi_device_name(device), ACPI_THERMAL_DEVICE_NAME);
|
strcpy(acpi_device_name(device), ACPI_THERMAL_DEVICE_NAME);
|
||||||
strcpy(acpi_device_class(device), ACPI_THERMAL_CLASS);
|
strcpy(acpi_device_class(device), ACPI_THERMAL_CLASS);
|
||||||
acpi_driver_data(device) = tz;
|
acpi_driver_data(device) = tz;
|
||||||
|
mutex_init(&tz->lock);
|
||||||
result = acpi_thermal_get_info(tz);
|
result = acpi_thermal_get_info(tz);
|
||||||
if (result)
|
if (result)
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -1324,7 +1329,7 @@ static int acpi_thermal_remove(struct acpi_device *device, int type)
|
||||||
}
|
}
|
||||||
|
|
||||||
acpi_thermal_remove_fs(device);
|
acpi_thermal_remove_fs(device);
|
||||||
|
mutex_destroy(&tz->lock);
|
||||||
kfree(tz);
|
kfree(tz);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue