Messages in this thread | | | Date | Thu, 23 Oct 2008 08:43:57 +0200 | From | Jens Axboe <> | Subject | Re: [PATCH 1/2] libata: get rid of ATA_MAX_QUEUE loop in ata_qc_complete_multiple() |
| |
On Thu, Oct 23 2008, Tejun Heo wrote: > while (done_mask) { > struct ata_queued_cmd *qc; > unsigned int next = __ffs(done_mask); > > tag += next; > if ((qc = ata_qc_from_tag(ap, tag))) { > ata_qc_complete(qc); > nr_done++; > } > next++; > tag += next; > done_mask >>= next; > }
That doesn't work (you're adding next to tag twice), it needs a little tweak:
while (done_mask) { struct ata_queued_cmd *qc; unsigned int next = __ffs(done_mask);
if ((qc = ata_qc_from_tag(ap, tag + next))) { ata_qc_complete(qc); nr_done++; } next++; tag += next; done_mask >>= next; }
and I think it should work. Not tested yet :-)
-- Jens Axboe
| |