From: "Stephen M. Cameron" <scameron@beardog.cce.hp.com>
To: james.bottomley@parallels.com
Cc: webb.scales@hp.com, martin.petersen@oracle.com,
linux-scsi@vger.kernel.org, justin.lindley@hp.com,
stephenmcameron@gmail.com, joseph.t.handzik@hp.com,
thenzl@redhat.com, michael.miller@canonical.com,
scott.teel@hp.com, hch@lst.de, dan.carpenter@oracle.com
Subject: [PATCH 2 09/24] hpsa: allocate reply queues individually
Date: Thu, 29 May 2014 10:53:07 -0500 [thread overview]
Message-ID: <20140529155307.8180.30614.stgit@beardog.cce.hp.com> (raw)
In-Reply-To: <20140529154739.8180.50710.stgit@beardog.cce.hp.com>
From: Stephen M. Cameron <scameron@beardog.cce.hp.com>
Now that we can allocate more than 4 reply queues (up to 64)
we shouldn't try to make them share the same allocation but
should allocate them separately.
Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
Reviewed-by: Mike Miller <michael.miller@canonical.com>
Reviewed-by: Scott Teel <scott.teel@hp.com>
---
drivers/scsi/hpsa.c | 53 +++++++++++++++++++++++++++++++--------------------
drivers/scsi/hpsa.h | 13 ++++++-------
2 files changed, 38 insertions(+), 28 deletions(-)
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
index b903e86..9c44f26 100644
--- a/drivers/scsi/hpsa.c
+++ b/drivers/scsi/hpsa.c
@@ -695,7 +695,7 @@ static inline void addQ(struct list_head *list, struct CommandList *c)
static inline u32 next_command(struct ctlr_info *h, u8 q)
{
u32 a;
- struct reply_pool *rq = &h->reply_queue[q];
+ struct reply_queue_buffer *rq = &h->reply_queue[q];
unsigned long flags;
if (h->transMethod & CFGTBL_Trans_io_accel1)
@@ -6700,6 +6700,20 @@ static void hpsa_free_irqs_and_disable_msix(struct ctlr_info *h)
#endif /* CONFIG_PCI_MSI */
}
+static void hpsa_free_reply_queues(struct ctlr_info *h)
+{
+ int i;
+
+ for (i = 0; i < h->nreply_queues; i++) {
+ if (!h->reply_queue[i].head)
+ continue;
+ pci_free_consistent(h->pdev, h->reply_queue_size,
+ h->reply_queue[i].head, h->reply_queue[i].busaddr);
+ h->reply_queue[i].head = NULL;
+ h->reply_queue[i].busaddr = 0;
+ }
+}
+
static void hpsa_undo_allocations_after_kdump_soft_reset(struct ctlr_info *h)
{
hpsa_free_irqs_and_disable_msix(h);
@@ -6707,8 +6721,7 @@ static void hpsa_undo_allocations_after_kdump_soft_reset(struct ctlr_info *h)
hpsa_free_cmd_pool(h);
kfree(h->ioaccel1_blockFetchTable);
kfree(h->blockFetchTable);
- pci_free_consistent(h->pdev, h->reply_pool_size,
- h->reply_pool, h->reply_pool_dhandle);
+ hpsa_free_reply_queues(h);
if (h->vaddr)
iounmap(h->vaddr);
if (h->transtable)
@@ -7157,8 +7170,7 @@ static void hpsa_remove_one(struct pci_dev *pdev)
pci_free_consistent(h->pdev,
h->nr_cmds * sizeof(struct ErrorInfo),
h->errinfo_pool, h->errinfo_pool_dhandle);
- pci_free_consistent(h->pdev, h->reply_pool_size,
- h->reply_pool, h->reply_pool_dhandle);
+ hpsa_free_reply_queues(h);
kfree(h->cmd_pool_bits);
kfree(h->blockFetchTable);
kfree(h->ioaccel1_blockFetchTable);
@@ -7271,7 +7283,8 @@ static void hpsa_enter_performant_mode(struct ctlr_info *h, u32 trans_support)
*/
/* Controller spec: zero out this buffer. */
- memset(h->reply_pool, 0, h->reply_pool_size);
+ for (i = 0; i < h->nreply_queues; i++)
+ memset(h->reply_queue[i].head, 0, h->reply_queue_size);
bft[7] = SG_ENTRIES_IN_CMD + 4;
calc_bucket_map(bft, ARRAY_SIZE(bft),
@@ -7287,8 +7300,7 @@ static void hpsa_enter_performant_mode(struct ctlr_info *h, u32 trans_support)
for (i = 0; i < h->nreply_queues; i++) {
writel(0, &h->transtable->RepQAddr[i].upper);
- writel(h->reply_pool_dhandle +
- (h->max_commands * sizeof(u64) * i),
+ writel(h->reply_queue[i].busaddr,
&h->transtable->RepQAddr[i].lower);
}
@@ -7336,8 +7348,10 @@ static void hpsa_enter_performant_mode(struct ctlr_info *h, u32 trans_support)
h->ioaccel1_blockFetchTable);
/* initialize all reply queue entries to unused */
- memset(h->reply_pool, (u8) IOACCEL_MODE1_REPLY_UNUSED,
- h->reply_pool_size);
+ for (i = 0; i < h->nreply_queues; i++)
+ memset(h->reply_queue[i].head,
+ (u8) IOACCEL_MODE1_REPLY_UNUSED,
+ h->reply_queue_size);
/* set all the constant fields in the accelerator command
* frames once at init time to save CPU cycles later.
@@ -7493,16 +7507,17 @@ static void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h)
}
}
- /* TODO, check that this next line h->nreply_queues is correct */
h->nreply_queues = h->msix_vector > 0 ? h->msix_vector : 1;
hpsa_get_max_perf_mode_cmds(h);
/* Performant mode ring buffer and supporting data structures */
- h->reply_pool_size = h->max_commands * sizeof(u64) * h->nreply_queues;
- h->reply_pool = pci_alloc_consistent(h->pdev, h->reply_pool_size,
- &(h->reply_pool_dhandle));
+ h->reply_queue_size = h->max_commands * sizeof(u64);
for (i = 0; i < h->nreply_queues; i++) {
- h->reply_queue[i].head = &h->reply_pool[h->max_commands * i];
+ h->reply_queue[i].head = pci_alloc_consistent(h->pdev,
+ h->reply_queue_size,
+ &(h->reply_queue[i].busaddr));
+ if (!h->reply_queue[i].head)
+ goto clean_up;
h->reply_queue[i].size = h->max_commands;
h->reply_queue[i].wraparound = 1; /* spec: init to 1 */
h->reply_queue[i].current_entry = 0;
@@ -7511,18 +7526,14 @@ static void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h)
/* Need a block fetch table for performant mode */
h->blockFetchTable = kmalloc(((SG_ENTRIES_IN_CMD + 1) *
sizeof(u32)), GFP_KERNEL);
-
- if ((h->reply_pool == NULL)
- || (h->blockFetchTable == NULL))
+ if (!h->blockFetchTable)
goto clean_up;
hpsa_enter_performant_mode(h, trans_support);
return;
clean_up:
- if (h->reply_pool)
- pci_free_consistent(h->pdev, h->reply_pool_size,
- h->reply_pool, h->reply_pool_dhandle);
+ hpsa_free_reply_queues(h);
kfree(h->blockFetchTable);
}
diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h
index da67c07..fa63576 100644
--- a/drivers/scsi/hpsa.h
+++ b/drivers/scsi/hpsa.h
@@ -57,11 +57,12 @@ struct hpsa_scsi_dev_t {
};
-struct reply_pool {
+struct reply_queue_buffer {
u64 *head;
size_t size;
u8 wraparound;
u32 current_entry;
+ dma_addr_t busaddr;
};
#pragma pack(1)
@@ -173,11 +174,9 @@ struct ctlr_info {
/*
* Performant mode completion buffers
*/
- u64 *reply_pool;
- size_t reply_pool_size;
- struct reply_pool reply_queue[MAX_REPLY_QUEUES];
+ size_t reply_queue_size;
+ struct reply_queue_buffer reply_queue[MAX_REPLY_QUEUES];
u8 nreply_queues;
- dma_addr_t reply_pool_dhandle;
u32 *blockFetchTable;
u32 *ioaccel1_blockFetchTable;
u32 *ioaccel2_blockFetchTable;
@@ -391,7 +390,7 @@ static void SA5_performant_intr_mask(struct ctlr_info *h, unsigned long val)
static unsigned long SA5_performant_completed(struct ctlr_info *h, u8 q)
{
- struct reply_pool *rq = &h->reply_queue[q];
+ struct reply_queue_buffer *rq = &h->reply_queue[q];
unsigned long flags, register_value = FIFO_EMPTY;
/* msi auto clears the interrupt pending bit. */
@@ -506,7 +505,7 @@ static bool SA5_ioaccel_mode1_intr_pending(struct ctlr_info *h)
static unsigned long SA5_ioaccel_mode1_completed(struct ctlr_info *h, u8 q)
{
u64 register_value;
- struct reply_pool *rq = &h->reply_queue[q];
+ struct reply_queue_buffer *rq = &h->reply_queue[q];
unsigned long flags;
BUG_ON(q >= h->nreply_queues);
next prev parent reply other threads:[~2014-05-29 15:53 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-29 15:52 [PATCH 2 00/24] Resend of May 2014 patches for hpsa driver Stephen M. Cameron
2014-05-29 15:52 ` [PATCH 2 01/24] hpsa: add new Smart Array PCI IDs (May 2014) Stephen M. Cameron
2014-05-29 15:52 ` [PATCH 2 02/24] hpsa: fix missing check of kzalloc return value Stephen M. Cameron
2014-05-29 15:52 ` [PATCH 2 03/24] hpsa: remove unused fields from struct ctlr_info Stephen M. Cameron
2014-05-29 15:52 ` [PATCH 2 04/24] hpsa: allow passthru ioctls to work with bidirectional commands Stephen M. Cameron
2014-05-29 15:52 ` [PATCH 2 05/24] hpsa: change doorbell reset delay to ten seconds Stephen M. Cameron
2014-05-29 15:52 ` [PATCH 2 06/24] hpsa: use gcc aligned attribute instead of manually padding structs Stephen M. Cameron
2014-05-29 15:52 ` [PATCH 2 07/24] hpsa: remove dev_dbg() calls from hot paths Stephen M. Cameron
2014-05-29 15:53 ` [PATCH 2 08/24] hpsa: choose number of reply queues more intelligently Stephen M. Cameron
2014-06-02 9:27 ` Christoph Hellwig
2014-06-02 14:52 ` scameron
2014-06-02 15:00 ` scameron
2014-05-29 15:53 ` Stephen M. Cameron [this message]
2014-05-29 15:53 ` [PATCH 2 10/24] hpsa: set irq affinity hints to route MSI-X vectors across CPUs Stephen M. Cameron
2014-05-29 15:53 ` [PATCH 2 11/24] hpsa: use per-cpu variable for lockup_detected Stephen M. Cameron
2014-05-29 15:53 ` [PATCH 2 12/24] hpsa: avoid unnecessary readl on every command submission Stephen M. Cameron
2014-05-29 15:53 ` [PATCH 2 13/24] hpsa: Rearrange start_io to avoid one unlock/lock sequence in main io path Stephen M. Cameron
2014-05-29 15:53 ` [PATCH 2 14/24] hpsa: define extended_report_lun_entry data structure Stephen M. Cameron
2014-05-29 15:53 ` [PATCH 2 15/24] hpsa: kill annoying messages about SSD Smart Path retries Stephen M. Cameron
2014-05-29 15:53 ` [PATCH 2 16/24] hpsa: fix event filtering to prevent excessive rescans with old firmware Stephen M. Cameron
2014-05-29 15:53 ` [PATCH 2 17/24] hpsa: remove bad unlikely annotation from device list updating code Stephen M. Cameron
2014-05-29 15:53 ` [PATCH 2 18/24] hpsa: report check condition even if no sense data present for ioaccel2 mode Stephen M. Cameron
2014-05-29 15:54 ` [PATCH 2 19/24] hpsa: fix memory leak in hpsa_hba_mode_enabled Stephen M. Cameron
2014-05-29 15:54 ` [PATCH 2 20/24] hpsa: do not ignore failure of sense controller parameters command Stephen M. Cameron
2014-05-29 15:54 ` [PATCH 2 21/24] hpsa: remove messages about volume status VPD inquiry page not supported Stephen M. Cameron
2014-05-29 15:54 ` [PATCH 2 22/24] hpsa: fix bad comparison of signed with unsigned in hpsa_update_scsi_devices Stephen M. Cameron
2014-05-29 15:54 ` [PATCH 2 23/24] hpsa: return -ENOMEM not -1 on kzalloc failure in hpsa_get_device_id Stephen M. Cameron
2014-05-29 15:54 ` [PATCH 2 24/24] hpsa: fix handling of hpsa_volume_offline return value Stephen M. Cameron
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=20140529155307.8180.30614.stgit@beardog.cce.hp.com \
--to=scameron@beardog.cce.hp.com \
--cc=dan.carpenter@oracle.com \
--cc=hch@lst.de \
--cc=james.bottomley@parallels.com \
--cc=joseph.t.handzik@hp.com \
--cc=justin.lindley@hp.com \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=michael.miller@canonical.com \
--cc=scott.teel@hp.com \
--cc=stephenmcameron@gmail.com \
--cc=thenzl@redhat.com \
--cc=webb.scales@hp.com \
/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).