mm/mempolicy.c: forbid static or relative flags for local NUMA mode
authorPiotr Kwapulinski <[email protected]>
Tue, 13 Dec 2016 00:42:49 +0000 (16:42 -0800)
committerLinus Torvalds <[email protected]>
Tue, 13 Dec 2016 02:55:07 +0000 (18:55 -0800)
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 or
mbind.

Return the "invalid argument" from set_mempolicy and mbind whenever any
of these flags is passed along with MPOL_LOCAL.

It is consistent with MPOL_PREFERRED passed with empty nodemask.

It 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).  Isolated tests done.

Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Piotr Kwapulinski <[email protected]>
Acked-by: David Rientjes <[email protected]>
Cc: Kirill A. Shutemov <[email protected]>
Cc: Vlastimil Babka <[email protected]>
Cc: Michal Hocko <[email protected]>
Cc: Liang Chen <[email protected]>
Cc: Mel Gorman <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: Nathan Zimmer <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
mm/mempolicy.c

index 4d58021dba344fb3519786adb172ddca5b40b11d..6d3639e1f254734ae62b13a04fb78c2153f1c7ba 100644 (file)
@@ -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))