Commit 128f3cb9398b5eeb4ee04b60bd5e314f5c122821

Authored by Chris Metcalf
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;