linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v8 0/2] scsi: sd: Fix build warning in sd_revalidate_disk()
@ 2025-08-20 14:45 Abinash Singh
  2025-08-20 14:45 ` [PATCH v8 1/2] " Abinash Singh
  2025-08-20 14:45 ` [PATCH v8 2/2] scsi: sd: make sd_revalidate_disk() return void Abinash Singh
  0 siblings, 2 replies; 5+ messages in thread
From: Abinash Singh @ 2025-08-20 14:45 UTC (permalink / raw)
  To: martin.petersen, James.Bottomley
  Cc: linux-scsi, linux-kernel, bvanassche, abinashsinghlalotra,
	dlemoal

Hi all,

This v8 series follows up on v7 of the
"scsi: sd: Fix build warning in sd_revalidate_disk()" patches.

On Tue, 19 Aug 2025 Bart Van Assche wrote:
> The traditional order for kfree() statements is the opposite order of
> the corresponding kmalloc() calls.
>
> Shouldn't this patch remove the initializer from the 'err' variable?
> Otherwise this patch looks good to me.

Based on Bart’s feedback, I have addressed the following in v8:

Changes in v8:
  - Patch 1/2:
      * Reverse the order of kfree() calls to follow the conventional
        opposite-of-kmalloc() order.
      * Added Bart Van Assche’s Reviewed-by tag.
  - Patch 2/2:
      * Removed the unused ‘err’ variable initializer.

As before, the first patch fixes the stack usage warning by moving a
large struct off the stack (with Fixes and Cc: stable tags). The second
patch then simplifies sd_revalidate_disk() by making it return void.

Many thanks to Bart and Damien for their reviews and guidance.


Abinash Singh (2):
  scsi: sd: Fix build warning in sd_revalidate_disk()
  scsi: sd: make sd_revalidate_disk() return void

 drivers/scsi/sd.c | 56 +++++++++++++++++++++++++++--------------------
 1 file changed, 32 insertions(+), 24 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v8 1/2] scsi: sd: Fix build warning in sd_revalidate_disk()
  2025-08-20 14:45 [PATCH v8 0/2] scsi: sd: Fix build warning in sd_revalidate_disk() Abinash Singh
