lkml.org 
[lkml]   [2010]   [Dec]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH 07/12] qla2xxx: Convert to host_lock less w/ interrupts disabled externally
    From
    Date
    On Sun, 2010-12-19 at 16:11 -0700, Matthew Wilcox wrote:
    > On Sun, Dec 19, 2010 at 01:22:02PM -0800, Nicholas A. Bellinger wrote:
    > > This patch converts qla2xxx to run in host_lock less mode with the new
    > > IRQ_DISABLE_SCSI_QCMD() that disables interrupts while calling ->queuecommand()
    > > dispatch. It also drops the legacy host_lock unlock optimization.
    >
    > I'm not sure this is the right direction to go. Now that Jeff's done
    > the pushdown and put in the compatibility macros, I don't think it makes
    > sense to do another partial transition on each driver. Much better to
    > take our time, analyse each driver thoroughly, and kill the DEF_SCSI_QCMD
    > in each driver without introducing IRQ_DISABLE_SCSI_QCMD.
    >
    > In particular for this driver, it explicitly re-enables interrupts,
    > so it's pretty easy to do a full conversion. Compile-tested only.
    >
    > Convert qla2xxx driver to run without the shost lock
    >
    > Signed-off-by: Matthew Wilcox <willy@linux.intel.com>

    Ok, this patch is functioning with LTP disktest I/O using .37-rc6
    initiator side lock_less operation.

    This has been added as an incremental patch for lock_less-LLDs-for-38-v3
    here:

    commit 355798dc3d97a0f07b14d1f3891ecca1802c9094
    Author: Nicholas Bellinger <nab@linux-iscsi.org>
    Date: Mon Dec 20 01:24:12 2010 -0800

    qla2xxx: Convert qla2xxx driver to run without the shost lock

    This patch converts qla2xxx LLD code to run in fully lock-less mode
    and removes IRQ_DISABLE_SCSI_QCMD usage. This also includes a handful
    of cleanups for cmd->scsi_done assignment removal from qla2x00_get_new_sp()
    and renames one goto of the exception patch with the '_lock' suffix in
    qla2xxx_queuecommand().

    So far this patch has been lightly tested with basic I/O functionality on
    bare-metal x86_64 .37-rc6 using ISP-2532 8 Gb/sec HW.

    Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
    Signed-off-by: Nicholas A. Bellinger <nab@linux-iscsi.org>

    Thanks!

    --nab

    >
    > diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
    > index 2c0876c..b44d986 100644
    > --- a/drivers/scsi/qla2xxx/qla_os.c
    > +++ b/drivers/scsi/qla2xxx/qla_os.c
    > @@ -513,7 +513,7 @@ qla24xx_fw_version_str(struct scsi_qla_host *vha, char *str)
    >
    > static inline srb_t *
    > qla2x00_get_new_sp(scsi_qla_host_t *vha, fc_port_t *fcport,
    > - struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
    > + struct scsi_cmnd *cmd)
    > {
    > srb_t *sp;
    > struct qla_hw_data *ha = vha->hw;
    > @@ -527,16 +527,15 @@ qla2x00_get_new_sp(scsi_qla_host_t *vha, fc_port_t *fcport,
    > sp->cmd = cmd;
    > sp->flags = 0;
    > CMD_SP(cmd) = (void *)sp;
    > - cmd->scsi_done = done;
    > sp->ctx = NULL;
    >
    > return sp;
    > }
    >
    > static int
    > -qla2xxx_queuecommand_lck(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
    > +qla2xxx_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
    > {
    > - scsi_qla_host_t *vha = shost_priv(cmd->device->host);
    > + scsi_qla_host_t *vha = shost_priv(shost);
    > fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata;
    > struct fc_rport *rport = starget_to_rport(scsi_target(cmd->device));
    > struct qla_hw_data *ha = vha->hw;
    > @@ -544,7 +543,6 @@ qla2xxx_queuecommand_lck(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)
    > srb_t *sp;
    > int rval;
    >
    > - spin_unlock_irq(vha->host->host_lock);
    > if (ha->flags.eeh_busy) {
    > if (ha->flags.pci_channel_io_perm_failure)
    > cmd->result = DID_NO_CONNECT << 16;
    > @@ -577,39 +575,32 @@ qla2xxx_queuecommand_lck(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)
    > goto qc24_target_busy;
    > }
    >
    > - sp = qla2x00_get_new_sp(base_vha, fcport, cmd, done);
    > + sp = qla2x00_get_new_sp(base_vha, fcport, cmd);
    > if (!sp)
    > - goto qc24_host_busy_lock;
    > + goto qc24_host_busy;
    >
    > rval = ha->isp_ops->start_scsi(sp);
    > if (rval != QLA_SUCCESS)
    > goto qc24_host_busy_free_sp;
    >
    > - spin_lock_irq(vha->host->host_lock);
    > -
    > return 0;
    >
    > qc24_host_busy_free_sp:
    > qla2x00_sp_free_dma(sp);
    > mempool_free(sp, ha->srb_mempool);
    >
    > -qc24_host_busy_lock:
    > - spin_lock_irq(vha->host->host_lock);
    > +qc24_host_busy:
    > return SCSI_MLQUEUE_HOST_BUSY;
    >
    > qc24_target_busy:
    > - spin_lock_irq(vha->host->host_lock);
    > return SCSI_MLQUEUE_TARGET_BUSY;
    >
    > qc24_fail_command:
    > - spin_lock_irq(vha->host->host_lock);
    > - done(cmd);
    > + cmd->scsi_done(cmd);
    >
    > return 0;
    > }
    >
    > -static DEF_SCSI_QCMD(qla2xxx_queuecommand)
    > -
    >
    > /*
    > * qla2x00_eh_wait_on_command
    >



    \
     
     \ /
      Last update: 2010-12-20 10:33    [W:4.114 / U:0.204 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site