aboutsummaryrefslogtreecommitdiffstats
path: root/mm/mempolicy.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/mempolicy.c')
-rw-r--r--mm/mempolicy.c62
1 files changed, 21 insertions, 41 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 71cb253368cb..4cc19f6ab6c6 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -1125,7 +1125,7 @@ int do_migrate_pages(struct mm_struct *mm, const nodemask_t *from,
1125 tmp = *from; 1125 tmp = *from;
1126 while (!nodes_empty(tmp)) { 1126 while (!nodes_empty(tmp)) {
1127 int s,d; 1127 int s,d;
1128 int source = -1; 1128 int source = NUMA_NO_NODE;
1129 int dest = 0; 1129 int dest = 0;
1130 1130
1131 for_each_node_mask(s, tmp) { 1131 for_each_node_mask(s, tmp) {
@@ -1160,7 +1160,7 @@ int do_migrate_pages(struct mm_struct *mm, const nodemask_t *from,
1160 if (!node_isset(dest, tmp)) 1160 if (!node_isset(dest, tmp))
1161 break; 1161 break;
1162 } 1162 }
1163 if (source == -1) 1163 if (source == NUMA_NO_NODE)
1164 break; 1164 break;
1165 1165
1166 node_clear(source, tmp); 1166 node_clear(source, tmp);
@@ -1835,7 +1835,7 @@ static unsigned offset_il_node(struct mempolicy *pol,
1835 unsigned nnodes = nodes_weight(pol->v.nodes); 1835 unsigned nnodes = nodes_weight(pol->v.nodes);
1836 unsigned target; 1836 unsigned target;
1837 int c; 1837 int c;
1838 int nid = -1; 1838 int nid = NUMA_NO_NODE;
1839 1839
1840 if (!nnodes) 1840 if (!nnodes)
1841 return numa_node_id(); 1841 return numa_node_id();
@@ -1872,11 +1872,11 @@ static inline unsigned interleave_nid(struct mempolicy *pol,
1872 1872
1873/* 1873/*
1874 * Return the bit number of a random bit set in the nodemask. 1874 * Return the bit number of a random bit set in the nodemask.
1875 * (returns -1 if nodemask is empty) 1875 * (returns NUMA_NO_NODE if nodemask is empty)
1876 */ 1876 */
1877int node_random(const nodemask_t *maskp) 1877int node_random(const nodemask_t *maskp)
1878{ 1878{
1879 int w, bit = -1; 1879 int w, bit = NUMA_NO_NODE;
1880 1880
1881 w = nodes_weight(*maskp); 1881 w = nodes_weight(*maskp);
1882 if (w) 1882 if (w)
@@ -2914,62 +2914,45 @@ out:
2914 * @maxlen: length of @buffer 2914 * @maxlen: length of @buffer
2915 * @pol: pointer to mempolicy to be formatted 2915 * @pol: pointer to mempolicy to be formatted
2916 * 2916 *
2917 * Convert a mempolicy into a string. 2917 * Convert @pol into a string. If @buffer is too short, truncate the string.
2918 * Returns the number of characters in buffer (if positive) 2918 * Recommend a @maxlen of at least 32 for the longest mode, "interleave", the
2919 * or an error (negative) 2919 * longest flag, "relative", and to display at least a few node ids.
2920 */ 2920 */
2921int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol) 2921void mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol)
2922{ 2922{
2923 char *p = buffer; 2923 char *p = buffer;
2924 int l; 2924 nodemask_t nodes = NODE_MASK_NONE;
2925 nodemask_t nodes; 2925 unsigned short mode = MPOL_DEFAULT;
2926 unsigned short mode; 2926 unsigned short flags = 0;
2927 unsigned short flags = pol ? pol->flags : 0;
2928
2929 /*
2930 * Sanity check: room for longest mode, flag and some nodes
2931 */
2932 VM_BUG_ON(maxlen < strlen("interleave") + strlen("relative") + 16);
2933 2927
2934 if (!pol || pol == &default_policy) 2928 if (pol && pol != &default_policy) {
2935 mode = MPOL_DEFAULT;
2936 else
2937 mode = pol->mode; 2929 mode = pol->mode;
2930 flags = pol->flags;
2931 }
2938 2932
2939 switch (mode) { 2933 switch (mode) {
2940 case MPOL_DEFAULT: 2934 case MPOL_DEFAULT:
2941 nodes_clear(nodes);
2942 break; 2935 break;
2943
2944 case MPOL_PREFERRED: 2936 case MPOL_PREFERRED:
2945 nodes_clear(nodes);
2946 if (flags & MPOL_F_LOCAL) 2937 if (flags & MPOL_F_LOCAL)
2947 mode = MPOL_LOCAL; 2938 mode = MPOL_LOCAL;
2948 else 2939 else
2949 node_set(pol->v.preferred_node, nodes); 2940 node_set(pol->v.preferred_node, nodes);
2950 break; 2941 break;
2951
2952 case MPOL_BIND: 2942 case MPOL_BIND:
2953 /* Fall through */
2954 case MPOL_INTERLEAVE: 2943 case MPOL_INTERLEAVE:
2955 nodes = pol->v.nodes; 2944 nodes = pol->v.nodes;
2956 break; 2945 break;
2957
2958 default: 2946 default:
2959 return -EINVAL; 2947 WARN_ON_ONCE(1);
2948 snprintf(p, maxlen, "unknown");
2949 return;
2960 } 2950 }
2961 2951
2962 l = strlen(policy_modes[mode]); 2952 p += snprintf(p, maxlen, policy_modes[mode]);
2963 if (buffer + maxlen < p + l + 1)
2964 return -ENOSPC;
2965
2966 strcpy(p, policy_modes[mode]);
2967 p += l;
2968 2953
2969 if (flags & MPOL_MODE_FLAGS) { 2954 if (flags & MPOL_MODE_FLAGS) {
2970 if (buffer + maxlen < p + 2) 2955 p += snprintf(p, buffer + maxlen - p, "=");
2971 return -ENOSPC;
2972 *p++ = '=';
2973 2956
2974 /* 2957 /*
2975 * Currently, the only defined flags are mutually exclusive 2958 * Currently, the only defined flags are mutually exclusive
@@ -2981,10 +2964,7 @@ int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol)
2981 } 2964 }
2982 2965
2983 if (!nodes_empty(nodes)) { 2966 if (!nodes_empty(nodes)) {
2984 if (buffer + maxlen < p + 2) 2967 p += snprintf(p, buffer + maxlen - p, ":");
2985 return -ENOSPC;
2986 *p++ = ':';
2987 p += nodelist_scnprintf(p, buffer + maxlen - p, nodes); 2968 p += nodelist_scnprintf(p, buffer + maxlen - p, nodes);
2988 } 2969 }
2989 return p - buffer;
2990} 2970}