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>
This commit is contained in:
parent
437d3e124d
commit
128f3cb939
2 changed files with 28 additions and 1 deletions
|
@ -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 @@
|
||||||
#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)
|
||||||
|
|
||||||
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
|
||||||
|
|
Loading…
Add table
Reference in a new issue