Thread (24 messages) 24 messages, 6 authors, 2016-11-01

Re: [PATCH] mm/mempolicy.c: forbid static or relative flags for local NUMA mode

From: Piotr Kwapulinski <hidden>
Date: 2016-09-20 15:47:26
Also in: lkml

On Mon, Sep 19, 2016 at 01:52:05PM +0200, Michal Hocko wrote:
On Sun 18-09-16 13:29:43, Piotr Kwapulinski wrote:
quoted
The MPOL_F_STATIC_NODES and MPOL_F_RELATIVE_NODES flags are irrelevant
when setting them for MPOL_LOCAL NUMA memory policy via set_mempolicy.
Return the "invalid argument" from set_mempolicy whenever
any of these flags is passed along with MPOL_LOCAL.
man 2 set_mempolicy doesn't list this as invalid option. Maybe this is a
documentation bug but is it possible that somebody will see this as an
unexpected error?
The MPOL_LOCAL is currently not documented in "man set_mempolicy(2)".
In case the nodemask is empty for MPOL_LOCAL it is transformed into MPOL_PREFERRED.
The motivation for disabling MPOL_F_STATIC_NODES and MPOL_F_RELATIVE_NODES
flags for MPOL_PREFERRED with empty nodemask is described at this commit
3e1f064562fcff7. Currently I call set_mempolicy(MPOL_LOCAL, ...) via the syscall()
but despite of that it is inconsistent with MPOL_PREFERRED.
quoted
It is consistent with MPOL_PREFERRED passed with empty nodemask.
It also slightly shortens the execution time in paths where these flags
are used e.g. when trying to rebind the NUMA nodes for changes in
cgroups cpuset mems (mpol_rebind_preferred()) or when just printing
the mempolicy structure (/proc/PID/numa_maps).
I am not sure I understand this argument. What does this patch actually
fix? If this is about the execution time then why not just bail out
early when MPOL_LOCAL && (MPOL_F_STATIC_NODES || MPOL_F_RELATIVE_NODES)
The mpol_new() performs additional checks on nodemask.
quoted
Isolated tests done.

Signed-off-by: Piotr Kwapulinski <redacted>
---
 mm/mempolicy.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 2da72a5..27b07d1 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -276,7 +276,9 @@ static struct mempolicy *mpol_new(unsigned short mode, unsigned short flags,
 				return ERR_PTR(-EINVAL);
 		}
 	} else if (mode == MPOL_LOCAL) {
-		if (!nodes_empty(*nodes))
+		if (!nodes_empty(*nodes) ||
+		    (flags & MPOL_F_STATIC_NODES) ||
+		    (flags & MPOL_F_RELATIVE_NODES))
 			return ERR_PTR(-EINVAL);
 		mode = MPOL_PREFERRED;
 	} else if (nodes_empty(*nodes))
-- 
2.9.2
-- 
Michal Hocko
SUSE Labs
--
Piotr Kwapulinski

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help