|
@@ -214,7 +214,20 @@ static void cpa_flush_array(unsigned long *start, int numpages, int cache,
|
|
|
int in_flags, struct page **pages)
|
|
|
{
|
|
|
unsigned int i, level;
|
|
|
+#ifdef CONFIG_PREEMPT
|
|
|
+ /*
|
|
|
+ * Avoid wbinvd() because it causes latencies on all CPUs,
|
|
|
+ * regardless of any CPU isolation that may be in effect.
|
|
|
+ *
|
|
|
+ * This should be extended for CAT enabled systems independent of
|
|
|
+ * PREEMPT because wbinvd() does not respect the CAT partitions and
|
|
|
+ * this is exposed to unpriviledged users through the graphics
|
|
|
+ * subsystem.
|
|
|
+ */
|
|
|
+ unsigned long do_wbinvd = 0;
|
|
|
+#else
|
|
|
unsigned long do_wbinvd = cache && numpages >= 1024; /* 4M threshold */
|
|
|
+#endif
|
|
|
|
|
|
BUG_ON(irqs_disabled());
|
|
|
|