tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: SCSI changes - PR58452 for review



> Date: Fri, 9 Aug 2024 22:15:44 +1000
> From: Nat Sloss <nathanialsloss%yahoo.com.au@localhost>
> 
> On Wed, 7 Aug 2024 10:21:28 Taylor R Campbell wrote:
> 
> > Instead of introducing scsipi_done_once, why not just freeze and thaw
> > the channel around scsipi_done?
> 
> I tried the following and it resulted in a slew of error messages from the 
> kernel resetting the scsi bus/ aborting.
> 
> +	scsipi_channel_freeze(&sc->sc_channel, 1);
>  
>   	/* Tell common SCSI code it is done. */
>   	scsipi_done(xs);
>    	sc->sc_state = NCR_IDLE;
> 
> 	/* Now ncr5380_sched() may be called again. */
> 
> +	scsipi_channel_thaw(&sc->sc_channel, 1);

Can you maybe do the freeze/thaw conditionally, only if the xfer is
being aborted?

+	if (xs is aborting)
+		scsipi_channel_freeze(&sc->sc_channel, 1);
...	scsipi_done(xs); ...
+	if (xs is aborting)
+		scsipi_channel_thaw(&sc->sc_channel, 1);

> I guess in both cases another request is sent to the controller in 
> scsipi_run_queue, called from scsipi_done which results in an inconsistient 
> state.

What inconsistent state is that?

> scspi_done_once, and thaw with an argument of 0 to kick the queue as posted 
> earlier works great (with a noticable improvent - most shell commands 
> responding/starting twice as fast as usual).

I'm just puzzled how this could make a difference, because the logic
is essentially:

	/* scsipi_channel_freeze(&sc->sc_channel, 1); */
	chan->chan_qfreeze++;

	/* scsipi_done(xs); */
	handle scsi xfer completion actions;
	if (chan->chan_qfreeze == 0) {	/* scsipi_run_queue */
		/* look for more work to do and do it */
	}
	/* sc->sc_state = NCR_IDLE; */

	/* scsipi_channel_freeze(&sc->sc_channel, 1); */
	if (--chan->chan_qfreeze == 0) {
		if (chan->chan_qfreeze == 0) {	/* scsipi_run_queue */
			/* look for more work to do and do it */
		}
	}

So unless there's other logic inside scsipi_done that depends on
chan->chan_qfreeze, it seems like the scsipi_done_once approach and
the freeze/scsipi_done/thaw approach should be equivalent.

But there's obviously something else going on here that I don't
understand -- and I find that concerning, because it means there's a
_much more interesting_ semantic difference between scsipi_done and
scsipi_done_once than I understand, and that makes me concerned
there's something incoherent about the scsi API that might affect lots
of drivers.


Home | Main Index | Thread Index | Old Index