Commit 128f3cb9 authored by Chris Metcalf's avatar Chris Metcalf

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: default avatarChris Metcalf <cmetcalf@ezchip.com>
parent 437d3e12
...@@ -961,7 +961,11 @@ typedef enum { ...@@ -961,7 +961,11 @@ typedef enum {
HV_INQ_TILES_HFH_CACHE = 2, HV_INQ_TILES_HFH_CACHE = 2,
/** The set of tiles that can be legally used as a LOTAR for a PTE. */ /** The set of tiles that can be legally used as a LOTAR for a PTE. */
HV_INQ_TILES_LOTAR = 3 HV_INQ_TILES_LOTAR = 3,
/** The set of "shared" driver tiles that the hypervisor may
* periodically interrupt. */
HV_INQ_TILES_SHARED = 4
} HV_InqTileSet; } HV_InqTileSet;
/** Returns specific information about various sets of tiles within the /** Returns specific information about various sets of tiles within the
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <linux/hugetlb.h> #include <linux/hugetlb.h>
#include <linux/start_kernel.h> #include <linux/start_kernel.h>
#include <linux/screen_info.h> #include <linux/screen_info.h>
#include <linux/tick.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/sections.h> #include <asm/sections.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
...@@ -1390,6 +1391,28 @@ static int __init dataplane(char *str) ...@@ -1390,6 +1391,28 @@ static int __init dataplane(char *str)
early_param("dataplane", dataplane); early_param("dataplane", dataplane);
#ifdef CONFIG_NO_HZ_FULL
/* Warn if hypervisor shared cpus are marked as nohz_full. */
static int __init check_nohz_full_cpus(void)
{
struct cpumask shared;
int cpu;
if (hv_inquire_tiles(HV_INQ_TILES_SHARED,
(HV_VirtAddr) shared.bits, sizeof(shared)) < 0) {
pr_warn("WARNING: No support for inquiring hv shared tiles\n");
return 0;
}
for_each_cpu(cpu, &shared) {
if (tick_nohz_full_cpu(cpu))
pr_warn("WARNING: nohz_full cpu %d receives hypervisor interrupts!\n",
cpu);
}
return 0;
}
arch_initcall(check_nohz_full_cpus);
#endif
#ifdef CONFIG_CMDLINE_BOOL #ifdef CONFIG_CMDLINE_BOOL
static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE;
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment