mempolicy: rename mpol_free to mpol_put
[firefly-linux-kernel-4.4.55.git] / include / linux / mempolicy.h
index 59c4865bc85f13fbe36beefd959ab499f1d5aaaf..507bf5e29f2436dbe5fbeafd1c733dad01c1bc13 100644 (file)
@@ -8,15 +8,32 @@
  * Copyright 2003,2004 Andi Kleen SuSE Labs
  */
 
+/*
+ * Both the MPOL_* mempolicy mode and the MPOL_F_* optional mode flags are
+ * passed by the user to either set_mempolicy() or mbind() in an 'int' actual.
+ * The MPOL_MODE_FLAGS macro determines the legal set of optional mode flags.
+ */
+
 /* Policies */
-#define MPOL_DEFAULT   0
-#define MPOL_PREFERRED 1
-#define MPOL_BIND      2
-#define MPOL_INTERLEAVE        3
+enum {
+       MPOL_DEFAULT,
+       MPOL_PREFERRED,
+       MPOL_BIND,
+       MPOL_INTERLEAVE,
+       MPOL_MAX,       /* always last member of enum */
+};
 
-#define MPOL_MAX MPOL_INTERLEAVE
+/* Flags for set_mempolicy */
+#define MPOL_F_STATIC_NODES    (1 << 15)
+#define MPOL_F_RELATIVE_NODES  (1 << 14)
 
-/* Flags for get_mem_policy */
+/*
+ * MPOL_MODE_FLAGS is the union of all possible optional mode flags passed to
+ * either set_mempolicy() or mbind().
+ */
+#define MPOL_MODE_FLAGS        (MPOL_F_STATIC_NODES | MPOL_F_RELATIVE_NODES)
+
+/* Flags for get_mempolicy */
 #define MPOL_F_NODE    (1<<0)  /* return next IL mode instead of node mask */
 #define MPOL_F_ADDR    (1<<1)  /* look up vma using address */
 #define MPOL_F_MEMS_ALLOWED (1<<2) /* return allowed memories */
@@ -35,7 +52,6 @@
 #include <linux/spinlock.h>
 #include <linux/nodemask.h>
 
-struct vm_area_struct;
 struct mm_struct;
 
 #ifdef CONFIG_NUMA
@@ -54,22 +70,27 @@ struct mm_struct;
  * mmap_sem.
  *
  * Freeing policy:
- * When policy is MPOL_BIND v.zonelist is kmalloc'ed and must be kfree'd.
- * All other policies don't have any external state. mpol_free() handles this.
+ * Mempolicy objects are reference counted.  A mempolicy will be freed when
+ * mpol_put() decrements the reference count to zero.
  *
  * Copying policy objects:
- * For MPOL_BIND the zonelist must be always duplicated. mpol_clone() does this.
+ * mpol_copy() allocates a new mempolicy and copies the specified mempolicy
+ * to the new storage.  The reference count of the new object is initialized
+ * to 1, representing the caller of mpol_copy().
  */
 struct mempolicy {
        atomic_t refcnt;
-       short policy;   /* See MPOL_* above */
+       unsigned short policy;  /* See MPOL_* above */
+       unsigned short flags;   /* See set_mempolicy() MPOL_F_* above */
        union {
-               struct zonelist  *zonelist;     /* bind */
                short            preferred_node; /* preferred */
-               nodemask_t       nodes;         /* interleave */
+               nodemask_t       nodes;         /* interleave/bind */
                /* undefined for default */
        } v;
-       nodemask_t cpuset_mems_allowed; /* mempolicy relative to these nodes */
+       union {
+               nodemask_t cpuset_mems_allowed; /* relative to these nodes */
+               nodemask_t user_nodemask;       /* nodemask passed by user */
+       } w;
 };
 
 /*
@@ -77,11 +98,11 @@ struct mempolicy {
  * The default fast path of a NULL MPOL_DEFAULT policy is always inlined.
  */
 
-extern void __mpol_free(struct mempolicy *pol);
-static inline void mpol_free(struct mempolicy *pol)
+extern void __mpol_put(struct mempolicy *pol);
+static inline void mpol_put(struct mempolicy *pol)
 {
        if (pol)
-               __mpol_free(pol);
+               __mpol_put(pol);
 }
 
 extern struct mempolicy *__mpol_copy(struct mempolicy *pol);
@@ -108,11 +129,6 @@ static inline int mpol_equal(struct mempolicy *a, struct mempolicy *b)
                return 1;
        return __mpol_equal(a, b);
 }
-#define vma_mpol_equal(a,b) mpol_equal(vma_policy(a), vma_policy(b))
-
-/* Could later add inheritance of the process policy here. */
-
-#define mpol_set_vma_default(vma) ((vma)->vm_policy = NULL)
 
 /*
  * Tree of shared policies for a shared memory region.
@@ -133,8 +149,8 @@ struct shared_policy {
        spinlock_t lock;
 };
 
-void mpol_shared_policy_init(struct shared_policy *info, int policy,
-                               nodemask_t *nodes);
+void mpol_shared_policy_init(struct shared_policy *info, unsigned short policy,
+                               unsigned short flags, nodemask_t *nodes);
 int mpol_set_shared_policy(struct shared_policy *info,
                                struct vm_area_struct *vma,
                                struct mempolicy *new);
@@ -149,9 +165,9 @@ extern void mpol_rebind_task(struct task_struct *tsk,
 extern void mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new);
 extern void mpol_fix_fork_child_flag(struct task_struct *p);
 
-extern struct mempolicy default_policy;
 extern struct zonelist *huge_zonelist(struct vm_area_struct *vma,
-               unsigned long addr, gfp_t gfp_flags, struct mempolicy **mpol);
+                               unsigned long addr, gfp_t gfp_flags,
+                               struct mempolicy **mpol, nodemask_t **nodemask);
 extern unsigned slab_node(struct mempolicy *policy);
 
 extern enum zone_type policy_zone;
@@ -173,11 +189,8 @@ static inline int mpol_equal(struct mempolicy *a, struct mempolicy *b)
 {
        return 1;
 }
-#define vma_mpol_equal(a,b) 1
-
-#define mpol_set_vma_default(vma) do {} while(0)
 
-static inline void mpol_free(struct mempolicy *p)
+static inline void mpol_put(struct mempolicy *p)
 {
 }
 
@@ -200,7 +213,7 @@ static inline int mpol_set_shared_policy(struct shared_policy *info,
 }
 
 static inline void mpol_shared_policy_init(struct shared_policy *info,
-                                       int policy, nodemask_t *nodes)
+               unsigned short policy, unsigned short flags, nodemask_t *nodes)
 {
 }
 
@@ -239,9 +252,12 @@ static inline void mpol_fix_fork_child_flag(struct task_struct *p)
 }
 
 static inline struct zonelist *huge_zonelist(struct vm_area_struct *vma,
-               unsigned long addr, gfp_t gfp_flags, struct mempolicy **mpol)
+                               unsigned long addr, gfp_t gfp_flags,
+                               struct mempolicy **mpol, nodemask_t **nodemask)
 {
-       return NODE_DATA(0)->node_zonelists + gfp_zone(gfp_flags);
+       *mpol = NULL;
+       *nodemask = NULL;
+       return node_zonelist(0, gfp_flags);
 }
 
 static inline int do_migrate_pages(struct mm_struct *mm,