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

PM: sleep: stats: Use locking in dpm_save_failed_dev()



Because dpm_save_failed_dev() may be called simultaneously by multiple
failing device PM functions, the state of the suspend_stats fields
updated by it may become inconsistent.

Prevent that from happening by using a lock in dpm_save_failed_dev().

Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: default avatarStanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
Reviewed-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 4add3e72
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -325,13 +325,18 @@ struct suspend_stats {
};

static struct suspend_stats suspend_stats;
static DEFINE_MUTEX(suspend_stats_lock);

void dpm_save_failed_dev(const char *name)
{
	mutex_lock(&suspend_stats_lock);

	strscpy(suspend_stats.failed_devs[suspend_stats.last_failed_dev],
		name, sizeof(suspend_stats.failed_devs[0]));
	suspend_stats.last_failed_dev++;
	suspend_stats.last_failed_dev %= REC_FAILED_NUM;

	mutex_unlock(&suspend_stats_lock);
}

void dpm_save_failed_step(enum suspend_stat_step step)