Commit 128f3cb9398b5eeb4ee04b60bd5e314f5c122821
1 parent
437d3e124d
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>
Showing 2 changed files with 28 additions and 1 deletions Side-by-side Diff
arch/tile/include/hv/hypervisor.h
... | ... | @@ -961,7 +961,11 @@ |
961 | 961 | HV_INQ_TILES_HFH_CACHE = 2, |
962 | 962 | |
963 | 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 | 969 | } HV_InqTileSet; |
966 | 970 | |
967 | 971 | /** Returns specific information about various sets of tiles within the |
arch/tile/kernel/setup.c
... | ... | @@ -32,6 +32,7 @@ |
32 | 32 | #include <linux/hugetlb.h> |
33 | 33 | #include <linux/start_kernel.h> |
34 | 34 | #include <linux/screen_info.h> |
35 | +#include <linux/tick.h> | |
35 | 36 | #include <asm/setup.h> |
36 | 37 | #include <asm/sections.h> |
37 | 38 | #include <asm/cacheflush.h> |
... | ... | @@ -1389,6 +1390,28 @@ |
1389 | 1390 | } |
1390 | 1391 | |
1391 | 1392 | early_param("dataplane", dataplane); |
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 | |
1392 | 1415 | |
1393 | 1416 | #ifdef CONFIG_CMDLINE_BOOL |
1394 | 1417 | static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; |