On 2018/05/22 8:27, Bart Van Assche wrote: > Avoid that complaints similar to the following appear in the kernel log > if the number of zones is sufficiently large: > > fio: page allocation failure: order:9, mode:0x140c0c0(GFP_KERNEL|__GFP_COMP|__GFP_ZERO), nodemask=(null) > Call Trace: > dump_stack+0x63/0x88 > warn_alloc+0xf5/0x190 > __alloc_pages_slowpath+0x8f0/0xb0d > __alloc_pages_nodemask+0x242/0x260 > alloc_pages_current+0x6a/0xb0 > kmalloc_order+0x18/0x50 > kmalloc_order_trace+0x26/0xb0 > __kmalloc+0x20e/0x220 > blkdev_report_zones_ioctl+0xa5/0x1a0 > blkdev_ioctl+0x1ba/0x930 > block_ioctl+0x41/0x50 > do_vfs_ioctl+0xaa/0x610 > SyS_ioctl+0x79/0x90 > do_syscall_64+0x79/0x1b0 > entry_SYSCALL_64_after_hwframe+0x3d/0xa2 > > Fixes: 3ed05a987e0f ("blk-zoned: implement ioctls") > Signed-off-by: Bart Van Assche <bart.vanassche@xxxxxxx> > Cc: Shaun Tancheff <shaun.tancheff@xxxxxxxxxxx> > Cc: Damien Le Moal <damien.lemoal@xxxxxxxx> > Cc: Christoph Hellwig <hch@xxxxxx> > Cc: Martin K. Petersen <martin.petersen@xxxxxxxxxx> > Cc: Hannes Reinecke <hare@xxxxxxxx> > Cc: <stable@xxxxxxxxxxxxxxx> > --- > block/blk-zoned.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/block/blk-zoned.c b/block/blk-zoned.c > index 20bfc37e1852..92e6108487c4 100644 > --- a/block/blk-zoned.c > +++ b/block/blk-zoned.c > @@ -328,7 +328,11 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode, > if (!rep.nr_zones) > return -EINVAL; > > - zones = kcalloc(rep.nr_zones, sizeof(struct blk_zone), GFP_KERNEL); > + if (rep.nr_zones > INT_MAX / sizeof(struct blk_zone)) > + return -ERANGE; > + > + zones = kvmalloc(rep.nr_zones * sizeof(struct blk_zone), > + GFP_KERNEL | __GFP_ZERO); > if (!zones) > return -ENOMEM; > > @@ -350,7 +354,7 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode, > } > > out: > - kfree(zones); > + kvfree(zones); > > return ret; > } > Reviewed-by: Damien Le Moal <damien.lemoal@xxxxxxx> -- Damien Le Moal Western Digital Research