Skip to contentSkip to conversation

ibata: get rid of ATA_MAX_QUEUE loop in ata_qc_complete_multiple() v2

PATCH Applied Jens Axboe 3 participants 5 messages May 20, 2009 libata

lore
Share & tools
lore

Jens Axboe

author
#0 lore raw

We very rarely (if ever) complete more than one command in the sactive mask at the time, even for extremely high IO rates. So looping over the entire range of possible tags is pointless, instead use __ffs() to just find the completed tags directly.

Updated to clear the tag from the done_mask instead of shifting done_mask down as suggested by From: Tejun Heo <[email protected]> Verified with a user space tester to produce the same results.

---
 drivers/ata/libata-core.c |   11 +++++------
 1 files changed, 5 insertions(+), 6 deletions(-)
drivers/ata/libata-core.c +5 -6
index c924230..ca4d208 100644
@@ -5031,7 +5031,6 @@ int ata_qc_complete_multiple(struct ata_port *ap, u32 qc_active)
 {
 	int nr_done = 0;
 	u32 done_mask;
-	int i;
 
 	done_mask = ap->qc_active ^ qc_active;
 
@@ -5041,16 +5040,16 @@ int ata_qc_complete_multiple(struct ata_port *ap, u32 qc_active)
 		return -EINVAL;
 	}
 
-	for (i = 0; i < ATA_MAX_QUEUE; i++) {
+	while (done_mask) {
 		struct ata_queued_cmd *qc;
+		unsigned int tag = __ffs(done_mask);
 
-		if (!(done_mask & (1 << i)))
-			continue;
-
-		if ((qc = ata_qc_from_tag(ap, i))) {
+		qc = ata_qc_from_tag(ap, tag);
+		if (qc) {
 			ata_qc_complete(qc);
 			nr_done++;
 		}
+		done_mask &= ~(1 << tag);
 	}
 
 	return nr_done;
Signature · 4 lines
1.6.3.rc0.1.gf800

-- 
Jens Axboe
Acked-by
#1 lore raw
Quoted 10 lines · Jens Axboe

We very rarely (if ever) complete more than one command in the sactive mask at the time, even for extremely high IO rates. So looping over the entire range of possible tags is pointless, instead use __ffs() to just find the completed tags directly.

Updated to clear the tag from the done_mask instead of shifting done_mask down as suggested by From: Tejun Heo <[email protected]> Verified with a user space tester to produce the same results.

Thanks.

Signature · 1 line
tejun
#2 lore raw
In reply to Jens Axboe
Quoted 5 lines · Jens Axboe

We very rarely (if ever) complete more than one command in the sactive mask at the time, even for extremely high IO rates. So looping over the entire range of possible tags is pointless, instead use __ffs() to just find the completed tags directly.

Quoted 8 lines

Updated to clear the tag from the done_mask instead of shifting done_mask down as suggested by From: Tejun Heo <[email protected]> Verified with a user space tester to produce the same results.

---
 drivers/ata/libata-core.c |   11 +++++------
 1 files changed, 5 insertions(+), 6 deletions(-)

Much cleaner. Queued...

Separately, I wonder if we shouldn't add code to report when the hardware gives us an unknown tag.

The code always correctly handles invalid tags passed to us from hardware "if (qc)", but we should probably squawk when that happens, I suspect.

Jeff

author
#3 lore raw
Quoted 10 lines · Jeff Garzik
Quoted 9 lines · Jens Axboe

We very rarely (if ever) complete more than one command in the sactive mask at the time, even for extremely high IO rates. So looping over the entire range of possible tags is pointless, instead use __ffs() to just find the completed tags directly.

Updated to clear the tag from the done_mask instead of shifting done_mask down as suggested by From: Tejun Heo <[email protected]> Verified with a user space tester to produce the same results.

Quoted 6 lines
Quoted 4 lines
---
 drivers/ata/libata-core.c |   11 +++++------
 1 files changed, 5 insertions(+), 6 deletions(-)

Much cleaner. Queued...

Thanks!

Quoted 6 lines

Separately, I wonder if we shouldn't add code to report when the hardware gives us an unknown tag.

The code always correctly handles invalid tags passed to us from hardware "if (qc)", but we should probably squawk when that happens, I suspect.

Probably a good idea, it is a sign of bigger problems if the hardware completes tags that we don't know about.

Signature · 1 line
Jens Axboe
Applied
#4 lore raw
In reply to Jens Axboe
Quoted 5 lines · Jens Axboe

We very rarely (if ever) complete more than one command in the sactive mask at the time, even for extremely high IO rates. So looping over the entire range of possible tags is pointless, instead use __ffs() to just find the completed tags directly.

Quoted 8 lines

Updated to clear the tag from the done_mask instead of shifting done_mask down as suggested by From: Tejun Heo <[email protected]> Verified with a user space tester to produce the same results.

---
 drivers/ata/libata-core.c |   11 +++++------
 1 files changed, 5 insertions(+), 6 deletions(-)

applied