dm: get rid of GFP_NOIO workarounds for __vmalloc and kvmalloc
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 commit451769ebb7("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 commita421ef3030("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>
This commit is contained in:
committed by
Mike Snitzer
parent
3be1622895
commit
e2c789cab6
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user