@ 2025-08-20 14:45 ` Abinash Singh
  2025-08-22 19:47   ` Bart Van Assche
  2025-08-20 14:45 ` [PATCH v8 2/2] scsi: sd: make sd_revalidate_disk() return void Abinash Singh
  1 sibling, 1 reply; 5+ messages in thread
From: Abinash Singh @ 2025-08-20 14:45 UTC (permalink / raw)
  To: martin.petersen, James.Bottomley
  Cc: linux-scsi, linux-kernel, bvanassche, abinashsinghlalotra,
	dlemoal

A build warning was triggered due to excessive stack usage in
sd_revalidate_disk():

drivers/scsi/sd.c: In function ‘sd_revalidate_disk.isra’:
drivers/scsi/sd.c:3824:1: warning: the frame size of 1160 bytes is larger than 1024 bytes [-Wframe-larger-than=]

This is caused by a large local struct queue_limits (~400B) allocated
on the stack. Replacing it with a heap allocation using kmalloc()
significantly reduces frame usage. Kernel stack is limited (~8 KB),
and allocating large structs on the stack is discouraged.
As the function already performs heap allocations (e.g. for buffer),
this change fits well.

Signed-off-by: Abinash Singh <abinashsinghlalotra@gmail.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/scsi/sd.c | 53 +++++++++++++++++++++++++++--------------------
 1 file changed, 31 insertions(+), 22 deletions(-)

diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 5b8668accf8e..453a27322517 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -3696,10 +3696,10 @@ static int sd_revalidate_disk(struct gendisk *disk)
 	struct scsi_disk *sdkp = scsi_disk(disk);
 	struct scsi_device *sdp = sdkp->device;
 	sector_t old_capacity = sdkp->capacity;
-	struct queue_limits lim;
-	unsigned char *buffer;
+	struct queue_limits *lim = NULL;
+	unsigned char *buffer = NULL;
 	unsigned int dev_max;
-	int err;
+	int err = 0;
 
 	SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp,
 				      "sd_revalidate_disk\n"));
@@ -3711,6 +3711,13 @@ static int sd_revalidate_disk(struct gendisk *disk)
 	if (!scsi_device_online(sdp))
 		goto out;
 
+	lim = kmalloc(sizeof(*lim), GFP_KERNEL);
+	if (!lim) {
+		sd_printk(KERN_WARNING, sdkp,
+			"sd_revalidate_disk: Disk limit allocation failure.\n");
+		goto out;
+	}
+
 	buffer = kmalloc(SD_BUF_SIZE, GFP_KERNEL);
 	if (!buffer) {
 		sd_printk(KERN_WARNING, sdkp, "sd_revalidate_disk: Memory "
@@ -3720,14 +3727,14 @@ static int sd_revalidate_disk(struct gendisk *disk)
 
 	sd_spinup_disk(sdkp);
 
-	lim = queue_limits_start_update(sdkp->disk->queue);
+	*lim = queue_limits_start_update(sdkp->disk->queue);
 
 	/*
 	 * Without media there is no reason to ask; moreover, some devices
 	 * react badly if we do.
 	 */
 	if (sdkp->media_present) {
-		sd_read_capacity(sdkp, &lim, buffer);
+		sd_read_capacity(sdkp, lim, buffer);
 		/*
 		 * Some USB/UAS devices return generic values for mode pages
 		 * until the media has been accessed. Trigger a READ operation
@@ -3741,17 +3748,17 @@ static int sd_revalidate_disk(struct gendisk *disk)
 		 * cause this to be updated correctly and any device which
 		 * doesn't support it should be treated as rotational.
 		 */
-		lim.features |= (BLK_FEAT_ROTATIONAL | BLK_FEAT_ADD_RANDOM);
+		lim->features |= (BLK_FEAT_ROTATIONAL | BLK_FEAT_ADD_RANDOM);
 
 		if (scsi_device_supports_vpd(sdp)) {
 			sd_read_block_provisioning(sdkp);
-			sd_read_block_limits(sdkp, &lim);
+			sd_read_block_limits(sdkp, lim);
 			sd_read_block_limits_ext(sdkp);
-			sd_read_block_characteristics(sdkp, &lim);
-			sd_zbc_read_zones(sdkp, &lim, buffer);
+			sd_read_block_characteristics(sdkp, lim);
+			sd_zbc_read_zones(sdkp, lim, buffer);
 		}
 
-		sd_config_discard(sdkp, &lim, sd_discard_mode(sdkp));
+		sd_config_discard(sdkp, lim, sd_discard_mode(sdkp));
 
 		sd_print_capacity(sdkp, old_capacity);
 
@@ -3761,47 +3768,46 @@ static int sd_revalidate_disk(struct gendisk *disk)
 		sd_read_app_tag_own(sdkp, buffer);
 		sd_read_write_same(sdkp, buffer);
 		sd_read_security(sdkp, buffer);
-		sd_config_protection(sdkp, &lim);
+		sd_config_protection(sdkp, lim);
 	}
 
 	/*
 	 * We now have all cache related info, determine how we deal
 	 * with flush requests.
 	 */
-	sd_set_flush_flag(sdkp, &lim);
+	sd_set_flush_flag(sdkp, lim);
 
 	/* Initial block count limit based on CDB TRANSFER LENGTH field size. */
 	dev_max = sdp->use_16_for_rw ? SD_MAX_XFER_BLOCKS : SD_DEF_XFER_BLOCKS;
 
 	/* Some devices report a maximum block count for READ/WRITE requests. */
 	dev_max = min_not_zero(dev_max, sdkp->max_xfer_blocks);
-	lim.max_dev_sectors = logical_to_sectors(sdp, dev_max);
+	lim->max_dev_sectors = logical_to_sectors(sdp, dev_max);
 
 	if (sd_validate_min_xfer_size(sdkp))
-		lim.io_min = logical_to_bytes(sdp, sdkp->min_xfer_blocks);
+		lim->io_min = logical_to_bytes(sdp, sdkp->min_xfer_blocks);
 	else
-		lim.io_min = 0;
+		lim->io_min = 0;
 
 	/*
 	 * Limit default to SCSI host optimal sector limit if set. There may be
 	 * an impact on performance for when the size of a request exceeds this
 	 * host limit.
 	 */
-	lim.io_opt = sdp->host->opt_sectors << SECTOR_SHIFT;
+	lim->io_opt = sdp->host->opt_sectors << SECTOR_SHIFT;
 	if (sd_validate_opt_xfer_size(sdkp, dev_max)) {
-		lim.io_opt = min_not_zero(lim.io_opt,
+		lim->io_opt = min_not_zero(lim->io_opt,
 				logical_to_bytes(sdp, sdkp->opt_xfer_blocks));
 	}
 
 	sdkp->first_scan = 0;
 
 	set_capacity_and_notify(disk, logical_to_sectors(sdp, sdkp->capacity));
-	sd_config_write_same(sdkp, &lim);
-	kfree(buffer);
+	sd_config_write_same(sdkp, lim);
 
-	err = queue_limits_commit_update_frozen(sdkp->disk->queue, &lim);
+	err = queue_limits_commit_update_frozen(sdkp->disk->queue, lim);
 	if (err)
-		return err;
+		goto out;
 
 	/*
 	 * Query concurrent positioning ranges after
@@ -3820,7 +3826,10 @@ static int sd_revalidate_disk(struct gendisk *disk)
 		set_capacity_and_notify(disk, 0);
 
  out:
-	return 0;
+	kfree(buffer);
+	kfree(lim);
+
+	return err;
 }
 
 /**
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v8 2/2] scsi: sd: make sd_revalidate_disk() return void
  2025-08-20 14:45 [PATCH v8 0/2] scsi: sd: Fix build warning in sd_revalidate_disk() Abinash Singh
  2025-08-20 14:45 ` [PATCH v8 1/2] " Abinash Singh
