]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
PM: sleep: stats: Use locking in dpm_save_failed_dev()
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 29 Jan 2024 16:24:30 +0000 (17:24 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 5 Feb 2024 13:28:54 +0000 (14:28 +0100)
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: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
kernel/power/main.c

index 8c4bf5a548055c6b6abb7e37a46cd06fadc24c99..a9e0693aaf699764d6afcad4fa5b134372c837e6 100644 (file)
@@ -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)