diff options
author | Chris Metcalf <cmetcalf@ezchip.com> | 2015-03-30 16:33:00 -0400 |
---|---|---|
committer | Chris Metcalf <cmetcalf@ezchip.com> | 2015-04-17 14:01:41 -0400 |
commit | 128f3cb9398b5eeb4ee04b60bd5e314f5c122821 (patch) | |
tree | a9cb1e04a11883d1ad9587779155cdd82d67958f /arch | |
parent | 437d3e124d25daaa671bfecfd4015ecd2503a955 (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.h | 6 | ||||
-rw-r--r-- | arch/tile/kernel/setup.c | 23 |
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 | ||
1391 | early_param("dataplane", dataplane); | 1392 | early_param("dataplane", dataplane); |
1392 | 1393 | ||
1394 | #ifdef CONFIG_NO_HZ_FULL | ||
1395 | /* Warn if hypervisor shared cpus are marked as nohz_full. */ | ||
1396 | static 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 | } | ||
1413 | arch_initcall(check_nohz_full_cpus); | ||
1414 | #endif | ||
1415 | |||
1393 | #ifdef CONFIG_CMDLINE_BOOL | 1416 | #ifdef CONFIG_CMDLINE_BOOL |
1394 | static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; | 1417 | static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; |
1395 | #endif | 1418 | #endif |