From: Christoph Hellwig <hch@lst.de>
To: "Moore, Eric Dean" <Emoore@lsil.com>
Cc: linux-scsi@vger.kernel.org, fukuchi.masao@jp.fujitsu.com
Subject: Re: [PATCH] fix dma mapping leak in fusion
Date: Tue, 17 Aug 2004 19:17:37 +0200 [thread overview]
Message-ID: <20040817171737.GA17646@lst.de> (raw)
In-Reply-To: <20040817164614.GA16953@lst.de>
Okay, here's an untested patch that gets rid of the fusion pendingQ in
favour of using the scsi midlayer queueing, this should reduce the
number of commands that are pending in fusion to a minimum. We still
have to get rid of the doneQ aswell, but I want to understand the full
implications first.
--- 1.25/drivers/message/fusion/mptbase.h 2004-08-10 00:42:45 +02:00
+++ edited/drivers/message/fusion/mptbase.h 2004-08-17 21:07:50 +02:00
@@ -1031,7 +1031,6 @@
u8 *memQ;
DONE_Q_TRACKER freeQ;
DONE_Q_TRACKER doneQ; /* Holds Linux formmatted requests */
- DONE_Q_TRACKER pendingQ; /* Holds MPI formmatted requests */
MPT_Q_TRACKER taskQ; /* TM request Q */
spinlock_t freedoneQlock;
int taskQcnt;
--- 1.45/drivers/message/fusion/mptscsih.c 2004-08-03 01:01:01 +02:00
+++ edited/drivers/message/fusion/mptscsih.c 2004-08-17 21:12:35 +02:00
@@ -168,8 +168,6 @@
static void copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR *mf, SCSIIOReply_t *pScsiReply);
static int mptscsih_tm_pending_wait(MPT_SCSI_HOST * hd);
static u32 SCPNT_TO_LOOKUP_IDX(struct scsi_cmnd *sc);
-static MPT_FRAME_HDR *mptscsih_search_pendingQ(MPT_SCSI_HOST *hd, int scpnt_idx);
-static void post_pendingQ_commands(MPT_SCSI_HOST *hd);
static int mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, int ctx2abort, ulong timeout, int sleepFlag);
static int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, int ctx2abort, ulong timeout, int sleepFlag);
@@ -1002,11 +1000,6 @@
/* Command found.
*/
- /* Search pendingQ, if found,
- * delete from Q.
- */
- mptscsih_search_pendingQ(hd, ii);
-
/* Null ScsiLookup index
*/
hd->ScsiLookup[ii] = NULL;
@@ -1346,7 +1339,6 @@
*/
Q_INIT(&hd->freeQ, MPT_DONE_Q);
Q_INIT(&hd->doneQ, MPT_DONE_Q);
- Q_INIT(&hd->pendingQ, MPT_DONE_Q);
spin_lock_init(&hd->freedoneQlock);
mem = hd->memQ;
@@ -2043,16 +2034,9 @@
(hd && hd->ioc) ? hd->ioc->name : "ioc?", SCpnt, done));
if (hd->resetPending) {
- /* Prevent new commands from being issued
- * while reloading the FW. Reset timer to 60 seconds,
- * as the FW can take some time to come ready.
- * For New EH, cmds on doneQ posted to FW.
- */
- did_errcode = 1;
- mod_timer(&SCpnt->eh_timeout, jiffies + (HZ * 60));
dtmprintk((MYIOC_s_WARN_FMT "qcmd: SCpnt=%p timeout + 60HZ\n",
(hd && hd->ioc) ? hd->ioc->name : "ioc?", SCpnt));
- goto did_error;
+ return SCSI_MLQUEUE_HOST_BUSY;
}
/*
@@ -2061,8 +2045,7 @@
if ((mf = mpt_get_msg_frame(ScsiDoneCtx, hd->ioc)) == NULL) {
dprintk((MYIOC_s_WARN_FMT "QueueCmd, no msg frames!!\n",
hd->ioc->name));
- did_errcode = 2;
- goto did_error;
+ return SCSI_MLQUEUE_HOST_BUSY;
}
pScsiReq = (SCSIIORequest_t *) mf;
@@ -2211,64 +2194,17 @@
dmfprintk((MYIOC_s_INFO_FMT "Issued SCSI cmd (%p) mf=%p idx=%d\n",
hd->ioc->name, SCpnt, mf, my_idx));
DBG_DUMP_REQUEST_FRAME(mf)
- } else {
- ddvtprintk((MYIOC_s_INFO_FMT "Pending cmd=%p idx %d\n",
- hd->ioc->name, SCpnt, my_idx));
- /* Place this command on the pendingQ if possible */
- spin_lock_irqsave(&hd->freedoneQlock, flags);
- if (!Q_IS_EMPTY(&hd->freeQ)) {
- buffer = hd->freeQ.head;
- Q_DEL_ITEM(buffer);
-
- /* Save the mf pointer
- */
- buffer->argp = (void *)mf;
-
- /* Add to the pendingQ
- */
- Q_ADD_TAIL(&hd->pendingQ.head, buffer, MPT_DONE_Q);
- spin_unlock_irqrestore(&hd->freedoneQlock, flags);
- } else {
- spin_unlock_irqrestore(&hd->freedoneQlock, flags);
- SCpnt->result = (DID_BUS_BUSY << 16);
- SCpnt->scsi_done(SCpnt);
- }
- }
- } else {
- mptscsih_freeChainBuffers(hd->ioc, my_idx);
- mpt_free_msg_frame(hd->ioc, mf);
- did_errcode = 3;
- goto did_error;
- }
+ } else
+ goto fail;
+ } else
+ goto fail;
return 0;
-did_error:
- dprintk((MYIOC_s_WARN_FMT "_qcmd did_errcode=%d (sc=%p)\n",
- hd->ioc->name, did_errcode, SCpnt));
- /* Just wish OS to issue a retry */
- SCpnt->result = (DID_BUS_BUSY << 16);
- spin_lock_irqsave(&hd->freedoneQlock, flags);
- if (!Q_IS_EMPTY(&hd->freeQ)) {
- dtmprintk((MYIOC_s_WARN_FMT "SCpnt=%p to doneQ\n",
- (hd && hd->ioc) ? hd->ioc->name : "ioc?", SCpnt));
- buffer = hd->freeQ.head;
- Q_DEL_ITEM(buffer);
-
- /* Set the scsi_cmnd pointer
- */
- buffer->argp = (void *)SCpnt;
-
- /* Add to the doneQ
- */
- Q_ADD_TAIL(&hd->doneQ.head, buffer, MPT_DONE_Q);
- spin_unlock_irqrestore(&hd->freedoneQlock, flags);
- } else {
- spin_unlock_irqrestore(&hd->freedoneQlock, flags);
- SCpnt->scsi_done(SCpnt);
- }
-
- return 0;
+ fail:
+ mptscsih_freeChainBuffers(hd->ioc, my_idx);
+ mpt_free_msg_frame(hd->ioc, mf);
+ return SCSI_MLQUEUE_HOST_BUSY;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -2551,7 +2487,7 @@
*
* Returns SUCCESS or FAILED.
*/
-int
+static int
mptscsih_abort(struct scsi_cmnd * SCpnt)
{
MPT_SCSI_HOST *hd;
@@ -2595,18 +2531,6 @@
return SUCCESS;
}
- /* If this command is pended, then timeout/hang occurred
- * during DV. Post command and flush pending Q
- * and then following up with the reset request.
- */
- if ((mf = mptscsih_search_pendingQ(hd, scpnt_idx)) != NULL) {
- mpt_put_msg_frame(ScsiDoneCtx, hd->ioc, mf);
- post_pendingQ_commands(hd);
- dtmprintk((KERN_WARNING MYNAM ": %s: mptscsih_abort: "
- "Posting pended cmd! (sc=%p)\n",
- hd->ioc->name, SCpnt));
- }
-
/* Most important! Set TaskMsgContext to SCpnt's MsgContext!
* (the IO to be ABORT'd)
*
@@ -3257,102 +3181,6 @@
return -1;
}
-
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/* Search the pendingQ for a command with specific index.
- * If found, delete and return mf pointer
- * If not found, return NULL
- */
-static MPT_FRAME_HDR *
-mptscsih_search_pendingQ(MPT_SCSI_HOST *hd, int scpnt_idx)
-{
- unsigned long flags;
- MPT_DONE_Q *buffer;
- MPT_FRAME_HDR *mf = NULL;
- MPT_FRAME_HDR *cmdMfPtr;
-
- ddvtprintk((MYIOC_s_INFO_FMT ": search_pendingQ ...", hd->ioc->name));
- cmdMfPtr = MPT_INDEX_2_MFPTR(hd->ioc, scpnt_idx);
- spin_lock_irqsave(&hd->freedoneQlock, flags);
- if (!Q_IS_EMPTY(&hd->pendingQ)) {
- buffer = hd->pendingQ.head;
- do {
- mf = (MPT_FRAME_HDR *) buffer->argp;
- if (mf == cmdMfPtr) {
- Q_DEL_ITEM(buffer);
-
- /* clear the arg pointer
- */
- buffer->argp = NULL;
-
- /* Add to the freeQ
- */
- Q_ADD_TAIL(&hd->freeQ.head, buffer, MPT_DONE_Q);
- break;
- }
- mf = NULL;
- } while ((buffer = buffer->forw) != (MPT_DONE_Q *) &hd->pendingQ);
- }
- spin_unlock_irqrestore(&hd->freedoneQlock, flags);
- ddvtprintk((" ...return %p\n", mf));
- return mf;
-}
-
-/* Post all commands on the pendingQ to the FW.
- * Lock Q when deleting/adding members
- * Lock io_request_lock for OS callback.
- */
-static void
-post_pendingQ_commands(MPT_SCSI_HOST *hd)
-{
- MPT_FRAME_HDR *mf;
- MPT_DONE_Q *buffer;
- unsigned long flags;
-
- /* Flush the pendingQ.
- */
- ddvtprintk((MYIOC_s_INFO_FMT ": post_pendingQ_commands\n", hd->ioc->name));
- while (1) {
- spin_lock_irqsave(&hd->freedoneQlock, flags);
- if (Q_IS_EMPTY(&hd->pendingQ)) {
- spin_unlock_irqrestore(&hd->freedoneQlock, flags);
- break;
- }
-
- buffer = hd->pendingQ.head;
- /* Delete from Q
- */
- Q_DEL_ITEM(buffer);
-
- mf = (MPT_FRAME_HDR *) buffer->argp;
- buffer->argp = NULL;
-
- /* Add to the freeQ
- */
- Q_ADD_TAIL(&hd->freeQ.head, buffer, MPT_DONE_Q);
- spin_unlock_irqrestore(&hd->freedoneQlock, flags);
-
- if (!mf) {
- /* This should never happen */
- printk(MYIOC_s_WARN_FMT "post_pendingQ_commands: mf %p\n", hd->ioc->name, (void *) mf);
- continue;
- }
-
- mpt_put_msg_frame(ScsiDoneCtx, hd->ioc, mf);
-
-#if defined(MPT_DEBUG_DV) || defined(MPT_DEBUG_DV_TINY)
- {
- u16 req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx);
- struct scsi_cmnd *sc = hd->ScsiLookup[req_idx];
- printk(MYIOC_s_INFO_FMT "Issued SCSI cmd (sc=%p) idx=%d (mf=%p)\n",
- hd->ioc->name, sc, req_idx, mf);
- }
-#endif
- }
-
- return;
-}
-
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
static int
mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
@@ -5174,11 +5003,6 @@
}
}
}
-
- /* Post OS IOs that were pended while
- * DV running.
- */
- post_pendingQ_commands(hd);
if (hd->ioc->spi_data.noQas)
mptscsih_qas_check(hd, id);
next prev parent reply other threads:[~2004-08-17 17:17 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-08-17 16:42 [PATCH] fix dma mapping leak in fusion Moore, Eric Dean
2004-08-17 16:46 ` Christoph Hellwig
2004-08-17 17:17 ` Christoph Hellwig [this message]
2004-08-17 18:18 ` Luben Tuikov
-- strict thread matches above, loose matches on Subject: below --
2004-08-31 14:42 Moore, Eric Dean
2004-08-30 22:29 Moore, Eric Dean
2004-08-31 12:56 ` Luben Tuikov
2004-08-31 13:14 ` Luben Tuikov
2004-08-23 15:56 Moore, Eric Dean
2004-08-28 19:02 ` Christoph Hellwig
2004-08-20 15:01 Moore, Eric Dean
2004-08-23 1:41 ` Masao Fukuchi
2004-08-19 14:47 Moore, Eric Dean
2004-08-20 3:05 ` Masao Fukuchi
2004-08-17 16:16 Christoph Hellwig
2004-08-19 3:01 ` Masao Fukuchi
2004-08-19 10:14 ` Christoph Hellwig
2004-08-19 13:14 ` Masao Fukuchi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040817171737.GA17646@lst.de \
--to=hch@lst.de \
--cc=Emoore@lsil.com \
--cc=fukuchi.masao@jp.fujitsu.com \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).