|
@@ -1679,6 +1679,30 @@ struct mempolicy *get_vma_policy(struct task_struct *task,
|
|
|
return pol;
|
|
|
}
|
|
|
|
|
|
+bool vma_policy_mof(struct task_struct *task, struct vm_area_struct *vma)
|
|
|
+{
|
|
|
+ struct mempolicy *pol = get_task_policy(task);
|
|
|
+ if (vma) {
|
|
|
+ if (vma->vm_ops && vma->vm_ops->get_policy) {
|
|
|
+ bool ret = false;
|
|
|
+
|
|
|
+ pol = vma->vm_ops->get_policy(vma, vma->vm_start);
|
|
|
+ if (pol && (pol->flags & MPOL_F_MOF))
|
|
|
+ ret = true;
|
|
|
+ mpol_cond_put(pol);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+ } else if (vma->vm_policy) {
|
|
|
+ pol = vma->vm_policy;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!pol)
|
|
|
+ return default_policy.flags & MPOL_F_MOF;
|
|
|
+
|
|
|
+ return pol->flags & MPOL_F_MOF;
|
|
|
+}
|
|
|
+
|
|
|
static int apply_policy_zone(struct mempolicy *policy, enum zone_type zone)
|
|
|
{
|
|
|
enum zone_type dynamic_policy_zone = policy_zone;
|