linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Brian King <brking@us.ibm.com>
To: brking@us.ibm.com
Cc: linux-ide@vger.kernel.org
Subject: [RFC 1/2] libata: configurable host_set lock
Date: Mon, 03 Oct 2005 16:58:09 -0500	[thread overview]
Message-ID: <4341A971.6090404@us.ibm.com> (raw)
In-Reply-To: <4341A91A.3020000@us.ibm.com>

[-- Attachment #1: Type: text/plain, Size: 0 bytes --]



[-- Attachment #2: libata_lock_change.patch --]
[-- Type: text/plain, Size: 5949 bytes --]


Allow the spinlock used by libata to be overridden.

Signed-off-by: Brian King <brking@us.ibm.com>
---

 linux-2.6-bjking1/drivers/scsi/libata-core.c |   41 +++++++++++++--------------
 linux-2.6-bjking1/include/linux/libata.h     |    8 ++++-
 2 files changed, 28 insertions(+), 21 deletions(-)

diff -puN include/linux/libata.h~libata_lock_change include/linux/libata.h
--- linux-2.6/include/linux/libata.h~libata_lock_change	2005-09-26 14:22:57.000000000 -0500
+++ linux-2.6-bjking1/include/linux/libata.h	2005-09-26 14:22:57.000000000 -0500
@@ -214,7 +214,8 @@ struct ata_probe_ent {
 };
 
 struct ata_host_set {
-	spinlock_t		lock;
+	spinlock_t		*lock;
+	spinlock_t		default_lock;
 	struct device 		*dev;
 	unsigned long		irq;
 	void __iomem		*mmio_base;
@@ -669,4 +670,9 @@ static inline int ata_try_flush_cache(st
 	       ata_id_has_flush_ext(dev->id);
 }
 
+static inline void ata_assign_lock(struct ata_host_set *host_set, spinlock_t *lock)
+{
+	host_set->lock = lock;
+}
+
 #endif /* __LINUX_LIBATA_H__ */
diff -puN drivers/scsi/libata-core.c~libata_lock_change drivers/scsi/libata-core.c
--- linux-2.6/drivers/scsi/libata-core.c~libata_lock_change	2005-09-26 14:22:57.000000000 -0500
+++ linux-2.6-bjking1/drivers/scsi/libata-core.c	2005-09-26 14:22:57.000000000 -0500
@@ -308,9 +308,9 @@ static inline void ata_exec(struct ata_p
 	unsigned long flags;
 
 	DPRINTK("ata%u: cmd 0x%X\n", ap->id, tf->command);
-	spin_lock_irqsave(&ap->host_set->lock, flags);
+	spin_lock_irqsave(ap->host_set->lock, flags);
 	ap->ops->exec_command(ap, tf);
-	spin_unlock_irqrestore(&ap->host_set->lock, flags);
+	spin_unlock_irqrestore(ap->host_set->lock, flags);
 }
 
 /**
@@ -1179,9 +1179,9 @@ retry:
 	qc->waiting = &wait;
 	qc->complete_fn = ata_qc_complete_noop;
 
-	spin_lock_irqsave(&ap->host_set->lock, flags);
+	spin_lock_irqsave(ap->host_set->lock, flags);
 	rc = ata_qc_issue(qc);
-	spin_unlock_irqrestore(&ap->host_set->lock, flags);
+	spin_unlock_irqrestore(ap->host_set->lock, flags);
 
 	if (rc)
 		goto err_out;
@@ -2131,9 +2131,9 @@ static void ata_dev_set_xfermode(struct 
 	qc->waiting = &wait;
 	qc->complete_fn = ata_qc_complete_noop;
 
-	spin_lock_irqsave(&ap->host_set->lock, flags);
+	spin_lock_irqsave(ap->host_set->lock, flags);
 	rc = ata_qc_issue(qc);
-	spin_unlock_irqrestore(&ap->host_set->lock, flags);
+	spin_unlock_irqrestore(ap->host_set->lock, flags);
 
 	if (rc)
 		ata_port_disable(ap);
@@ -2404,11 +2404,11 @@ void ata_poll_qc_complete(struct ata_que
 	struct ata_port *ap = qc->ap;
 	unsigned long flags;
 
-	spin_lock_irqsave(&ap->host_set->lock, flags);
+	spin_lock_irqsave(ap->host_set->lock, flags);
 	ap->flags &= ~ATA_FLAG_NOINTR;
 	ata_irq_on(ap);
 	ata_qc_complete(qc, drv_stat);
-	spin_unlock_irqrestore(&ap->host_set->lock, flags);
+	spin_unlock_irqrestore(ap->host_set->lock, flags);
 }
 
 /**
@@ -2962,9 +2962,9 @@ static void atapi_request_sense(struct a
 	qc->waiting = &wait;
 	qc->complete_fn = ata_qc_complete_noop;
 
-	spin_lock_irqsave(&ap->host_set->lock, flags);
+	spin_lock_irqsave(ap->host_set->lock, flags);
 	rc = ata_qc_issue(qc);
-	spin_unlock_irqrestore(&ap->host_set->lock, flags);
+	spin_unlock_irqrestore(ap->host_set->lock, flags);
 
 	if (rc)
 		ata_port_disable(ap);
@@ -3010,9 +3010,9 @@ static void ata_qc_timeout(struct ata_qu
 		if (!(cmd->eh_eflags & SCSI_EH_CANCEL_CMD)) {
 
 			/* finish completing original command */
-			spin_lock_irqsave(&host_set->lock, flags);
+			spin_lock_irqsave(host_set->lock, flags);
 			__ata_qc_complete(qc);
-			spin_unlock_irqrestore(&host_set->lock, flags);
+			spin_unlock_irqrestore(host_set->lock, flags);
 
 			atapi_request_sense(ap, dev, cmd);
 
@@ -3023,7 +3023,7 @@ static void ata_qc_timeout(struct ata_qu
 		}
 	}
 
-	spin_lock_irqsave(&host_set->lock, flags);
+	spin_lock_irqsave(host_set->lock, flags);
 
 	/* hack alert!  We cannot use the supplied completion
 	 * function from inside the ->eh_strategy_handler() thread.
@@ -3059,7 +3059,7 @@ static void ata_qc_timeout(struct ata_qu
 		break;
 	}
 
-	spin_unlock_irqrestore(&host_set->lock, flags);
+	spin_unlock_irqrestore(host_set->lock, flags);
 
 out:
 	DPRINTK("EXIT\n");
@@ -3726,7 +3726,7 @@ irqreturn_t ata_interrupt (int irq, void
 	unsigned long flags;
 
 	/* TODO: make _irqsave conditional on x86 PCI IDE legacy mode */
-	spin_lock_irqsave(&host_set->lock, flags);
+	spin_lock_irqsave(host_set->lock, flags);
 
 	for (i = 0; i < host_set->n_ports; i++) {
 		struct ata_port *ap;
@@ -3743,7 +3743,7 @@ irqreturn_t ata_interrupt (int irq, void
 		}
 	}
 
-	spin_unlock_irqrestore(&host_set->lock, flags);
+	spin_unlock_irqrestore(host_set->lock, flags);
 
 	return IRQ_RETVAL(handled);
 }
@@ -3796,12 +3796,12 @@ static void atapi_packet_task(void *_dat
 		 * interrupt handler shouldn't be invoked before we're
 		 * finished.  Hence, the following locking.
 		 */
-		spin_lock_irqsave(&ap->host_set->lock, flags);
+		spin_lock_irqsave(ap->host_set->lock, flags);
 		ap->flags &= ~ATA_FLAG_NOINTR;
 		ata_data_xfer(ap, qc->cdb, ap->cdb_len, 1);
 		if (qc->tf.protocol == ATA_PROT_ATAPI_DMA)
 			ap->ops->bmdma_start(qc);	/* initiate bmdma */
-		spin_unlock_irqrestore(&ap->host_set->lock, flags);
+		spin_unlock_irqrestore(ap->host_set->lock, flags);
 	} else {
 		ata_data_xfer(ap, qc->cdb, ap->cdb_len, 1);
 
@@ -3916,7 +3916,7 @@ static void ata_host_init(struct ata_por
 	host->unique_id = ata_unique_id++;
 	host->max_cmd_len = 12;
 
-	scsi_assign_lock(host, &host_set->lock);
+	scsi_assign_lock(host, host_set->lock);
 
 	ap->flags = ATA_FLAG_PORT_DISABLED;
 	ap->id = host->unique_id;
@@ -4026,7 +4026,8 @@ int ata_device_add(struct ata_probe_ent 
 	if (!host_set)
 		return 0;
 	memset(host_set, 0, sizeof(struct ata_host_set) + (ent->n_ports * sizeof(void *)));
-	spin_lock_init(&host_set->lock);
+	spin_lock_init(&host_set->default_lock);
+	ata_assign_lock(host_set, &host_set->default_lock);
 
 	host_set->dev = dev;
 	host_set->n_ports = ent->n_ports;
_

  reply	other threads:[~2005-10-03 21:58 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-10-03 21:56 [RFC 0/2] libata: support SATA devices on SAS HBAs Brian King
2005-10-03 21:58 ` Brian King [this message]
2005-10-03 21:58 ` [RFC 2/2] " Brian King
2005-10-04  9:56 ` [RFC 0/2] " Jeff Garzik
2005-10-04 10:22   ` Bartlomiej Zolnierkiewicz
2005-10-04 20:56     ` Bartlomiej Zolnierkiewicz
2005-10-05 20:59       ` Jeff Garzik
2005-10-24 22:17         ` [PATCH " Brian King
2005-10-24 22:19           ` [PATCH 1/2] libata: Remove dependence on host_set->dev for SAS Brian King
2005-10-25 17:53             ` Jeff Garzik
2005-10-25 19:30               ` Brian King
2005-10-25 19:43                 ` Jeff Garzik
2005-10-25 22:48                   ` Luben Tuikov
2005-10-27 16:05                     ` Brian King
2005-10-27 20:15                       ` Luben Tuikov
2005-11-24  0:53                       ` Douglas Gilbert
2005-11-24  1:07                         ` Jeff Garzik
2005-11-24  8:12                           ` Bartlomiej Zolnierkiewicz
2005-12-02  2:05                             ` Jeff Garzik
2005-12-02  8:07                               ` Bartlomiej Zolnierkiewicz
2005-12-02 10:28                                 ` Douglas Gilbert
2005-12-02 10:48                                   ` Jeff Garzik
2005-11-29 22:13                         ` Brian King
2005-10-24 22:20           ` [PATCH 2/2] libata: Add support for SATA attachment to SAS adapters Brian King
2005-10-25 17:58             ` Jeff Garzik
2005-10-25 12:59           ` [PATCH 0/2] libata: support SATA devices on SAS HBAs Luben Tuikov
2005-10-25 13:39             ` Brian King
2005-10-25 13:40               ` Luben Tuikov
2005-10-25 13:53                 ` Brian King
2005-10-25 14:08                   ` Luben Tuikov
2005-10-25 14:27                     ` Brian King
2005-10-25 17:51                       ` Jeff Garzik
2005-10-25 17:57         ` [RFC " Brian King
2005-10-25 18:07           ` Jeff Garzik

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=4341A971.6090404@us.ibm.com \
    --to=brking@us.ibm.com \
    --cc=linux-ide@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).