[PATCH 2/2] cputree: irqbalance bans adaptive-ticks CPUs
Petr Holasek
pholasek at redhat.com
Wed Aug 26 05:15:50 PDT 2015
User can set some adaptive-ticks CPUs through kernel parameter
nohz_full= so these CPUs won't receive any scheduling clock when
there will be less than 2 running tasks. Thus assigning IRQs to
these CPUs would harm performance of tasks pinned there.
Signed-off-by: Petr Holasek <pholasek at redhat.com>
---
cputree.c | 30 ++++++++++++++++++------------
1 file changed, 18 insertions(+), 12 deletions(-)
diff --git a/cputree.c b/cputree.c
index dce85f9..54b3d05 100644
--- a/cputree.c
+++ b/cputree.c
@@ -60,10 +60,14 @@ cpumask_t unbanned_cpus;
/*
* By default do not place IRQs on CPUs the kernel keeps isolated,
- * as specified through the isolcpus= boot commandline. Users can
- * override this with the IRQBALANCE_BANNED_CPUS environment variable.
- */
-static int find_cmdline_cpumask(const char *param, char *line, cpumask_t out)
+ * as specified through the isolcpus= boot commandline. Also do not
+ * place IRQs on adaptive-ticks CPUs not receiving scheduling-clock
+ * while running only one task specified through the nohz_full= boot
+ * commandline argument.
+ * Users can override this with the IRQBALANCE_BANNED_CPUS environment
+ * variable.
+*/
+static void find_cmdline_cpumask(const char *param, char *line, cpumask_t *out)
{
char *c;
@@ -75,12 +79,8 @@ static int find_cmdline_cpumask(const char *param, char *line, cpumask_t out)
for (end = c; *end != ' ' && *end != '\0' && *end != '\n'; end++);
len = end - c;
- cpulist_parse(c, len, out);
-
- return 0;
+ cpulist_parse(c, len, *out);
}
-
- return 1;
}
static void setup_banned_cpus(void)
@@ -89,6 +89,8 @@ static void setup_banned_cpus(void)
char *line = NULL;
size_t size = 0;
const char *isolcpus = "isolcpus=";
+ const char *nohz_full = "nohz_full=";
+ cpumask_t isolcpus_mask, nohz_full_mask;
char buffer[4096];
/* A manually specified cpumask overrides auto-detection. */
@@ -104,14 +106,18 @@ static void setup_banned_cpus(void)
if (getline(&line, &size, file) <= 0)
goto out2;
- find_cmdline_cpumask(isolcpus, line, banned_cpus);
+ find_cmdline_cpumask(isolcpus, line, &isolcpus_mask);
+ find_cmdline_cpumask(nohz_full, line, &nohz_full_mask);
+ cpus_or(banned_cpus, isolcpus_mask, nohz_full_mask);
+ free(line);
out2:
fclose(file);
out:
- cpumask_scnprintf(buffer, 4096, banned_cpus);
+ cpumask_scnprintf(buffer, 4096, isolcpus_mask);
log(TO_CONSOLE, LOG_INFO, "Isolated CPUs: %s\n", buffer);
- free(line);
+ cpumask_scnprintf(buffer, 4096, nohz_full_mask);
+ log(TO_CONSOLE, LOG_INFO, "Adaptive-tisks CPUs: %s\n", buffer);
}
static struct topo_obj* add_cache_domain_to_package(struct topo_obj *cache,
--
2.4.3
More information about the irqbalance
mailing list