diff options
| -rw-r--r-- | mm/mempolicy.c | 41 |
1 files changed, 17 insertions, 24 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 39fd416ae14f..88f9422b92e7 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
| @@ -607,27 +607,6 @@ check_range(struct mm_struct *mm, unsigned long start, unsigned long end, | |||
| 607 | return first; | 607 | return first; |
| 608 | } | 608 | } |
| 609 | 609 | ||
| 610 | /* Apply policy to a single VMA */ | ||
| 611 | static int policy_vma(struct vm_area_struct *vma, struct mempolicy *new) | ||
| 612 | { | ||
| 613 | int err = 0; | ||
| 614 | struct mempolicy *old = vma->vm_policy; | ||
| 615 | |||
| 616 | pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n", | ||
| 617 | vma->vm_start, vma->vm_end, vma->vm_pgoff, | ||
| 618 | vma->vm_ops, vma->vm_file, | ||
| 619 | vma->vm_ops ? vma->vm_ops->set_policy : NULL); | ||
| 620 | |||
| 621 | if (vma->vm_ops && vma->vm_ops->set_policy) | ||
| 622 | err = vma->vm_ops->set_policy(vma, new); | ||
| 623 | if (!err) { | ||
| 624 | mpol_get(new); | ||
| 625 | vma->vm_policy = new; | ||
| 626 | mpol_put(old); | ||
| 627 | } | ||
| 628 | return err; | ||
| 629 | } | ||
| 630 | |||
| 631 | /* Step 2: apply policy to a range and do splits. */ | 610 | /* Step 2: apply policy to a range and do splits. */ |
| 632 | static int mbind_range(struct mm_struct *mm, unsigned long start, | 611 | static int mbind_range(struct mm_struct *mm, unsigned long start, |
| 633 | unsigned long end, struct mempolicy *new_pol) | 612 | unsigned long end, struct mempolicy *new_pol) |
| @@ -676,9 +655,23 @@ static int mbind_range(struct mm_struct *mm, unsigned long start, | |||
| 676 | if (err) | 655 | if (err) |
| 677 | goto out; | 656 | goto out; |
| 678 | } | 657 | } |
| 679 | err = policy_vma(vma, new_pol); | 658 | |
| 680 | if (err) | 659 | /* |
| 681 | goto out; | 660 | * Apply policy to a single VMA. The reference counting of |
| 661 | * policy for vma_policy linkages has already been handled by | ||
| 662 | * vma_merge and split_vma as necessary. If this is a shared | ||
| 663 | * policy then ->set_policy will increment the reference count | ||
| 664 | * for an sp node. | ||
| 665 | */ | ||
| 666 | pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n", | ||
| 667 | vma->vm_start, vma->vm_end, vma->vm_pgoff, | ||
| 668 | vma->vm_ops, vma->vm_file, | ||
| 669 | vma->vm_ops ? vma->vm_ops->set_policy : NULL); | ||
| 670 | if (vma->vm_ops && vma->vm_ops->set_policy) { | ||
| 671 | err = vma->vm_ops->set_policy(vma, new_pol); | ||
| 672 | if (err) | ||
| 673 | goto out; | ||
| 674 | } | ||
| 682 | } | 675 | } |
| 683 | 676 | ||
| 684 | out: | 677 | out: |
