From 4bbdd9335a4784743a5ac30697f24972219559c2 Mon Sep 17 00:00:00 2001 From: Tvrtko Ursulin Date: Wed, 22 May 2024 17:12:16 +0100 Subject: [PATCH 1340/1350] mm/numa: Allow override of kernel's default NUMA policy Add numa_policy kernel argument to allow overriding the kernel's default NUMA policy at boot time. Syntax identical to what tmpfs accepts as it's mpol argument is accepted. Some examples: numa_policy=interleave numa_policy=interleave=skip-interleave numa_policy=bind:0-3,5,7,9-15 numa_policy=bind=static:1-2 Signed-off-by: Tvrtko Ursulin --- mm/mempolicy.c | 49 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -2974,7 +2974,9 @@ void __init numa_policy_init(void) /* Reset policy of current process to default */ void numa_default_policy(void) { - do_set_mempolicy(MPOL_DEFAULT, 0, NULL); + struct mempolicy *pol = &default_policy; + + do_set_mempolicy(pol->mode, pol->flags, &pol->nodes); } /* @@ -2992,7 +2994,6 @@ static const char * const policy_modes[] }; -#ifdef CONFIG_TMPFS /** * mpol_parse_str - parse string to mempolicy, for tmpfs mpol mount option. * @str: string containing mempolicy to parse @@ -3005,13 +3006,18 @@ static const char * const policy_modes[] */ int mpol_parse_str(char *str, struct mempolicy **mpol) { - struct mempolicy *new = NULL; + struct mempolicy *new; unsigned short mode_flags; nodemask_t nodes; char *nodelist = strchr(str, ':'); char *flags = strchr(str, '='); int err = 1, mode; + if (*mpol) + new = *mpol; + else + new = NULL; + if (flags) *flags++ = '\0'; /* terminate mode string */ @@ -3090,9 +3096,16 @@ int mpol_parse_str(char *str, struct mem goto out; } - new = mpol_new(mode, mode_flags, &nodes); - if (IS_ERR(new)) - goto out; + if (!new) { + new = mpol_new(mode, mode_flags, &nodes); + if (IS_ERR(new)) + goto out; + } else { + atomic_set(&new->refcnt, 1); + new->mode = mode; + new->flags = mode_flags; + new->home_node = NUMA_NO_NODE; + } /* * Save nodes for mpol_to_str() to show the tmpfs mount options @@ -3125,7 +3138,29 @@ out: *mpol = new; return err; } -#endif /* CONFIG_TMPFS */ + +static int __init setup_numapolicy(char *str) +{ + struct mempolicy pol = { }, *ppol = &pol; + char buf[128]; + int ret; + + if (str) + ret = mpol_parse_str(str, &ppol); + else + ret = -EINVAL; + + if (!ret) { + default_policy = pol; + mpol_to_str(buf, sizeof(buf), &pol); + pr_info("NUMA default policy overridden to '%s'\n", buf); + } else { + pr_warn("Unable to parse numa_policy=\n"); + } + + return ret == 0; +} +__setup("numa_policy=", setup_numapolicy); /** * mpol_to_str - format a mempolicy structure for printing