unsigned long flags;
        unsigned long *rmap;
        unsigned long *dirty_bitmap;
-       unsigned long *dirty_bitmap_head;
-       unsigned long nr_dirty_pages;
        struct kvm_arch_memory_slot arch;
        unsigned long userspace_addr;
        int user_alloc;
 
                return;
 
        if (2 * kvm_dirty_bitmap_bytes(memslot) > PAGE_SIZE)
-               vfree(memslot->dirty_bitmap_head);
+               vfree(memslot->dirty_bitmap);
        else
-               kfree(memslot->dirty_bitmap_head);
+               kfree(memslot->dirty_bitmap);
 
        memslot->dirty_bitmap = NULL;
-       memslot->dirty_bitmap_head = NULL;
 }
 
 /*
 
 /*
  * Allocation size is twice as large as the actual dirty bitmap size.
- * This makes it possible to do double buffering: see x86's
- * kvm_vm_ioctl_get_dirty_log().
+ * See x86's kvm_vm_ioctl_get_dirty_log() why this is needed.
  */
 static int kvm_create_dirty_bitmap(struct kvm_memory_slot *memslot)
 {
        if (!memslot->dirty_bitmap)
                return -ENOMEM;
 
-       memslot->dirty_bitmap_head = memslot->dirty_bitmap;
-       memslot->nr_dirty_pages = 0;
 #endif /* !CONFIG_S390 */
        return 0;
 }
        if (memslot && memslot->dirty_bitmap) {
                unsigned long rel_gfn = gfn - memslot->base_gfn;
 
-               if (!test_and_set_bit_le(rel_gfn, memslot->dirty_bitmap))
-                       memslot->nr_dirty_pages++;
+               /* TODO: introduce set_bit_le() and use it */
+               test_and_set_bit_le(rel_gfn, memslot->dirty_bitmap);
        }
 }