libata-pmp-prep: implement ops->qc_defer()
Controllers which support PMP have various restrictions on which combinations of commands are allowed to what number of devices concurrently. This patch implements ops->qc_defer() which determines whether a qc can be issued at the moment or should be deferred. If the function returns ATA_DEFER_LINK, the qc will be deferred until a qc completes on the link. If ATA_DEFER_PORT, until a qc completes on any link. The defer conditions are advisory and in general ATA_DEFER_LINK can be considered as lower priority deferring than ATA_DEFER_PORT. ops->qc_defer() replaces fixed ata_scmd_need_defer(). For standard NCQ/non-NCQ exclusion, ata_std_qc_defer() is implemented. ahci and sata_sil24 are converted to use ata_std_qc_defer(). ops->qc_defer() is heavier than the original mechanism because full qc is prepped before determining to defer it, but various information is needed to determine defer conditinos and fully translating a qc is the only way to supply such information in generic manner. IMHO, this shouldn't cause any noticeable performance issues as * for most cases deferring occurs rarely (except for NCQ-aware cmd-switching PMP) * translation itself isn't that expensive * once deferred the command won't be repeated until another command completes which usually is a very long time cpu-wise. Signed-off-by:Tejun Heo <htejun@gmail.com> Signed-off-by:
Jeff Garzik <jeff@garzik.org>
Showing
- drivers/ata/ahci.c 2 additions, 0 deletionsdrivers/ata/ahci.c
- drivers/ata/libata-core.c 31 additions, 0 deletionsdrivers/ata/libata-core.c
- drivers/ata/libata-scsi.c 26 additions, 36 deletionsdrivers/ata/libata-scsi.c
- drivers/ata/sata_nv.c 1 addition, 0 deletionsdrivers/ata/sata_nv.c
- drivers/ata/sata_sil24.c 1 addition, 0 deletionsdrivers/ata/sata_sil24.c
- include/linux/libata.h 6 additions, 0 deletionsinclude/linux/libata.h
Please register or sign in to comment