public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
From: Don Brace <don.brace@pmcs.com>
To: scott.teel@pmcs.com, Kevin.Barnett@pmcs.com,
	james.bottomley@parallels.com, hch@infradead.org,
	Justin.Lindley@pmcs.com, brace@pmcs.com
Cc: linux-scsi@vger.kernel.org
Subject: [PATCH 28/48] hpsa: use per-controller work queue
Date: Wed, 14 Jan 2015 16:02:05 -0600	[thread overview]
Message-ID: <20150114220205.21325.5519.stgit@brunhilda> (raw)
In-Reply-To: <20150114215756.21325.41198.stgit@brunhilda>

From: Webb Scales <webbnh@hp.com>

There is a possibility of deadlock if we use the system work queue
for command resubmission since something in the queue may be depending
on the I/O that gets resubmitted, and the resubmitted I/O will be
behind the thing that depends on it in the queue.  Using a driver
specific, per-controller work queue avoids this.

Reviewed-by: Scott Teel <scott.teel@pmcs.com>
Signed-off-by: Webb Scales <webbnh@hp.com>
Signed-off-by: Don Brace <don.brace@pmcs.com>
---
 drivers/scsi/hpsa.c |   16 +++++++++++++---
 drivers/scsi/hpsa.h |    1 +
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
index c1166a5..dcacb29 100644
--- a/drivers/scsi/hpsa.c
+++ b/drivers/scsi/hpsa.c
@@ -1651,7 +1651,7 @@ static void process_ioaccel2_completion(struct ctlr_info *h,
 
 retry_cmd:
 	INIT_WORK(&c->work, hpsa_command_resubmit_worker);
-	schedule_work_on(raw_smp_processor_id(), &c->work);
+	queue_work_on(raw_smp_processor_id(), h->resubmit_wq, &c->work);
 }
 
 static void complete_scsi_command(struct CommandList *cp)
@@ -1722,7 +1722,8 @@ static void complete_scsi_command(struct CommandList *cp)
 			if (ei->CommandStatus == CMD_IOACCEL_DISABLED)
 				dev->offload_enabled = 0;
 			INIT_WORK(&cp->work, hpsa_command_resubmit_worker);
-			schedule_work_on(raw_smp_processor_id(), &cp->work);
+			queue_work_on(raw_smp_processor_id(),
+					h->resubmit_wq, &cp->work);
 			return;
 		}
 	}
@@ -6418,6 +6419,7 @@ static void fail_all_outstanding_cmds(struct ctlr_info *h)
 	int i;
 	struct CommandList *c = NULL;
 
