block: add block polling support
Add basic support for polling for specific IO to complete. This uses the cookie that blk-mq passes back, which enables the block layer to pass this cookie to the driver to spin for a specific request. This will be combined with request latency tracking, so we can make qualified decisions about when to poll and when not to. For now, for benchmark purposes, we add a sysfs file that controls whether polling is enabled or not. Signed-off-by: Jens Axboe <axboe@fb.com> Acked-by: Christoph Hellwig <hch@lst.de> Acked-by: Keith Busch <keith.busch@intel.com>
This commit is contained in:
@@ -59,6 +59,9 @@ struct blk_mq_hw_ctx {
|
||||
|
||||
struct blk_mq_cpu_notifier cpu_notifier;
|
||||
struct kobject kobj;
|
||||
|
||||
unsigned long poll_invoked;
|
||||
unsigned long poll_success;
|
||||
};
|
||||
|
||||
struct blk_mq_tag_set {
|
||||
@@ -97,6 +100,8 @@ typedef void (exit_request_fn)(void *, struct request *, unsigned int,
|
||||
typedef void (busy_iter_fn)(struct blk_mq_hw_ctx *, struct request *, void *,
|
||||
bool);
|
||||
typedef void (busy_tag_iter_fn)(struct request *, void *, bool);
|
||||
typedef int (poll_fn)(struct blk_mq_hw_ctx *, unsigned int);
|
||||
|
||||
|
||||
struct blk_mq_ops {
|
||||
/*
|
||||
@@ -114,6 +119,11 @@ struct blk_mq_ops {
|
||||
*/
|
||||
timeout_fn *timeout;
|
||||
|
||||
/*
|
||||
* Called to poll for completion of a specific tag.
|
||||
*/
|
||||
poll_fn *poll;
|
||||
|
||||
softirq_done_fn *complete;
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user