aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorChris Metcalf <cmetcalf@ezchip.com>2015-03-30 16:33:00 -0400
committerChris Metcalf <cmetcalf@ezchip.com>2015-04-17 14:01:41 -0400
commit128f3cb9398b5eeb4ee04b60bd5e314f5c122821 (patch)
treea9cb1e04a11883d1ad9587779155cdd82d67958f /arch
parent437d3e124d25daaa671bfecfd4015ecd2503a955 (diff)
tile: nohz: warn if nohz_full uses hypervisor shared cores
The "hypervisor shared" cores are ones that the Tilera hypervisor uses to receive interrupts to manage hypervisor-owned devices. It's a bad idea to try to use those cores with nohz_full, since they will get interrupted unpredictably -- and invisibly to Linux tracing tools, since the interrupts are delivered at a higher privilege level to the Tilera hypervisor. Generate a clear warning at boot up that this doesn't end well for the nohz_full cores in question. Signed-off-by: Chris Metcalf <cmetcalf@ezchip.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/tile/include/hv/hypervisor.h6
-rw-r--r--arch/tile/kernel/setup.c23
2 files changed, 28 insertions, 1 deletions
diff --git a/arch/tile/include/hv/hypervisor.h b/arch/tile/include/hv/hypervisor.h
index dfcdeb61ba34..e0e6af4e783b 100644
--- a/arch/tile/include/hv/hypervisor.h
+++ b/arch/tile/include/hv/hypervisor.h
@@ -961,7 +961,11 @@ typedef enum {
961 HV_INQ_TILES_HFH_CACHE = 2, 961 HV_INQ_TILES_HFH_CACHE = 2,
962 962
963 /** The set of tiles that can be legally used as a LOTAR for a PTE. */ 963 /** The set of tiles that can be legally used as a LOTAR for a PTE. */
964 HV_INQ_TILES_LOTAR = 3 964 HV_INQ_TILES_LOTAR = 3,
965
966 /** The set of "shared" driver tiles that the hypervisor may
967 * periodically interrupt. */
968 HV_INQ_TILES_SHARED = 4
965} HV_InqTileSet; 969} HV_InqTileSet;
966 970
967/** Returns specific information about various sets of tiles within the 971/** Returns specific information about various sets of tiles within the
diff --git a/arch/tile/kernel/setup.c b/arch/tile/kernel/setup.c
index f1f579914952..7833b2ccdfbc 100644
--- a/arch/tile/kernel/setup.c
+++ b/arch/tile/kernel/setup.c
@@ -32,6 +32,7 @@
32#include <linux/hugetlb.h> 32#include <linux/hugetlb.h>
33#include <linux/start_kernel.h> 33#include <linux/start_kernel.h>
34#include <linux/screen_info.h> 34#include <linux/screen_info.h>
35#include <linux/tick.h>
35#include <asm/setup.h> 36#include <asm/setup.h>
36#include <asm/sections.h> 37#include <asm/sections.h>
37#include <asm/cacheflush.h> 38#include <asm/cacheflush.h>
@@ -1390,6 +1391,28 @@ static int __init dataplane(char *str)
1390 1391
1391early_param("dataplane", dataplane); 1392early_param("dataplane", dataplane);
1392 1393
1394#ifdef CONFIG_NO_HZ_FULL
1395/* Warn if hypervisor shared cpus are marked as nohz_full. */
1396static int __init check_nohz_full_cpus(void)
1397{
1398 struct cpumask shared;
1399 int cpu;
1400
1401 if (hv_inquire_tiles(HV_INQ_TILES_SHARED,
1402 (HV_VirtAddr) shared.bits, sizeof(shared)) < 0) {
1403 pr_warn("WARNING: No support for inquiring hv shared tiles\n");
1404 return 0;
1405 }
1406 for_each_cpu(cpu, &shared) {
1407 if (tick_nohz_full_cpu(cpu))
1408 pr_warn("WARNING: nohz_full cpu %d receives hypervisor interrupts!\n",
1409 cpu);
1410 }
1411 return 0;
1412}
1413arch_initcall(check_nohz_full_cpus);
1414#endif
1415
1393#ifdef CONFIG_CMDLINE_BOOL 1416#ifdef CONFIG_CMDLINE_BOOL
1394static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; 1417static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE;
1395#endif 1418#endif