In the past, the function __vmalloc didn't respect the GFP flags - it
allocated memory with the provided gfp flags, but it allocated page tables
with GFP_KERNEL. This was fixed in the commit
451769ebb7e792c3404db53b3c2a422990de654e, so the memalloc_noio_save /
memalloc_noio_restore workaround is no longer needed.

The function kvmalloc didn't like flags different from GFP_KERNEL. This 
was fixed in the commit a421ef303008b0ceee2cfc625c3246fa7654b0ca, so we 
can call kvmalloc with GFP_NOIO.

Signed-off-by: Mikulas Patocka <mpato...@redhat.com>

---
 drivers/md/dm-bufio.c |   17 -----------------
 drivers/md/dm-ioctl.c |    5 +----
 2 files changed, 1 insertion(+), 21 deletions(-)

Index: linux-2.6/drivers/md/dm-bufio.c
===================================================================
--- linux-2.6.orig/drivers/md/dm-bufio.c
+++ linux-2.6/drivers/md/dm-bufio.c
@@ -1157,23 +1157,6 @@ static void *alloc_buffer_data(struct dm
 
        *data_mode = DATA_MODE_VMALLOC;
 
-       /*
-        * __vmalloc allocates the data pages and auxiliary structures with
-        * gfp_flags that were specified, but pagetables are always allocated
-        * with GFP_KERNEL, no matter what was specified as gfp_mask.
-        *
-        * Consequently, we must set per-process flag PF_MEMALLOC_NOIO so that
-        * all allocations done by this process (including pagetables) are done
-        * as if GFP_NOIO was specified.
-        */
-       if (gfp_mask & __GFP_NORETRY) {
-               unsigned int noio_flag = memalloc_noio_save();
-               void *ptr = __vmalloc(c->block_size, gfp_mask);
-
-               memalloc_noio_restore(noio_flag);
-               return ptr;
-       }
-
        return __vmalloc(c->block_size, gfp_mask);
 }
 
Index: linux-2.6/drivers/md/dm-ioctl.c
===================================================================
--- linux-2.6.orig/drivers/md/dm-ioctl.c
+++ linux-2.6/drivers/md/dm-ioctl.c
@@ -1877,7 +1877,6 @@ static int copy_params(struct dm_ioctl _
        struct dm_ioctl *dmi;
        int secure_data;
        const size_t minimum_data_size = offsetof(struct dm_ioctl, data);
-       unsigned int noio_flag;
 
        if (copy_from_user(param_kernel, user, minimum_data_size))
                return -EFAULT;
@@ -1904,9 +1903,7 @@ static int copy_params(struct dm_ioctl _
         * Use kmalloc() rather than vmalloc() when we can.
         */
        dmi = NULL;
-       noio_flag = memalloc_noio_save();
-       dmi = kvmalloc(param_kernel->data_size, GFP_KERNEL | __GFP_HIGH);
-       memalloc_noio_restore(noio_flag);
+       dmi = kvmalloc(param_kernel->data_size, GFP_NOIO | __GFP_HIGH);
 
        if (!dmi) {
                if (secure_data && clear_user(user, param_kernel->data_size))
--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel

Reply via email to