[dm-devel] multipath_busy() stalls IO due to scsi_host_is_busy()

Mike Snitzer snitzer at redhat.com
Thu May 17 13:46:17 UTC 2012


On Thu, May 17 2012 at  5:09am -0400,
Jun'ichi Nomura <j-nomura at ce.jp.nec.com> wrote:

> Hi,
> 
> On 05/16/12 21:28, Bernd Schubert wrote:
> > Looking through the call chain, I see the underlying problem seems to be in scsi_host_is_busy().
> > 
> >> static inline int scsi_host_is_busy(struct Scsi_Host *shost)
> >> {
> >>     if ((shost->can_queue > 0 && shost->host_busy >= shost->can_queue) ||
> >>         shost->host_blocked || shost->host_self_blocked)
> >>         return 1;
> >>
> >>     return 0;
> >> }
> 
> multipath_busy() was introduced because, without that,
> a request would be prematurely sent down to SCSI,
> lose the chance of additional merges and result in
> bad performance.
> 
> However, when it is target/host that is busy, I think dm should
> send the request down and let SCSI, which has better knowledge
> about the shared resource, do appropriate starvation control.
> 
> Could you try the attached patch?
> 
> ---
> Jun'ichi Nomura, NEC Corporation
> 
> If sdev is not busy but starget and/or host is busy,
> it is better to accept a request from stacking driver.
> Otherwise, the stacking device could be starved by other device
> sharing the same target/host.

Great suggestion.

It should be noted that DM mpath is the only caller of blk_lld_busy (and
scsi_lld_busy).  So even though this patch may _seem_ like the tail
(mpath) wagging the dog (SCSI), it is reasonable to change SCSI's
definition of a LLD being "busy" if it benefits multipath.




More information about the dm-devel mailing list