@ 2025-08-20 14:45 ` Abinash Singh
  1 sibling, 0 replies; 5+ messages in thread
From: Abinash Singh @ 2025-08-20 14:45 UTC (permalink / raw)
  To: martin.petersen, James.Bottomley
  Cc: linux-scsi, linux-kernel, bvanassche, abinashsinghlalotra,
	dlemoal

The sd_revalidate_disk() function currently returns 0 for
both success and memory allocation failure.Since none of its
callers use the return value, this return code is both unnecessary
and potentially misleading.

Change the return type of sd_revalidate_disk() from int to void
and remove all return value handling. This makes the function
semantics clearer and avoids confusion about unused return codes.

Signed-off-by: Abinash Singh <abinashsinghlalotra@gmail.com>
---
 drivers/scsi/sd.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 453a27322517..2ad6a0b28822 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -106,7 +106,7 @@ static void sd_config_discard(struct scsi_disk *sdkp, struct queue_limits *lim,
 		unsigned int mode);
 static void sd_config_write_same(struct scsi_disk *sdkp,
 		struct queue_limits *lim);
-static int  sd_revalidate_disk(struct gendisk *);
+static void  sd_revalidate_disk(struct gendisk *);
 static void sd_unlock_native_capacity(struct gendisk *disk);
 static void sd_shutdown(struct device *);
 static void scsi_disk_release(struct device *cdev);
@@ -3691,7 +3691,7 @@ static void sd_read_block_zero(struct scsi_disk *sdkp)
  *	performs disk spin up, read_capacity, etc.
  *	@disk: struct gendisk we care about
  **/
-static int sd_revalidate_disk(struct gendisk *disk)
+static void sd_revalidate_disk(struct gendisk *disk)
 {
 	struct scsi_disk *sdkp = scsi_disk(disk);
 	struct scsi_device *sdp = sdkp->device;
@@ -3699,7 +3699,7 @@ static int sd_revalidate_disk(struct gendisk *disk)
 	struct queue_limits *lim = NULL;
 	unsigned char *buffer = NULL;
 	unsigned int dev_max;
-	int err = 0;
+	int err;
 
 	SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp,
 				      "sd_revalidate_disk\n"));
@@ -3709,13 +3709,13 @@ static int sd_revalidate_disk(struct gendisk *disk)
 	 * of the other niceties.
 	 */
 	if (!scsi_device_online(sdp))
-		goto out;
+		return;
 
 	lim = kmalloc(sizeof(*lim), GFP_KERNEL);
 	if (!lim) {
 		sd_printk(KERN_WARNING, sdkp,
 			"sd_revalidate_disk: Disk limit allocation failure.\n");
-		goto out;
+		return;
 	}
 
 	buffer = kmalloc(SD_BUF_SIZE, GFP_KERNEL);
@@ -3829,7 +3829,6 @@ static int sd_revalidate_disk(struct gendisk *disk)
 	kfree(buffer);
 	kfree(lim);
 
-	return err;
 }
 
 /**
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v8 1/2] scsi: sd: Fix build warning in sd_revalidate_disk()
  2025-08-20 14:45 ` [PATCH v8 1/2] " Abinash Singh
@ 2025-08-22 19:47   ` Bart Van Assche
  2025-08-24 16:29     ` Abinash Singh
  0 siblings, 1 reply; 5+ messages in thread
From: Bart Van Assche @ 2025-08-22 19:47 UTC (permalink / raw)
  To: Abinash Singh, martin.petersen, James.Bottomley
  Cc: linux-scsi, linux-kernel, dlemoal

