diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2008-10-22 03:34:49 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-23 19:05:26 -0400 |
commit | 2fca5ccf97d2c28bcfce44f5b07d85e74e3cd18e (patch) | |
tree | 483dedd08d6ccbb56959eeb127e82ab8f84edf2e | |
parent | 332edc2f7fa58b818dfed1cede60272eecc27c0a (diff) |
libata: switch to using block layer tagging support
libata currently has a pretty dumb ATA_MAX_QUEUE loop for finding
a free tag to use. Instead of fixing that up, convert libata to
using block layer tagging - gets rid of code in libata, and is also
much faster.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | drivers/ata/libata-core.c | 66 | ||||
-rw-r--r-- | drivers/ata/libata-scsi.c | 10 | ||||
-rw-r--r-- | drivers/ata/libata.h | 19 | ||||
-rw-r--r-- | include/linux/libata.h | 1 |
4 files changed, 31 insertions, 65 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index bbb3cae57492..8cb0b360bfd8 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -1713,8 +1713,6 @@ unsigned ata_exec_internal_sg(struct ata_device *dev, | |||
1713 | else | 1713 | else |
1714 | tag = 0; | 1714 | tag = 0; |
1715 | 1715 | ||
1716 | if (test_and_set_bit(tag, &ap->qc_allocated)) | ||
1717 | BUG(); | ||
1718 | qc = __ata_qc_from_tag(ap, tag); | 1716 | qc = __ata_qc_from_tag(ap, tag); |
1719 | 1717 | ||
1720 | qc->tag = tag; | 1718 | qc->tag = tag; |
@@ -4553,37 +4551,6 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) | |||
4553 | } | 4551 | } |
4554 | 4552 | ||
4555 | /** | 4553 | /** |
4556 | * ata_qc_new - Request an available ATA command, for queueing | ||
4557 | * @ap: Port associated with device @dev | ||
4558 | * @dev: Device from whom we request an available command structure | ||
4559 | * | ||
4560 | * LOCKING: | ||
4561 | * None. | ||
4562 | */ | ||
4563 | |||
4564 | static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap) | ||
4565 | { | ||
4566 | struct ata_queued_cmd *qc = NULL; | ||
4567 | unsigned int i; | ||
4568 | |||
4569 | /* no command while frozen */ | ||
4570 | if (unlikely(ap->pflags & ATA_PFLAG_FROZEN)) | ||
4571 | return NULL; | ||
4572 | |||
4573 | /* the last tag is reserved for internal command. */ | ||
4574 | for (i = 0; i < ATA_MAX_QUEUE - 1; i++) | ||
4575 | if (!test_and_set_bit(i, &ap->qc_allocated)) { | ||
4576 | qc = __ata_qc_from_tag(ap, i); | ||
4577 | break; | ||
4578 | } | ||
4579 | |||
4580 | if (qc) | ||
4581 | qc->tag = i; | ||
4582 | |||
4583 | return qc; | ||
4584 | } | ||
4585 | |||
4586 | /** | ||
4587 | * ata_qc_new_init - Request an available ATA command, and initialize it | 4554 | * ata_qc_new_init - Request an available ATA command, and initialize it |
4588 | * @dev: Device from whom we request an available command structure | 4555 | * @dev: Device from whom we request an available command structure |
4589 | * | 4556 | * |
@@ -4591,16 +4558,20 @@ static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap) | |||
4591 | * None. | 4558 | * None. |
4592 | */ | 4559 | */ |
4593 | 4560 | ||
4594 | struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev) | 4561 | struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev, int tag) |
4595 | { | 4562 | { |
4596 | struct ata_port *ap = dev->link->ap; | 4563 | struct ata_port *ap = dev->link->ap; |
4597 | struct ata_queued_cmd *qc; | 4564 | struct ata_queued_cmd *qc; |
4598 | 4565 | ||
4599 | qc = ata_qc_new(ap); | 4566 | if (unlikely(ap->pflags & ATA_PFLAG_FROZEN)) |
4567 | return NULL; | ||
4568 | |||
4569 | qc = __ata_qc_from_tag(ap, tag); | ||
4600 | if (qc) { | 4570 | if (qc) { |
4601 | qc->scsicmd = NULL; | 4571 | qc->scsicmd = NULL; |
4602 | qc->ap = ap; | 4572 | qc->ap = ap; |
4603 | qc->dev = dev; | 4573 | qc->dev = dev; |
4574 | qc->tag = tag; | ||
4604 | 4575 | ||
4605 | ata_qc_reinit(qc); | 4576 | ata_qc_reinit(qc); |
4606 | } | 4577 | } |
@@ -4608,31 +4579,6 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev) | |||
4608 | return qc; | 4579 | return qc; |
4609 | } | 4580 | } |
4610 | 4581 | ||
4611 | /** | ||
4612 | * ata_qc_free - free unused ata_queued_cmd | ||
4613 | * @qc: Command to complete | ||
4614 | * | ||
4615 | * Designed to free unused ata_queued_cmd object | ||
4616 | * in case something prevents using it. | ||
4617 | * | ||
4618 | * LOCKING: | ||
4619 | * spin_lock_irqsave(host lock) | ||
4620 | */ | ||
4621 | void ata_qc_free(struct ata_queued_cmd *qc) | ||
4622 | { | ||
4623 | struct ata_port *ap = qc->ap; | ||
4624 | unsigned int tag; | ||
4625 | |||
4626 | WARN_ON(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ | ||
4627 | |||
4628 | qc->flags = 0; | ||
4629 | tag = qc->tag; | ||
4630 | if (likely(ata_tag_valid(tag))) { | ||
4631 | qc->tag = ATA_TAG_POISON; | ||
4632 | clear_bit(tag, &ap->qc_allocated); | ||
4633 | } | ||
4634 | } | ||
4635 | |||
4636 | void __ata_qc_complete(struct ata_queued_cmd *qc) | 4582 | void __ata_qc_complete(struct ata_queued_cmd *qc) |
4637 | { | 4583 | { |
4638 | struct ata_port *ap = qc->ap; | 4584 | struct ata_port *ap = qc->ap; |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 5d312dc9be9f..d5b9b7266c8b 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -708,7 +708,7 @@ static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev, | |||
708 | { | 708 | { |
709 | struct ata_queued_cmd *qc; | 709 | struct ata_queued_cmd *qc; |
710 | 710 | ||
711 | qc = ata_qc_new_init(dev); | 711 | qc = ata_qc_new_init(dev, cmd->request->tag); |
712 | if (qc) { | 712 | if (qc) { |
713 | qc->scsicmd = cmd; | 713 | qc->scsicmd = cmd; |
714 | qc->scsidone = done; | 714 | qc->scsidone = done; |
@@ -1103,7 +1103,8 @@ static int ata_scsi_dev_config(struct scsi_device *sdev, | |||
1103 | 1103 | ||
1104 | depth = min(sdev->host->can_queue, ata_id_queue_depth(dev->id)); | 1104 | depth = min(sdev->host->can_queue, ata_id_queue_depth(dev->id)); |
1105 | depth = min(ATA_MAX_QUEUE - 1, depth); | 1105 | depth = min(ATA_MAX_QUEUE - 1, depth); |
1106 | scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, depth); | 1106 | scsi_set_tag_type(sdev, MSG_SIMPLE_TAG); |
1107 | scsi_activate_tcq(sdev, depth); | ||
1107 | } | 1108 | } |
1108 | 1109 | ||
1109 | return 0; | 1110 | return 0; |
@@ -1943,6 +1944,11 @@ static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf) | |||
1943 | hdr[1] |= (1 << 7); | 1944 | hdr[1] |= (1 << 7); |
1944 | 1945 | ||
1945 | memcpy(rbuf, hdr, sizeof(hdr)); | 1946 | memcpy(rbuf, hdr, sizeof(hdr)); |
1947 | |||
1948 | /* if ncq, set tags supported */ | ||
1949 | if (ata_id_has_ncq(args->id)) | ||
1950 | rbuf[7] |= (1 << 1); | ||
1951 | |||
1946 | memcpy(&rbuf[8], "ATA ", 8); | 1952 | memcpy(&rbuf[8], "ATA ", 8); |
1947 | ata_id_string(args->id, &rbuf[16], ATA_ID_PROD, 16); | 1953 | ata_id_string(args->id, &rbuf[16], ATA_ID_PROD, 16); |
1948 | ata_id_string(args->id, &rbuf[32], ATA_ID_FW_REV, 4); | 1954 | ata_id_string(args->id, &rbuf[32], ATA_ID_FW_REV, 4); |
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index fe2839e58774..d3831d39bdaa 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h | |||
@@ -74,7 +74,7 @@ extern struct ata_link *ata_dev_phys_link(struct ata_device *dev); | |||
74 | extern void ata_force_cbl(struct ata_port *ap); | 74 | extern void ata_force_cbl(struct ata_port *ap); |
75 | extern u64 ata_tf_to_lba(const struct ata_taskfile *tf); | 75 | extern u64 ata_tf_to_lba(const struct ata_taskfile *tf); |
76 | extern u64 ata_tf_to_lba48(const struct ata_taskfile *tf); | 76 | extern u64 ata_tf_to_lba48(const struct ata_taskfile *tf); |
77 | extern struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev); | 77 | extern struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev, int tag); |
78 | extern int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev, | 78 | extern int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev, |
79 | u64 block, u32 n_block, unsigned int tf_flags, | 79 | u64 block, u32 n_block, unsigned int tf_flags, |
80 | unsigned int tag); | 80 | unsigned int tag); |
@@ -103,7 +103,6 @@ extern int ata_dev_configure(struct ata_device *dev); | |||
103 | extern int sata_down_spd_limit(struct ata_link *link); | 103 | extern int sata_down_spd_limit(struct ata_link *link); |
104 | extern int ata_down_xfermask_limit(struct ata_device *dev, unsigned int sel); | 104 | extern int ata_down_xfermask_limit(struct ata_device *dev, unsigned int sel); |
105 | extern void ata_sg_clean(struct ata_queued_cmd *qc); | 105 | extern void ata_sg_clean(struct ata_queued_cmd *qc); |
106 | extern void ata_qc_free(struct ata_queued_cmd *qc); | ||
107 | extern void ata_qc_issue(struct ata_queued_cmd *qc); | 106 | extern void ata_qc_issue(struct ata_queued_cmd *qc); |
108 | extern void __ata_qc_complete(struct ata_queued_cmd *qc); | 107 | extern void __ata_qc_complete(struct ata_queued_cmd *qc); |
109 | extern int atapi_check_dma(struct ata_queued_cmd *qc); | 108 | extern int atapi_check_dma(struct ata_queued_cmd *qc); |
@@ -119,6 +118,22 @@ extern struct ata_port *ata_port_alloc(struct ata_host *host); | |||
119 | extern void ata_dev_enable_pm(struct ata_device *dev, enum link_pm policy); | 118 | extern void ata_dev_enable_pm(struct ata_device *dev, enum link_pm policy); |
120 | extern void ata_lpm_schedule(struct ata_port *ap, enum link_pm); | 119 | extern void ata_lpm_schedule(struct ata_port *ap, enum link_pm); |
121 | 120 | ||
121 | /** | ||
122 | * ata_qc_free - free unused ata_queued_cmd | ||
123 | * @qc: Command to complete | ||
124 | * | ||
125 | * Designed to free unused ata_queued_cmd object | ||
126 | * in case something prevents using it. | ||
127 | * | ||
128 | * LOCKING: | ||
129 | * spin_lock_irqsave(host lock) | ||
130 | */ | ||
131 | static inline void ata_qc_free(struct ata_queued_cmd *qc) | ||
132 | { | ||
133 | qc->flags = 0; | ||
134 | qc->tag = ATA_TAG_POISON; | ||
135 | } | ||
136 | |||
122 | /* libata-acpi.c */ | 137 | /* libata-acpi.c */ |
123 | #ifdef CONFIG_ATA_ACPI | 138 | #ifdef CONFIG_ATA_ACPI |
124 | extern void ata_acpi_associate_sata_port(struct ata_port *ap); | 139 | extern void ata_acpi_associate_sata_port(struct ata_port *ap); |
diff --git a/include/linux/libata.h b/include/linux/libata.h index c261aa0584b1..507f53ef8038 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -695,7 +695,6 @@ struct ata_port { | |||
695 | unsigned int cbl; /* cable type; ATA_CBL_xxx */ | 695 | unsigned int cbl; /* cable type; ATA_CBL_xxx */ |
696 | 696 | ||
697 | struct ata_queued_cmd qcmd[ATA_MAX_QUEUE]; | 697 | struct ata_queued_cmd qcmd[ATA_MAX_QUEUE]; |
698 | unsigned long qc_allocated; | ||
699 | unsigned int qc_active; | 698 | unsigned int qc_active; |
700 | int nr_active_links; /* #links with active qcs */ | 699 | int nr_active_links; /* #links with active qcs */ |
701 | 700 | ||