+	flush_workqueue(h->resubmit_wq); /* ensure all cmds are fully built */
 	for (i = 0; i < h->nr_cmds; i++) {
 		if (!test_bit(i & (BITS_PER_LONG - 1),
 				h->cmd_pool_bits + (i / BITS_PER_LONG)))
@@ -6653,6 +6655,12 @@ reinit_after_soft_reset:
 	spin_lock_init(&h->scan_lock);
 	spin_lock_init(&h->passthru_count_lock);
 
+	h->resubmit_wq = alloc_workqueue("hpsa", WQ_MEM_RECLAIM, 0);
+	if (!h->resubmit_wq) {
+		dev_err(&h->pdev->dev, "Failed to allocate work queue\n");
+		rc = -ENOMEM;
+		goto clean1;
+	}
 	/* Allocate and clear per-cpu variable lockup_detected */
 	h->lockup_detected = alloc_percpu(u32);
 	if (!h->lockup_detected) {
@@ -6785,6 +6793,8 @@ clean2_and_free_irqs:
 	hpsa_free_irqs(h);
 clean2:
 clean1:
+	if (h->resubmit_wq)
+		destroy_workqueue(h->resubmit_wq);
 	if (h->lockup_detected)
 		free_percpu(h->lockup_detected);
 	kfree(h);
@@ -6860,9 +6870,9 @@ static void hpsa_remove_one(struct pci_dev *pdev)
 	h->remove_in_progress = 1;
 	cancel_delayed_work(&h->monitor_ctlr_work);
 	spin_unlock_irqrestore(&h->lock, flags);
-
 	hpsa_unregister_scsi(h);	/* unhook from SCSI subsystem */
 	hpsa_shutdown(pdev);
+	destroy_workqueue(h->resubmit_wq);
 	iounmap(h->vaddr);
 	iounmap(h->transtable);
 	iounmap(h->cfgtable);
diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h
index 06a3e81..a0f4268 100644
--- a/drivers/scsi/hpsa.h
+++ b/drivers/scsi/hpsa.h
@@ -236,6 +236,7 @@ struct ctlr_info {
 	struct list_head offline_device_list;
 	int	acciopath_status;
 	int	raid_offload_debug;
+	struct workqueue_struct *resubmit_wq;
 };
 
 struct offline_device_entry {


  parent reply	other threads:[~2015-01-14 22:02 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-14 21:59 [PATCH 00/48] hpsa driver updates Don Brace
2015-01-14 21:59 ` [PATCH 01/48] hpsa: correct endian sparse warnings Don Brace
2015-01-14 21:59 ` [PATCH 02/48] hpsa: fix memory leak in kdump hard reset Don Brace
2015-01-14 21:59 ` [PATCH 03/48] hpsa: turn off interrupts when kdump starts Don Brace
2015-01-14 21:59 ` [PATCH 04/48] hpsa: change how SA controllers are reset Don Brace
2015-01-14 22:00 ` [PATCH 05/48] hpsa: correct change_queue_depth Don Brace
2015-01-15  9:50   ` Christoph Hellwig
2015-01-14 22:00 ` [PATCH 06/48] hpsa: adjust RAID-1, RAID-1ADM, and RAID-6 names Don Brace
2015-01-14 22:00 ` [PATCH 07/48] hpsa: rename free_irqs to hpsa_free_irqs Don Brace
2015-01-14 22:00 ` [PATCH 08/48] hpsa: Fix -Wunused-but-set-variable warning Don Brace
2015-01-14 22:00 ` [PATCH 09/48] hpsa: notice all request_irq errors Don Brace
2015-01-14 22:00 ` [PATCH 10/48] hpsa: remove 0x from queue depth print which is in decimal Don Brace
2015-01-14 22:00 ` [PATCH 11/48] hpsa: propagate hard_reset failures in reset_devices mode Don Brace
2015-01-14 22:00 ` [PATCH 12/48] hpsa: propagate return value from board ID lookup Don Brace
2015-01-14 22:00 ` [PATCH 13/48] hpsa: downgrade the Waiting for no-op print to dev_info Don Brace
2015-01-14 22:00 ` [PATCH 14/48] hpsa: refactor hpsa_find_board_params() to encapsulate legacy test Don Brace
2015-01-14 22:00 ` [PATCH 15/48] hpsa: trivial message and comment clean ups Don Brace
2015-01-14 22:01 ` [PATCH 16/48] hpsa: report failure to ioremap config table Don Brace
2015-01-14 22:01 ` [PATCH 17/48] hpsa: rename hpsa_request_irq to hpsa_request_irqs Don Brace
2015-01-14 22:01 ` [PATCH 18/48] hpsa: pass error from pci_set_consistent_dma_mask from hpsa_message Don Brace
2015-01-14 22:01 ` [PATCH 19/48] hpsa: report allocation failures while allocating SG chain blocks Don Brace
2015-01-14 22:01 ` [PATCH 20/48] hpsa: fix memory leak in hpsa_alloc_cmd_pool Don Brace
2015-01-14 22:01 ` [PATCH 21/48] hpsa: avoid unneccesary calls to resource freeing functions Don Brace
2015-01-14 22:01 ` [PATCH 22/48] hpsa: reserve some commands for use by driver Don Brace
2015-01-14 22:01 ` [PATCH 23/48] hpsa: get rid of cmd_special_alloc and cmd_special_free Don Brace
2015-01-14 22:01 ` [PATCH 24/48] hpsa: do not queue commands internally in driver Don Brace
2015-01-14 22:01 ` [PATCH 25/48] hpsa: do not request device rescan on every ioaccel path error Don Brace
2015-01-14 22:01 ` [PATCH 26/48] hpsa: factor out hpsa_ciss_submit function Don Brace
2015-01-14 22:02 ` [PATCH 27/48] hpsa: use workqueue to resubmit failed ioaccel commands Don Brace
2015-01-14 22:02 ` Don Brace [this message]
2015-01-15 11:32   ` [PATCH 28/48] hpsa: use per-controller work queue Christoph Hellwig
2015-01-14 22:02 ` [PATCH 29/48] hpsa: honor queue depth of physical devices Don Brace
2015-01-14 22:02 ` [PATCH 30/48] hpsa: fix race between abort handler and main i/o path Don Brace
2015-01-14 22:02 ` [PATCH 31/48] hpsa: optimize cmd_alloc function by remembering last allocation Don Brace
2015-01-14 22:02 ` [PATCH 32/48] hpsa: count passthru cmds with atomics, not a spin locked int Don Brace
2015-01-14 22:02 ` [PATCH 33/48] hpsa: slightly optimize SA5_performant_completed Don Brace
2015-01-16 14:16   ` Tomas Henzl
2015-01-14 22:02 ` [PATCH 34/48] hpsa: do not check for msi(x) in interrupt_pending Don Brace
2015-01-14 22:02 ` [PATCH 35/48] hpsa: remove incorrect BUG_ONs checking for raid offload enable Don Brace
2015-01-14 22:02 ` [PATCH 36/48] hpsa: do not ack controller events on controllers that do not support it Don Brace
2015-01-14 22:02 ` [PATCH 37/48] hpsa: guard against overflowing raid map array Don Brace
2015-01-14 22:02 ` [PATCH 38/48] hpsa: check for ctlr lockup after command allocation in main io path Don Brace
2015-01-14 22:03 ` [PATCH 39/48] hpsa: return failed from device reset/abort handlers Don Brace
2015-01-14 22:03 ` [PATCH 40/48] hpsa: do not use a void pointer for scsi_cmd field of struct CommandList Don Brace
2015-01-14 22:03 ` [PATCH 41/48] hpsa: print CDBs instead of kernel virtual addresses for uncommon errors Don Brace
2015-01-14 22:03 ` [PATCH 42/48] hpsa: do not use function pointers in fast path command submission Don Brace
2015-01-14 22:03 ` [PATCH 43/48] hpsa: move SG descriptor set-up out of hpsa_scatter_gather() Don Brace
2015-01-14 22:03 ` [PATCH 44/48] hpsa: refactor duplicated scan completion code into a new routine Don Brace
2015-01-14 22:03 ` [PATCH 45/48] hpsa: shorten the wait for the CISS doorbell mode change ack Don Brace
2015-01-16 14:08   ` Tomas Henzl
2015-01-14 22:03 ` [PATCH 46/48] hpsa: detect and report failures changing controller transport modes Don Brace
2015-01-14 22:03 ` [PATCH 47/48] hpsa: add in gen9 controller model names Don Brace
2015-01-14 22:03 ` [PATCH 48/48] hpsa: add in P840ar controller model name Don Brace
2015-01-23 13:21 ` [PATCH 00/48] hpsa driver updates Christoph Hellwig
2015-01-23 16:58   ` brace
2015-01-23 17:01     ` Christoph Hellwig
2015-01-23 18:15       ` Tomas Henzl

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=20150114220205.21325.5519.stgit@brunhilda \
    --to=don.brace@pmcs.com \
    --cc=Justin.Lindley@pmcs.com \
    --cc=Kevin.Barnett@pmcs.com \
    --cc=brace@pmcs.com \
    --cc=hch@infradead.org \
    --cc=james.bottomley@parallels.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=scott.teel@pmcs.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