On 8/20/25 7:45 AM, Abinash Singh wrote:
> +	lim = kmalloc(sizeof(*lim), GFP_KERNEL);
> +	if (!lim) {
> +		sd_printk(KERN_WARNING, sdkp,
> +			"sd_revalidate_disk: Disk limit allocation failure.\n");
> +		goto out;
> +	}

 From Documentation/process/coding-style.rst:

These generic allocation functions all emit a stack dump on failure when 
used
without __GFP_NOWARN so there is no use in emitting an additional failure
message when NULL is returned.

>   	buffer = kmalloc(SD_BUF_SIZE, GFP_KERNEL);
>   	if (!buffer) {
>   		sd_printk(KERN_WARNING, sdkp, "sd_revalidate_disk: Memory "

Has this example perhaps been followed? I think it is safe to remove
this sd_printk() statement.

Otherwise this patch looks good to me.

Thanks,

Bart.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v8 1/2] scsi: sd: Fix build warning in sd_revalidate_disk()
  2025-08-22 19:47   ` Bart Van Assche
@ 2025-08-24 16:29     ` Abinash Singh
  0 siblings, 0 replies; 5+ messages in thread
From: Abinash Singh @ 2025-08-24 16:29 UTC (permalink / raw)
  To: Bart Van Assche
  Cc: martin.petersen, James.Bottomley, linux-scsi, linux-kernel,
	dlemoal

On Sat, Aug 23, 2025 at 1:17 AM Bart Van Assche <bvanassche@acm.org> wrote:
>
> > > On 8/20/25 7:45 AM, Abinash Singh wrote:
> > > +     lim = kmalloc(sizeof(*lim), GFP_KERNEL);
> >>  +     if (!lim) {
> > >+             sd_printk(KERN_WARNING, sdkp,
> > >+                     "sd_revalidate_disk: Disk limit allocation failure.\n");
> > >+             goto out;
> > >+     }
>
>   > From Documentation/process/coding-style.rst:
>
> > These generic allocation functions all emit a stack dump on failure when
> >used
> >without __GFP_NOWARN so there is no use in emitting an additional failure
> >message when NULL is returned.
>
> > Has this example perhaps been followed? I think it is safe to remove
> > this sd_printk() statement.
>
check patch emits this warning .
   WARNING: Possible unnecessary 'out of memory' message
  #52: FILE: drivers/scsi/sd.c:3716:
  + if (!lim) {
  + sd_printk(KERN_WARNING, sdkp,

So I think Bart is right about it . I will send v9 with these changes.

>
> > Otherwise this patch looks good to me.

In which patch should i remove this sd_printk statement . As it is
there already.
>>       buffer = kmalloc(SD_BUF_SIZE, GFP_KERNEL);
> >     if (!buffer) {
> >              sd_printk(KERN_WARNING, sdkp, "sd_revalidate_disk: Memory "

If we have to go with a seperate patch for this then  v9  will have
three patches:
                                                             1)  Fix
unnecessary 'out of memory' message in sd_revalidate_disk()
                                                             2)  Fix
build warning in sd_revalidate_disk()
                                                             3)  Make
sd_revalidat_disk() return void
>
> < Thanks,
> < Bart.


Thanks


On Sat, Aug 23, 2025 at 1:17 AM Bart Van Assche <bvanassche@acm.org> wrote:
>
> On 8/20/25 7:45 AM, Abinash Singh wrote:
> > +     lim = kmalloc(sizeof(*lim), GFP_KERNEL);
> > +     if (!lim) {
> > +             sd_printk(KERN_WARNING, sdkp,
> > +                     "sd_revalidate_disk: Disk limit allocation failure.\n");
> > +             goto out;
> > +     }
>
>  From Documentation/process/coding-style.rst:
>
> These generic allocation functions all emit a stack dump on failure when
> used
> without __GFP_NOWARN so there is no use in emitting an additional failure
> message when NULL is returned.
>
> >       buffer = kmalloc(SD_BUF_SIZE, GFP_KERNEL);
> >       if (!buffer) {
> >               sd_printk(KERN_WARNING, sdkp, "sd_revalidate_disk: Memory "
>
> Has this example perhaps been followed? I think it is safe to remove
> this sd_printk() statement.
>
> Otherwise this patch looks good to me.
>
> Thanks,
>
> Bart.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-08-24 16:29 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-20 14:45 [PATCH v8 0/2] scsi: sd: Fix build warning in sd_revalidate_disk() Abinash Singh
2025-08-20 14:45 ` [PATCH v8 1/2] " Abinash Singh
2025-08-22 19:47   ` Bart Van Assche
2025-08-24 16:29     ` Abinash Singh
2025-08-20 14:45 ` [PATCH v8 2/2] scsi: sd: make sd_revalidate_disk() return void Abinash Singh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).