[dm-devel] [PATCH] dm-zoned: Use GFP_NOIO in I/O path
Mikulas Patocka
mpatocka at redhat.com
Mon Jul 24 13:45:00 UTC 2017
On Mon, 24 Jul 2017, Damien Le Moal wrote:
> Use GFP_NOIO for memory allocations in the I/O path. Other memory
> allocations in the initialization path can keep using GFP_KERNEL.
Good patch. BTW. that GFP_NOFS should also be changed to GFP_NOIO.
GFP_NOFS prevents allocator recursion to the filesystem.
GFP_NOIO prevents allocator recursion to the filesystem and I/O stack.
With GFP_NOFS, it is still theoretically possible that the allocation
recurses into the I/O layer (for example when swapping to a block device).
Mikulas
> Problem reported by Mikulas Patocka <mpatocka at redhat.com>.
>
> Signed-off-by: Damien Le Moal <damien.lemoal at wdc.com>
> ---
> drivers/md/dm-zoned-metadata.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c
> index f694fb98b002..f45ac8b1121d 100644
> --- a/drivers/md/dm-zoned-metadata.c
> +++ b/drivers/md/dm-zoned-metadata.c
> @@ -625,7 +625,7 @@ static int dmz_write_sb(struct dmz_metadata *zmd, unsigned int set)
>
> ret = dmz_rdwr_block(zmd, REQ_OP_WRITE, block, mblk->page);
> if (ret == 0)
> - ret = blkdev_issue_flush(zmd->dev->bdev, GFP_KERNEL, NULL);
> + ret = blkdev_issue_flush(zmd->dev->bdev, GFP_NOIO, NULL);
>
> return ret;
> }
> @@ -659,7 +659,7 @@ static int dmz_write_dirty_mblocks(struct dmz_metadata *zmd,
>
> /* Flush drive cache (this will also sync data) */
> if (ret == 0)
> - ret = blkdev_issue_flush(zmd->dev->bdev, GFP_KERNEL, NULL);
> + ret = blkdev_issue_flush(zmd->dev->bdev, GFP_NOIO, NULL);
>
> return ret;
> }
> @@ -723,7 +723,7 @@ int dmz_flush_metadata(struct dmz_metadata *zmd)
>
> /* If there are no dirty metadata blocks, just flush the device cache */
> if (list_empty(&write_list)) {
> - ret = blkdev_issue_flush(zmd->dev->bdev, GFP_KERNEL, NULL);
> + ret = blkdev_issue_flush(zmd->dev->bdev, GFP_NOIO, NULL);
> goto out;
> }
>
> @@ -928,7 +928,7 @@ static int dmz_recover_mblocks(struct dmz_metadata *zmd, unsigned int dst_set)
> (zmd->nr_meta_zones << zmd->dev->zone_nr_blocks_shift);
> }
>
> - page = alloc_page(GFP_KERNEL);
> + page = alloc_page(GFP_NOIO);
> if (!page)
> return -ENOMEM;
>
> @@ -1184,7 +1184,7 @@ static int dmz_update_zone(struct dmz_metadata *zmd, struct dm_zone *zone)
>
> /* Get zone information from disk */
> ret = blkdev_report_zones(zmd->dev->bdev, dmz_start_sect(zmd, zone),
> - &blkz, &nr_blkz, GFP_KERNEL);
> + &blkz, &nr_blkz, GFP_NOIO);
> if (ret) {
> dmz_dev_err(zmd->dev, "Get zone %u report failed",
> dmz_id(zmd, zone));
> @@ -1258,7 +1258,7 @@ static int dmz_reset_zone(struct dmz_metadata *zmd, struct dm_zone *zone)
>
> ret = blkdev_reset_zones(dev->bdev,
> dmz_start_sect(zmd, zone),
> - dev->zone_nr_sectors, GFP_KERNEL);
> + dev->zone_nr_sectors, GFP_NOIO);
> if (ret) {
> dmz_dev_err(dev, "Reset zone %u failed %d",
> dmz_id(zmd, zone), ret);
> --
> 2.13.3
>
More information about the dm-devel
mailing list