Re: [mpt3sas driver 05/10] mpt3sas: Make use of additional HighPriority credit message frames for sending SCSI IO's

2016-02-04 Thread Tomas Henzl
On 28.1.2016 07:37, Suganath prabu Subaramani wrote:
> From: Suganath prabu Subramani 
>
> Driver assumes HighPriority credit as part of Global credit. But,
> Firmware treats HighPriority credit value and global cedits as two
> different values. Changed host queue algorithm to treat global credits and
> highPriority credits as two different values.
>
> Signed-off-by: Suganath prabu Subramani 
> 
> Signed-off-by: Chaitra P B 

Reviewed-by: Tomas Henzl 

Tomas

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[mpt3sas driver 05/10] mpt3sas: Make use of additional HighPriority credit message frames for sending SCSI IO's

2016-01-27 Thread Suganath prabu Subaramani
From: Suganath prabu Subramani 

Driver assumes HighPriority credit as part of Global credit. But,
Firmware treats HighPriority credit value and global cedits as two
different values. Changed host queue algorithm to treat global credits and
highPriority credits as two different values.

Signed-off-by: Suganath prabu Subramani 
Signed-off-by: Chaitra P B 
---
 drivers/scsi/mpt3sas/mpt3sas_base.c  |  63 +++---
 drivers/scsi/mpt3sas/mpt3sas_base.h  |  27 ++
 drivers/scsi/mpt3sas/mpt3sas_scsih.c | 154 ++-
 3 files changed, 228 insertions(+), 16 deletions(-)

diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c 
b/drivers/scsi/mpt3sas/mpt3sas_base.c
index f59495b..31838d9a 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
@@ -775,7 +775,7 @@ mpt3sas_base_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 
msix_index,
 
mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply);
if (mpi_reply && mpi_reply->Function == MPI2_FUNCTION_EVENT_ACK)
-   return 1;
+   return mpt3sas_check_for_pending_internal_cmds(ioc, smid);
 
if (ioc->base_cmds.status == MPT3_CMD_NOT_USED)
return 1;
@@ -806,6 +806,7 @@ _base_async_event(struct MPT3SAS_ADAPTER *ioc, u8 
msix_index, u32 reply)
Mpi2EventNotificationReply_t *mpi_reply;
Mpi2EventAckRequest_t *ack_request;
u16 smid;
+   struct _event_ack_list *delayed_event_ack;
 
mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply);
if (!mpi_reply)
@@ -819,8 +820,18 @@ _base_async_event(struct MPT3SAS_ADAPTER *ioc, u8 
msix_index, u32 reply)
goto out;
smid = mpt3sas_base_get_smid(ioc, ioc->base_cb_idx);
if (!smid) {
-   pr_err(MPT3SAS_FMT "%s: failed obtaining a smid\n",
-   ioc->name, __func__);
+   delayed_event_ack = kzalloc(sizeof(*delayed_event_ack),
+   GFP_ATOMIC);
+   if (!delayed_event_ack)
+   goto out;
+   INIT_LIST_HEAD(&delayed_event_ack->list);
+   delayed_event_ack->Event = mpi_reply->Event;
+   delayed_event_ack->EventContext = mpi_reply->EventContext;
+   list_add_tail(&delayed_event_ack->list,
+   &ioc->delayed_event_ack_list);
+   dewtprintk(ioc, pr_info(MPT3SAS_FMT
+   "DELAYED: EVENT ACK: event (0x%04x)\n",
+   ioc->name, le16_to_cpu(mpi_reply->Event)));
goto out;
}
 
@@ -3189,20 +3200,35 @@ _base_allocate_memory_pools(struct MPT3SAS_ADAPTER 
*ioc,  int sleep_flag)
}
ioc->shost->sg_tablesize = sg_tablesize;
 
-   ioc->hi_priority_depth = facts->HighPriorityCredit;
-   ioc->internal_depth = ioc->hi_priority_depth + (5);
+   ioc->internal_depth = min_t(int, (facts->HighPriorityCredit + (5)),
+   (facts->RequestCredit / 4));
+   if (ioc->internal_depth < INTERNAL_CMDS_COUNT) {
+   if (facts->RequestCredit <= (INTERNAL_CMDS_COUNT +
+   INTERNAL_SCSIIO_CMDS_COUNT)) {
+   pr_err(MPT3SAS_FMT "IOC doesn't have enough Request \
+   Credits, it has just %d number of credits\n",
+   ioc->name, facts->RequestCredit);
+   return -ENOMEM;
+   }
+   ioc->internal_depth = 10;
+   }
+
+   ioc->hi_priority_depth = ioc->internal_depth - (5);
/* command line tunables  for max controller queue depth */
if (max_queue_depth != -1 && max_queue_depth != 0) {
max_request_credit = min_t(u16, max_queue_depth +
-   ioc->hi_priority_depth + ioc->internal_depth,
-   facts->RequestCredit);
+   ioc->internal_depth, facts->RequestCredit);
if (max_request_credit > MAX_HBA_QUEUE_DEPTH)
max_request_credit =  MAX_HBA_QUEUE_DEPTH;
} else
max_request_credit = min_t(u16, facts->RequestCredit,
MAX_HBA_QUEUE_DEPTH);
 
-   ioc->hba_queue_depth = max_request_credit;
+   /* Firmware maintains additional facts->HighPriorityCredit number of
+* credits for HiPriprity Request messages, so hba queue depth will be
+* sum of max_request_credit and high priority queue depth.
+*/
+   ioc->hba_queue_depth = max_request_credit + ioc->hi_priority_depth;
 
/* request frame size */
ioc->request_sz = facts->IOCRequestFrameSize * 4;
@@ -3249,7 +3275,6 @@ _base_allocate_memory_pools(struct MPT3SAS_ADAPTER *ioc,  
int sleep_flag)
ioc->reply_post_queue_depth += 16 -
(ioc->reply_post_queue_depth % 16);
 
-
if (ioc->reply_post_queue_depth >
facts->MaxReplyDescriptorPostQueueDepth) {