Merge tag 'io_uring-5.13-2021-05-14' of git://git.kernel.dk/linux-block
[linux-2.6-microblaze.git] / lib / test_hmm.c
index e7dc3de..80a7887 100644 (file)
@@ -36,7 +36,6 @@
 static const struct dev_pagemap_ops dmirror_devmem_ops;
 static const struct mmu_interval_notifier_ops dmirror_min_ops;
 static dev_t dmirror_dev;
-static struct page *dmirror_zero_page;
 
 struct dmirror_device;
 
@@ -460,6 +459,22 @@ static bool dmirror_allocate_chunk(struct dmirror_device *mdevice,
        unsigned long pfn_last;
        void *ptr;
 
+       devmem = kzalloc(sizeof(*devmem), GFP_KERNEL);
+       if (!devmem)
+               return false;
+
+       res = request_free_mem_region(&iomem_resource, DEVMEM_CHUNK_SIZE,
+                                     "hmm_dmirror");
+       if (IS_ERR(res))
+               goto err_devmem;
+
+       devmem->pagemap.type = MEMORY_DEVICE_PRIVATE;
+       devmem->pagemap.range.start = res->start;
+       devmem->pagemap.range.end = res->end;
+       devmem->pagemap.nr_range = 1;
+       devmem->pagemap.ops = &dmirror_devmem_ops;
+       devmem->pagemap.owner = mdevice;
+
        mutex_lock(&mdevice->devmem_lock);
 
        if (mdevice->devmem_count == mdevice->devmem_capacity) {
@@ -472,33 +487,18 @@ static bool dmirror_allocate_chunk(struct dmirror_device *mdevice,
                                sizeof(new_chunks[0]) * new_capacity,
                                GFP_KERNEL);
                if (!new_chunks)
-                       goto err;
+                       goto err_release;
                mdevice->devmem_capacity = new_capacity;
                mdevice->devmem_chunks = new_chunks;
        }
 
-       res = request_free_mem_region(&iomem_resource, DEVMEM_CHUNK_SIZE,
-                                       "hmm_dmirror");
-       if (IS_ERR(res))
-               goto err;
-
-       devmem = kzalloc(sizeof(*devmem), GFP_KERNEL);
-       if (!devmem)
-               goto err_release;
-
-       devmem->pagemap.type = MEMORY_DEVICE_PRIVATE;
-       devmem->pagemap.res = *res;
-       devmem->pagemap.ops = &dmirror_devmem_ops;
-       devmem->pagemap.owner = mdevice;
-
        ptr = memremap_pages(&devmem->pagemap, numa_node_id());
        if (IS_ERR(ptr))
-               goto err_free;
+               goto err_release;
 
        devmem->mdevice = mdevice;
-       pfn_first = devmem->pagemap.res.start >> PAGE_SHIFT;
-       pfn_last = pfn_first +
-               (resource_size(&devmem->pagemap.res) >> PAGE_SHIFT);
+       pfn_first = devmem->pagemap.range.start >> PAGE_SHIFT;
+       pfn_last = pfn_first + (range_len(&devmem->pagemap.range) >> PAGE_SHIFT);
        mdevice->devmem_chunks[mdevice->devmem_count++] = devmem;
 
        mutex_unlock(&mdevice->devmem_lock);
@@ -525,12 +525,12 @@ static bool dmirror_allocate_chunk(struct dmirror_device *mdevice,
 
        return true;
 
-err_free:
-       kfree(devmem);
 err_release:
-       release_mem_region(res->start, resource_size(res));
-err:
        mutex_unlock(&mdevice->devmem_lock);
+       release_mem_region(devmem->pagemap.range.start, range_len(&devmem->pagemap.range));
+err_devmem:
+       kfree(devmem);
+
        return false;
 }
 
@@ -1100,8 +1100,8 @@ static void dmirror_device_remove(struct dmirror_device *mdevice)
                                mdevice->devmem_chunks[i];
 
                        memunmap_pages(&devmem->pagemap);
-                       release_mem_region(devmem->pagemap.res.start,
-                                          resource_size(&devmem->pagemap.res));
+                       release_mem_region(devmem->pagemap.range.start,
+                                          range_len(&devmem->pagemap.range));
                        kfree(devmem);
                }
                kfree(mdevice->devmem_chunks);
@@ -1126,17 +1126,6 @@ static int __init hmm_dmirror_init(void)
                        goto err_chrdev;
        }
 
-       /*
-        * Allocate a zero page to simulate a reserved page of device private
-        * memory which is always zero. The zero_pfn page isn't used just to
-        * make the code here simpler (i.e., we need a struct page for it).
-        */
-       dmirror_zero_page = alloc_page(GFP_HIGHUSER | __GFP_ZERO);
-       if (!dmirror_zero_page) {
-               ret = -ENOMEM;
-               goto err_chrdev;
-       }
-
        pr_info("HMM test module loaded. This is only for testing HMM.\n");
        return 0;
 
@@ -1152,8 +1141,6 @@ static void __exit hmm_dmirror_exit(void)
 {
        int id;
 
-       if (dmirror_zero_page)
-               __free_page(dmirror_zero_page);
        for (id = 0; id < DMIRROR_NDEVICES; id++)
                dmirror_device_remove(dmirror_devices + id);
        unregister_chrdev_region(dmirror_dev, DMIRROR_NDEVICES);