|
@@ -19,7 +19,9 @@
|
|
|
#define pr_fmt(fmt) "CPU features: " fmt
|
|
|
|
|
|
#include <linux/bsearch.h>
|
|
|
+#include <linux/cpumask.h>
|
|
|
#include <linux/sort.h>
|
|
|
+#include <linux/stop_machine.h>
|
|
|
#include <linux/types.h>
|
|
|
#include <asm/cpu.h>
|
|
|
#include <asm/cpufeature.h>
|
|
@@ -941,7 +943,13 @@ void __init enable_cpu_capabilities(const struct arm64_cpu_capabilities *caps)
|
|
|
{
|
|
|
for (; caps->matches; caps++)
|
|
|
if (caps->enable && cpus_have_cap(caps->capability))
|
|
|
- on_each_cpu(caps->enable, NULL, true);
|
|
|
+ /*
|
|
|
+ * Use stop_machine() as it schedules the work allowing
|
|
|
+ * us to modify PSTATE, instead of on_each_cpu() which
|
|
|
+ * uses an IPI, giving us a PSTATE that disappears when
|
|
|
+ * we return.
|
|
|
+ */
|
|
|
+ stop_machine(caps->enable, NULL, cpu_online_mask);
|
|
|
}
|
|
|
|
|
|
/*
|