[PATCH v5 0/4] Enabling ATA Command Priorities

From: Adam Manzanares
Date: Thu Oct 13 2016 - 19:02:16 EST

This patch builds ATA commands with high priority if the iocontext of a process
is set to real time. The goal of the patch is to improve tail latencies of
workloads that use higher queue depths. This requires setting the iocontext
ioprio on the request when it is initialized.

This patch has been tested with an Ultrastar HE8 HDD and cuts the
the p99.99 tail latency of foreground IO from 2s down to 72ms when
using the deadline scheduler. This patch works independently of the
scheduler so it can be used with all of the currently available
request based schedulers.

Foreground IO, for the previously described results, is an async fio job
submitting 4K read requests at a QD of 1 to the HDD. The foreground IO is set
with the iopriority class of real time. The background workload is another fio
job submitting read requests at a QD of 32 to the same HDD with default

This feature is enabled for ATA devices by setting the ata enable_prio device
attribute to 1. An ATA device is also checked to see if the device supports per
command priority.

- Updated block patch commit message to explain the why

- Added blk_rq_set_prio function to associate request prio with ioc prio
- In init_request_from_bio use bio_prio if it is valid
- Removed queue flag used to enable prio
- Added ata enable_prio dev attribute to sysfs to enable prioritized commands

- Removed null dereference issue in blk-core
- Renamed queue sysfs entries for clarity
- Added documentation for sysfs queue entry

- Add queue flag to set iopriority going to the request
- If queue flag set, send iopriority class to ata_build_rw_tf
- Remove redundant code in ata_ncq_prio_enabled function.

Adam Manzanares (4):
block: Add iocontext priority to request
fusion: remove iopriority handling
ata: Enabling ATA Command Priorities
ata: ATA Command Priority Disabled By Default

block/blk-core.c | 4 ++-
drivers/ata/libahci.c | 1 +
drivers/ata/libata-core.c | 35 +++++++++++++++++-
drivers/ata/libata-scsi.c | 74 ++++++++++++++++++++++++++++++++++++++-
drivers/ata/libata.h | 2 +-
drivers/message/fusion/mptscsih.c | 5 ---
include/linux/ata.h | 6 ++++
include/linux/blkdev.h | 14 ++++++++
include/linux/libata.h | 26 ++++++++++++++
9 files changed, 158 insertions(+), 9 deletions(-)