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/tile/kernel | |
| 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/tile/kernel')
| -rw-r--r-- | arch/tile/kernel/setup.c | 23 |
1 files changed, 23 insertions, 0 deletions
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 |
