#include <linux/rbtree.h>
#include <linux/spinlock.h>
#include <linux/nodemask.h>
+#include <linux/pagemap.h>
struct mm_struct;
spinlock_t lock;
};
-void mpol_shared_policy_init(struct shared_policy *info, unsigned short mode,
- unsigned short flags, nodemask_t *nodes);
+void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol);
int mpol_set_shared_policy(struct shared_policy *info,
struct vm_area_struct *vma,
struct mempolicy *new);
#ifdef CONFIG_TMPFS
-extern int mpol_parse_str(char *str, unsigned short *mode,
- unsigned short *mode_flags, nodemask_t *policy_nodes);
+extern int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context);
-extern int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol);
+extern int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol,
+ int no_context);
#endif
+
+/* Check if a vma is migratable */
+static inline int vma_migratable(struct vm_area_struct *vma)
+{
+ if (vma->vm_flags & (VM_IO|VM_HUGETLB|VM_PFNMAP|VM_RESERVED))
+ return 0;
+ /*
+ * Migration allocates pages in the highest zone. If we cannot
+ * do so then migration (at least from node to node) is not
+ * possible.
+ */
+ if (vma->vm_file &&
+ gfp_zone(mapping_gfp_mask(vma->vm_file->f_mapping))
+ < policy_zone)
+ return 0;
+ return 1;
+}
+
#else
struct mempolicy {};
return -EINVAL;
}
-static inline void mpol_shared_policy_init(struct shared_policy *info,
- unsigned short mode, unsigned short flags, nodemask_t *nodes)
+static inline void mpol_shared_policy_init(struct shared_policy *sp,
+ struct mempolicy *mpol)
{
}
}
#ifdef CONFIG_TMPFS
-static inline int mpol_parse_str(char *value, unsigned short *policy,
- unsigned short flags, nodemask_t *policy_nodes)
+static inline int mpol_parse_str(char *str, struct mempolicy **mpol,
+ int no_context)
{
- return 1;
+ return 1; /* error */
}
-static inline int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol)
+static inline int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol,
+ int no_context)
{
return 0;
}