|
|
@@ -13,6 +13,7 @@
|
|
|
#include <linux/suspend.h>
|
|
|
#include <linux/scatterlist.h>
|
|
|
#include <linux/kdebug.h>
|
|
|
+#include <linux/cpu.h>
|
|
|
|
|
|
#include <crypto/hash.h>
|
|
|
|
|
|
@@ -363,3 +364,35 @@ int arch_hibernation_header_restore(void *addr)
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+int arch_resume_nosmt(void)
|
|
|
+{
|
|
|
+ int ret = 0;
|
|
|
+ /*
|
|
|
+ * We reached this while coming out of hibernation. This means
|
|
|
+ * that SMT siblings are sleeping in hlt, as mwait is not safe
|
|
|
+ * against control transition during resume (see comment in
|
|
|
+ * hibernate_resume_nonboot_cpu_disable()).
|
|
|
+ *
|
|
|
+ * If the resumed kernel has SMT disabled, we have to take all the
|
|
|
+ * SMT siblings out of hlt, and offline them again so that they
|
|
|
+ * end up in mwait proper.
|
|
|
+ *
|
|
|
+ * Called with hotplug disabled.
|
|
|
+ */
|
|
|
+ cpu_hotplug_enable();
|
|
|
+ if (cpu_smt_control == CPU_SMT_DISABLED ||
|
|
|
+ cpu_smt_control == CPU_SMT_FORCE_DISABLED) {
|
|
|
+ enum cpuhp_smt_control old = cpu_smt_control;
|
|
|
+
|
|
|
+ ret = cpuhp_smt_enable();
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
+ ret = cpuhp_smt_disable(old);
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+out:
|
|
|
+ cpu_hotplug_disable();
|
|
|
+ return ret;
|
|
|
+}
|