[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