mm: migrate: check movability of hugepage in unmap_and_move_huge_page()
[linux-2.6-microblaze.git] / mm / vmalloc.c
index 13a5495..93d3182 100644 (file)
@@ -752,7 +752,6 @@ struct vmap_block_queue {
 struct vmap_block {
        spinlock_t lock;
        struct vmap_area *va;
-       struct vmap_block_queue *vbq;
        unsigned long free, dirty;
        DECLARE_BITMAP(dirty_map, VMAP_BBMAP_BITS);
        struct list_head free_list;
@@ -830,7 +829,6 @@ static struct vmap_block *new_vmap_block(gfp_t gfp_mask)
        radix_tree_preload_end();
 
        vbq = &get_cpu_var(vmap_block_queue);
-       vb->vbq = vbq;
        spin_lock(&vbq->lock);
        list_add_rcu(&vb->free_list, &vbq->free);
        spin_unlock(&vbq->lock);
@@ -1018,15 +1016,16 @@ void vm_unmap_aliases(void)
 
                rcu_read_lock();
                list_for_each_entry_rcu(vb, &vbq->free, free_list) {
-                       int i;
+                       int i, j;
 
                        spin_lock(&vb->lock);
                        i = find_first_bit(vb->dirty_map, VMAP_BBMAP_BITS);
-                       while (i < VMAP_BBMAP_BITS) {
+                       if (i < VMAP_BBMAP_BITS) {
                                unsigned long s, e;
-                               int j;
-                               j = find_next_zero_bit(vb->dirty_map,
-                                       VMAP_BBMAP_BITS, i);
+
+                               j = find_last_bit(vb->dirty_map,
+                                                       VMAP_BBMAP_BITS);
+                               j = j + 1; /* need exclusive index */
 
                                s = vb->va->va_start + (i << PAGE_SHIFT);
                                e = vb->va->va_start + (j << PAGE_SHIFT);
@@ -1036,10 +1035,6 @@ void vm_unmap_aliases(void)
                                        start = s;
                                if (e > end)
                                        end = e;
-
-                               i = j;
-                               i = find_next_bit(vb->dirty_map,
-                                                       VMAP_BBMAP_BITS, i);
                        }
                        spin_unlock(&vb->lock);
                }