diff options
Diffstat (limited to 'mm/mempolicy.c')
-rw-r--r-- | mm/mempolicy.c | 62 |
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 | */ |
1877 | int node_random(const nodemask_t *maskp) | 1877 | int 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 | */ |
2921 | int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol) | 2921 | void 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 | } |