diff options
author | Jeff Garzik <jeff@garzik.org> | 2007-10-18 16:21:18 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-10-18 16:21:18 -0400 |
commit | 3be6cbd73f74b4a3da82cc7d6e1688a4ae595fc7 (patch) | |
tree | a077cf70d1cd438db34f5def23dd8f72f42b5a8c /drivers/ata/sata_sil24.c | |
parent | 858c9c406688bc7244986b5836265071edfd1d3f (diff) |
[libata] kill ata_sg_is_last()
Short term, this works around a bug introduced by early sg-chaining
work.
Long term, removing this function eliminates a branch from a hot
path loop in each scatter/gather table build. Also, as this code
demonstrates, we don't need to _track_ the end of the s/g list, as
long as we mark it in some way. And doing so programatically is nice.
So its a useful cleanup, regardless of its short term effects.
Based conceptually on a quick patch by Jens Axboe.
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/ata/sata_sil24.c')
-rw-r--r-- | drivers/ata/sata_sil24.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index b0619278454a..26ebffc10f3e 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c | |||
@@ -796,16 +796,19 @@ static inline void sil24_fill_sg(struct ata_queued_cmd *qc, | |||
796 | struct sil24_sge *sge) | 796 | struct sil24_sge *sge) |
797 | { | 797 | { |
798 | struct scatterlist *sg; | 798 | struct scatterlist *sg; |
799 | struct sil24_sge *last_sge = NULL; | ||
799 | 800 | ||
800 | ata_for_each_sg(sg, qc) { | 801 | ata_for_each_sg(sg, qc) { |
801 | sge->addr = cpu_to_le64(sg_dma_address(sg)); | 802 | sge->addr = cpu_to_le64(sg_dma_address(sg)); |
802 | sge->cnt = cpu_to_le32(sg_dma_len(sg)); | 803 | sge->cnt = cpu_to_le32(sg_dma_len(sg)); |
803 | if (ata_sg_is_last(sg, qc)) | 804 | sge->flags = 0; |
804 | sge->flags = cpu_to_le32(SGE_TRM); | 805 | |
805 | else | 806 | last_sge = sge; |
806 | sge->flags = 0; | ||
807 | sge++; | 807 | sge++; |
808 | } | 808 | } |
809 | |||
810 | if (likely(last_sge)) | ||
811 | last_sge->flags = cpu_to_le32(SGE_TRM); | ||
809 | } | 812 | } |
810 | 813 | ||
811 | static int sil24_qc_defer(struct ata_queued_cmd *qc) | 814 | static int sil24_qc_defer(struct ata_queued_cmd *qc) |