ibata: get rid of ATA_MAX_QUEUE loop in ata_qc_complete_multiple() v2
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
@@ -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
Tejun Heo
Acked-byQuoted 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_maskinstead of shiftingdone_maskdown as suggested by From: Tejun Heo <[email protected]> Verified with a user space tester to produce the same results.Signed-off-by Jens Axboe <[email protected]>
Thanks.
Signature · 1 line
tejun
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_maskinstead of shiftingdone_maskdown as suggested by From: Tejun Heo <[email protected]> Verified with a user space tester to produce the same results.Signed-off-by Jens Axboe <[email protected]>--- 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
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_maskinstead of shiftingdone_maskdown 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
Signed-off-by Jens Axboe <[email protected]>--- 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
Jeff Garzik
AppliedQuoted 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_maskinstead of shiftingdone_maskdown as suggested by From: Tejun Heo <[email protected]> Verified with a user space tester to produce the same results.Signed-off-by Jens Axboe <[email protected]>--- drivers/ata/libata-core.c | 11 +++++------ 1 files changed, 5 insertions(+), 6 deletions(-)
applied