From: "Moore, Eric Dean" This should solve all the bad perf woes for mptfusion - for U320. * The syncronization between domain validation and bring up of the 2nd channel has moved; around mptscsih_doDv(). * The syncronization timeout is increased to 30 seconds, to be in line with the port enble timeout. Signed-off-by: Eric Moore Cc: James Bottomley Signed-off-by: Andrew Morton --- drivers/message/fusion/mptbase.c | 2 +- drivers/message/fusion/mptscsih.c | 22 ++++++++++------------ 2 files changed, 11 insertions(+), 13 deletions(-) diff -puN drivers/message/fusion/mptbase.c~mptfusion-bad-scsi-performance-fix drivers/message/fusion/mptbase.c --- 25/drivers/message/fusion/mptbase.c~mptfusion-bad-scsi-performance-fix Tue Nov 29 14:40:13 2005 +++ 25-akpm/drivers/message/fusion/mptbase.c Tue Nov 29 14:40:13 2005 @@ -1125,7 +1125,7 @@ mpt_verify_adapter(int iocid, MPT_ADAPTE int mpt_alt_ioc_wait(MPT_ADAPTER *ioc) { - int loop_count = 15 * 4; /* Wait 15 seconds */ + int loop_count = 30 * 4; /* Wait 30 seconds */ int status = -1; /* -1 means failed to get board READY */ do { diff -puN drivers/message/fusion/mptscsih.c~mptfusion-bad-scsi-performance-fix drivers/message/fusion/mptscsih.c --- 25/drivers/message/fusion/mptscsih.c~mptfusion-bad-scsi-performance-fix Tue Nov 29 14:40:13 2005 +++ 25-akpm/drivers/message/fusion/mptscsih.c Tue Nov 29 14:40:13 2005 @@ -3717,20 +3717,11 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTER return -EFAULT; } - if(mpt_alt_ioc_wait(hd->ioc)!=0) { - ddvprintk((MYIOC_s_WARN_FMT "alt_ioc busy!\n", - hd->ioc->name)); - return -EBUSY; - } - /* Get and Populate a free Frame */ if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) { ddvprintk((MYIOC_s_WARN_FMT "No msg frames!\n", hd->ioc->name)); - spin_lock(&hd->ioc->initializing_hba_lock); - hd->ioc->initializing_hba_lock_flag=0; - spin_unlock(&hd->ioc->initializing_hba_lock); return -EBUSY; } @@ -3820,9 +3811,6 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTER add_timer(&hd->timer); mpt_put_msg_frame(hd->ioc->InternalCtx, hd->ioc, mf); wait_event(hd->scandv_waitq, hd->scandv_wait_done); - spin_lock(&hd->ioc->initializing_hba_lock); - hd->ioc->initializing_hba_lock_flag=0; - spin_unlock(&hd->ioc->initializing_hba_lock); if (hd->pLocal) { rc = hd->pLocal->completion; @@ -4094,6 +4082,12 @@ mptscsih_domainValidation(void *arg) } } + if(mpt_alt_ioc_wait(hd->ioc)!=0) { + ddvprintk((MYIOC_s_WARN_FMT "alt_ioc busy!\n", + hd->ioc->name)); + continue; + } + if (mptscsih_doDv(hd, 0, id) == 1) { /* Untagged device was busy, try again */ @@ -4105,6 +4099,10 @@ mptscsih_domainValidation(void *arg) hd->ioc->spi_data.dvStatus[id] &= ~(MPT_SCSICFG_DV_NOT_DONE | MPT_SCSICFG_DV_PENDING); } + spin_lock(&hd->ioc->initializing_hba_lock); + hd->ioc->initializing_hba_lock_flag=0; + spin_unlock(&hd->ioc->initializing_hba_lock); + if (isPhysDisk) { for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) { if (hd->ioc->raid_data.isRaid & (1 << ii)) { _