From: Minh Duc Tran <[email protected]>

This blocking is ok if we use software iscsi or iser where each
connection has a separate host.  In the case of hw iscsi offload, one
host could have hundreds of connections and some connections may have
IOs running which makes host->host_busy is always TRUE.  Another
problem is the host_lock taken here is disruptive to other
connections' EH paths.  Wouldn't using target_busy a better choice
here?

void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn)
{
  .....
.......
        /*
         * Block until all in-progress commands for this connection
         * time out or fail.
         */
        for (;;) {
                spin_lock_irqsave(session->host->host_lock, flags);
                if (!atomic_read(&session->host->host_busy)) { /* OK
for ERL == 0 */
                        spin_unlock_irqrestore(session->host->host_lock, flags);
                        break;
                }
                spin_unlock_irqrestore(session->host->host_lock, flags);
                msleep_interruptible(500);
                iscsi_conn_printk(KERN_INFO, conn, "iscsi conn_destroy(): "
                                  "host_busy %d host_failed %d\n",
                                  atomic_read(&session->host->host_busy),
                                  session->host->host_failed);
                /*
                 * force eh_abort() to unblock
                 */
                wake_up(&conn->ehwait);
        }
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to