diff options
Diffstat (limited to 'mm/ksm.c')
-rw-r--r-- | mm/ksm.c | 12 |
1 files changed, 9 insertions, 3 deletions
@@ -1563,10 +1563,12 @@ int page_referenced_ksm(struct page *page, struct mem_cgroup *memcg, | |||
1563 | again: | 1563 | again: |
1564 | hlist_for_each_entry(rmap_item, hlist, &stable_node->hlist, hlist) { | 1564 | hlist_for_each_entry(rmap_item, hlist, &stable_node->hlist, hlist) { |
1565 | struct anon_vma *anon_vma = rmap_item->anon_vma; | 1565 | struct anon_vma *anon_vma = rmap_item->anon_vma; |
1566 | struct anon_vma_chain *vmac; | ||
1566 | struct vm_area_struct *vma; | 1567 | struct vm_area_struct *vma; |
1567 | 1568 | ||
1568 | spin_lock(&anon_vma->lock); | 1569 | spin_lock(&anon_vma->lock); |
1569 | list_for_each_entry(vma, &anon_vma->head, anon_vma_node) { | 1570 | list_for_each_entry(vmac, &anon_vma->head, same_anon_vma) { |
1571 | vma = vmac->vma; | ||
1570 | if (rmap_item->address < vma->vm_start || | 1572 | if (rmap_item->address < vma->vm_start || |
1571 | rmap_item->address >= vma->vm_end) | 1573 | rmap_item->address >= vma->vm_end) |
1572 | continue; | 1574 | continue; |
@@ -1614,10 +1616,12 @@ int try_to_unmap_ksm(struct page *page, enum ttu_flags flags) | |||
1614 | again: | 1616 | again: |
1615 | hlist_for_each_entry(rmap_item, hlist, &stable_node->hlist, hlist) { | 1617 | hlist_for_each_entry(rmap_item, hlist, &stable_node->hlist, hlist) { |
1616 | struct anon_vma *anon_vma = rmap_item->anon_vma; | 1618 | struct anon_vma *anon_vma = rmap_item->anon_vma; |
1619 | struct anon_vma_chain *vmac; | ||
1617 | struct vm_area_struct *vma; | 1620 | struct vm_area_struct *vma; |
1618 | 1621 | ||
1619 | spin_lock(&anon_vma->lock); | 1622 | spin_lock(&anon_vma->lock); |
1620 | list_for_each_entry(vma, &anon_vma->head, anon_vma_node) { | 1623 | list_for_each_entry(vmac, &anon_vma->head, same_anon_vma) { |
1624 | vma = vmac->vma; | ||
1621 | if (rmap_item->address < vma->vm_start || | 1625 | if (rmap_item->address < vma->vm_start || |
1622 | rmap_item->address >= vma->vm_end) | 1626 | rmap_item->address >= vma->vm_end) |
1623 | continue; | 1627 | continue; |
@@ -1664,10 +1668,12 @@ int rmap_walk_ksm(struct page *page, int (*rmap_one)(struct page *, | |||
1664 | again: | 1668 | again: |
1665 | hlist_for_each_entry(rmap_item, hlist, &stable_node->hlist, hlist) { | 1669 | hlist_for_each_entry(rmap_item, hlist, &stable_node->hlist, hlist) { |
1666 | struct anon_vma *anon_vma = rmap_item->anon_vma; | 1670 | struct anon_vma *anon_vma = rmap_item->anon_vma; |
1671 | struct anon_vma_chain *vmac; | ||
1667 | struct vm_area_struct *vma; | 1672 | struct vm_area_struct *vma; |
1668 | 1673 | ||
1669 | spin_lock(&anon_vma->lock); | 1674 | spin_lock(&anon_vma->lock); |
1670 | list_for_each_entry(vma, &anon_vma->head, anon_vma_node) { | 1675 | list_for_each_entry(vmac, &anon_vma->head, same_anon_vma) { |
1676 | vma = vmac->vma; | ||
1671 | if (rmap_item->address < vma->vm_start || | 1677 | if (rmap_item->address < vma->vm_start || |
1672 | rmap_item->address >= vma->vm_end) | 1678 | rmap_item->address >= vma->vm_end) |
1673 | continue; | 1679 | continue; |