mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Fang Hongjie(方洪杰)" <hongjiefang@asrmicro.com>
To: Alan Stern <stern@rowland.harvard.edu>
Cc: "James.Bottomley@hansenpartnership.com"
	<James.Bottomley@hansenpartnership.com>,
	"martin.petersen@oracle.com" <martin.petersen@oracle.com>,
	"jgarzik@redhat.com" <jgarzik@redhat.com>,
	"ming.m.lin@intel.com" <ming.m.lin@intel.com>,
	"linux-scsi@vger.kernel.org" <linux-scsi@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: RE: [PATCH] scsi: core: pair EH runtime PM get/put with eh_noresume snapshot
Date: Mon, 25 May 2026 01:59:30 +0000	[thread overview]
Message-ID: <e6f4f65a206d4208bce55caa9e1aaf6d@exch02.asrmicro.com> (raw)
In-Reply-To: <88f98e04-4ccc-416c-b677-f49a46ec97fb@rowland.harvard.edu>


> From: Alan Stern [mailto:stern@rowland.harvard.edu]
> Sent: Saturday, May 23, 2026 10:42 PM
> To: Fang Hongjie(方洪杰) <hongjiefang@asrmicro.com>
> Cc: James.Bottomley@hansenpartnership.com;
> martin.petersen@oracle.com; jgarzik@redhat.com; ming.m.lin@intel.com;
> linux-scsi@vger.kernel.org; linux-kernel@vger.kernel.org
> Subject: Re: [PATCH] scsi: core: pair EH runtime PM get/put with
> eh_noresume snapshot
> 
> On Sat, May 23, 2026 at 11:34:38AM +0800, Hongjie Fang wrote:
> > shost->eh_noresume is currently consulted twice in one error handling
> > iteration: once before scsi_autopm_get_host() and once again before
> > scsi_autopm_put_host().
> >
> > That is racy when a PM-triggered error path flips shost->eh_noresume
> while
> > the SCSI EH thread is still running.
> >
> > The problem flow looks like this:
> > PM path
> >   ufshcd_set_dev_pwr_mode()
> >     shost->eh_noresume = 1
> >     ufshcd_execute_start_stop  <-- trigger EH
> >     ...
> >     shost->eh_noresume = 0
> >
> > EH path
> >   scsi_error_handler()
> >     if (!shost->eh_noresume)
> >       scsi_autopm_get_host()  <-- skipped
> >     ...
> >     if (!shost->eh_noresume)
> >        scsi_autopm_put_host()  <-- executed later
> >
> > In that case one EH iteration can skip autoresume on entry and still drop a
> > runtime PM reference on exit. That leaves an unmatched runtime PM put
> and
> > can trigger a runtime PM usage count underflow.
> >
> > Fix this by snapshotting shost->eh_noresume once at the beginning of
> each
> > EH iteration and by calling scsi_autopm_put_host() only if the same
> > iteration successfully acquired a runtime PM reference through the
> > scsi_autopm_get_host().
> >
> > Fixes: ae0751ffc77e ("[SCSI] add flag to skip the runtime PM calls on the
> host")
> > Signed-off-by: Hongjie Fang <hongjiefang@asrmicro.com>
> > ---
> >  drivers/scsi/scsi_error.c | 21 ++++++++++++++-------
> >  1 file changed, 14 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
> > index 147127fb4db9..d83bfa24f184 100644
> > --- a/drivers/scsi/scsi_error.c
> > +++ b/drivers/scsi/scsi_error.c
> > @@ -2342,6 +2342,8 @@ static void scsi_unjam_host(struct Scsi_Host
> *shost)
> >  int scsi_error_handler(void *data)
> >  {
> >  	struct Scsi_Host *shost = data;
> > +	bool autopm_get;
> > +	bool skip_autopm;
> >
> >  	/*
> >  	 * We use TASK_INTERRUPTIBLE so that the thread is not
> > @@ -2383,12 +2385,17 @@ int scsi_error_handler(void *data)
> >  		 * what we need to do to get it up and online again (if we
> can).
> >  		 * If we fail, we end up taking the thing offline.
> >  		 */
> > -		if (!shost->eh_noresume &&
> scsi_autopm_get_host(shost) != 0) {
> > -			SCSI_LOG_ERROR_RECOVERY(1,
> > -				shost_printk(KERN_ERR, shost,
> > -					     "scsi_eh_%d: unable to
> autoresume\n",
> > -					     shost->host_no));
> > -			continue;
> > +		autopm_get = false;
> > +		skip_autopm = shost->eh_noresume;
> > +		if (!skip_autopm) {
> 
> Since this is the only place you use the skip_autopm variable, you may
> as well not introduce it at all.  Just test shost->eh_noresume directly.
> 
> Alan Stern
> 

Skip_autopm is not required, I will update it. 

> > +			if (scsi_autopm_get_host(shost) != 0) {
> > +				SCSI_LOG_ERROR_RECOVERY(1,
> > +					shost_printk(KERN_ERR, shost,
> > +						     "scsi_eh_%d: unable to
> autoresume\n",
> > +						     shost->host_no));
> > +				continue;
> > +			}
> > +			autopm_get = true;
> >  		}
> >
> >  		if (shost->transportt->eh_strategy_handler)
> > @@ -2407,7 +2414,7 @@ int scsi_error_handler(void *data)
> >  		 * which are still online.
> >  		 */
> >  		scsi_restart_operations(shost);
> > -		if (!shost->eh_noresume)
> > +		if (autopm_get)
> >  			scsi_autopm_put_host(shost);
> >  	}
> >  	__set_current_state(TASK_RUNNING);
> > --
> > 2.25.1
> >

Best.

      reply	other threads:[~2026-05-25  2:00 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-23  3:34 Hongjie Fang
2026-05-23 14:42 ` Alan Stern
2026-05-25  1:59   ` Fang Hongjie(方洪杰) [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e6f4f65a206d4208bce55caa9e1aaf6d@exch02.asrmicro.com \
    --to=hongjiefang@asrmicro.com \
    --cc=James.Bottomley@hansenpartnership.com \
    --cc=jgarzik@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=ming.m.lin@intel.com \
    --cc=stern@rowland.harvard.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®