dm: get rid of GFP_NOIO workarounds for __vmalloc and kvmalloc
authorMikulas Patocka <mpatocka@redhat.com>
Mon, 26 Jun 2023 14:48:40 +0000 (16:48 +0200)
committerMike Snitzer <snitzer@kernel.org>
Tue, 27 Jun 2023 20:06:54 +0000 (16:06 -0400)
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 commit 451769ebb7e7 ("mm/vmalloc:
alloc GFP_NO{FS,IO} for vmalloc") so the memalloc_noio_{save,restore}
workaround is no longer needed.

The function kvmalloc didn't like flags different from GFP_KERNEL. This
was fixed in commit a421ef303008 ("mm: allow !GFP_KERNEL allocations
for kvmalloc"), so kvmalloc can now be called with GFP_NOIO.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@kernel.org>
drivers/md/dm-bufio.c
drivers/md/dm-ioctl.c

index a7079b3..bc309e4 100644 (file)
@@ -1157,23 +1157,6 @@ static void *alloc_buffer_data(struct dm_bufio_client *c, gfp_t gfp_mask,
 
        *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 16244a7..8e14a4a 100644 (file)
@@ -1932,7 +1932,6 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern
        struct dm_ioctl *dmi;
        int secure_data;
        const size_t minimum_data_size = offsetof(struct dm_ioctl, data);
-       unsigned int noio_flag;
 
        /* check_version() already copied version from userspace, avoid TOCTOU */
        if (copy_from_user((char *)param_kernel + sizeof(param_kernel->version),
@@ -1962,9 +1961,7 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern
         * 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))