Skip to content

Commit 7ce3e61

Browse files
morbidrsamartinkpetersen
authored andcommitted
scsi: sd_zbc: Use kvzalloc() to allocate REPORT ZONES buffer
We have two reports of failed memory allocation in btrfs' code which is calling into report zones. Both of these reports have the following signature coming from __vmalloc_area_node(): kworker/u17:5: vmalloc error: size 0, failed to allocate pages, mode:0x10dc2(GFP_KERNEL|__GFP_HIGHMEM|__GFP_NORETRY|__GFP_ZERO), nodemask=(null),cpuset=/,mems_allowed=0 Further debugging showed these where allocations of one sector (512 bytes) and at least one of the reporter's systems where low on memory, so going through the overhead of allocating a vm area failed. Switching the allocation from __vmalloc() to kvzalloc() avoids the overhead of vmalloc() on small allocations and succeeds. Note: the buffer is already freed using kvfree() so there's no need to adjust the free path. Cc: Qu Wenru <wqu@suse.com> Cc: Naohiro Aota <naohiro.aota@wdc.com> Link: kdave/btrfs-progs#779 Link: kdave/btrfs-progs#915 Fixes: 23a5086 ("scsi: sd_zbc: Cleanup sd_zbc_alloc_report_buffer()") Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Link: https://lore.kernel.org/r/20241030110253.11718-1-jth@kernel.org Reviewed-by: Damien Le Moal <dlemoal@kernel.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent cb7e509 commit 7ce3e61

File tree

1 file changed

+1
-2
lines changed

1 file changed

+1
-2
lines changed

drivers/scsi/sd_zbc.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,7 @@ static void *sd_zbc_alloc_report_buffer(struct scsi_disk *sdkp,
188188
bufsize = min_t(size_t, bufsize, queue_max_segments(q) << PAGE_SHIFT);
189189

190190
while (bufsize >= SECTOR_SIZE) {
191-
buf = __vmalloc(bufsize,
192-
GFP_KERNEL | __GFP_ZERO | __GFP_NORETRY);
191+
buf = kvzalloc(bufsize, GFP_KERNEL | __GFP_NORETRY);
193192
if (buf) {
194193
*buflen = bufsize;
195194
return buf;

0 commit comments

Comments
 (0)