| .. | .. |
|---|
| 5 | 5 | #include "blk-mq.h" |
|---|
| 6 | 6 | #include "blk-mq-tag.h" |
|---|
| 7 | 7 | |
|---|
| 8 | | -void blk_mq_sched_free_hctx_data(struct request_queue *q, |
|---|
| 9 | | - void (*exit)(struct blk_mq_hw_ctx *)); |
|---|
| 10 | | - |
|---|
| 11 | | -void blk_mq_sched_assign_ioc(struct request *rq, struct bio *bio); |
|---|
| 8 | +void blk_mq_sched_assign_ioc(struct request *rq); |
|---|
| 12 | 9 | |
|---|
| 13 | 10 | void blk_mq_sched_request_inserted(struct request *rq); |
|---|
| 14 | 11 | bool blk_mq_sched_try_merge(struct request_queue *q, struct bio *bio, |
|---|
| 15 | | - struct request **merged_request); |
|---|
| 16 | | -bool __blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio); |
|---|
| 12 | + unsigned int nr_segs, struct request **merged_request); |
|---|
| 13 | +bool __blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio, |
|---|
| 14 | + unsigned int nr_segs); |
|---|
| 17 | 15 | bool blk_mq_sched_try_insert_merge(struct request_queue *q, struct request *rq); |
|---|
| 18 | 16 | void blk_mq_sched_mark_restart_hctx(struct blk_mq_hw_ctx *hctx); |
|---|
| 19 | 17 | void blk_mq_sched_restart(struct blk_mq_hw_ctx *hctx); |
|---|
| 20 | 18 | |
|---|
| 21 | 19 | void blk_mq_sched_insert_request(struct request *rq, bool at_head, |
|---|
| 22 | 20 | bool run_queue, bool async); |
|---|
| 23 | | -void blk_mq_sched_insert_requests(struct request_queue *q, |
|---|
| 21 | +void blk_mq_sched_insert_requests(struct blk_mq_hw_ctx *hctx, |
|---|
| 24 | 22 | struct blk_mq_ctx *ctx, |
|---|
| 25 | 23 | struct list_head *list, bool run_queue_async); |
|---|
| 26 | 24 | |
|---|
| .. | .. |
|---|
| 28 | 26 | |
|---|
| 29 | 27 | int blk_mq_init_sched(struct request_queue *q, struct elevator_type *e); |
|---|
| 30 | 28 | void blk_mq_exit_sched(struct request_queue *q, struct elevator_queue *e); |
|---|
| 29 | +void blk_mq_sched_free_requests(struct request_queue *q); |
|---|
| 31 | 30 | |
|---|
| 32 | 31 | static inline bool |
|---|
| 33 | | -blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio) |
|---|
| 32 | +blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio, |
|---|
| 33 | + unsigned int nr_segs) |
|---|
| 34 | 34 | { |
|---|
| 35 | 35 | if (blk_queue_nomerges(q) || !bio_mergeable(bio)) |
|---|
| 36 | 36 | return false; |
|---|
| 37 | 37 | |
|---|
| 38 | | - return __blk_mq_sched_bio_merge(q, bio); |
|---|
| 38 | + return __blk_mq_sched_bio_merge(q, bio, nr_segs); |
|---|
| 39 | 39 | } |
|---|
| 40 | 40 | |
|---|
| 41 | 41 | static inline bool |
|---|
| .. | .. |
|---|
| 44 | 44 | { |
|---|
| 45 | 45 | struct elevator_queue *e = q->elevator; |
|---|
| 46 | 46 | |
|---|
| 47 | | - if (e && e->type->ops.mq.allow_merge) |
|---|
| 48 | | - return e->type->ops.mq.allow_merge(q, rq, bio); |
|---|
| 47 | + if (e && e->type->ops.allow_merge) |
|---|
| 48 | + return e->type->ops.allow_merge(q, rq, bio); |
|---|
| 49 | 49 | |
|---|
| 50 | 50 | return true; |
|---|
| 51 | 51 | } |
|---|
| 52 | 52 | |
|---|
| 53 | | -static inline void blk_mq_sched_completed_request(struct request *rq) |
|---|
| 53 | +static inline void blk_mq_sched_completed_request(struct request *rq, u64 now) |
|---|
| 54 | 54 | { |
|---|
| 55 | 55 | struct elevator_queue *e = rq->q->elevator; |
|---|
| 56 | 56 | |
|---|
| 57 | | - if (e && e->type->ops.mq.completed_request) |
|---|
| 58 | | - e->type->ops.mq.completed_request(rq); |
|---|
| 59 | | -} |
|---|
| 60 | | - |
|---|
| 61 | | -static inline void blk_mq_sched_started_request(struct request *rq) |
|---|
| 62 | | -{ |
|---|
| 63 | | - struct request_queue *q = rq->q; |
|---|
| 64 | | - struct elevator_queue *e = q->elevator; |
|---|
| 65 | | - |
|---|
| 66 | | - if (e && e->type->ops.mq.started_request) |
|---|
| 67 | | - e->type->ops.mq.started_request(rq); |
|---|
| 57 | + if (e && e->type->ops.completed_request) |
|---|
| 58 | + e->type->ops.completed_request(rq, now); |
|---|
| 68 | 59 | } |
|---|
| 69 | 60 | |
|---|
| 70 | 61 | static inline void blk_mq_sched_requeue_request(struct request *rq) |
|---|
| .. | .. |
|---|
| 72 | 63 | struct request_queue *q = rq->q; |
|---|
| 73 | 64 | struct elevator_queue *e = q->elevator; |
|---|
| 74 | 65 | |
|---|
| 75 | | - if (e && e->type->ops.mq.requeue_request) |
|---|
| 76 | | - e->type->ops.mq.requeue_request(rq); |
|---|
| 66 | + if ((rq->rq_flags & RQF_ELVPRIV) && e && e->type->ops.requeue_request) |
|---|
| 67 | + e->type->ops.requeue_request(rq); |
|---|
| 77 | 68 | } |
|---|
| 78 | 69 | |
|---|
| 79 | 70 | static inline bool blk_mq_sched_has_work(struct blk_mq_hw_ctx *hctx) |
|---|
| 80 | 71 | { |
|---|
| 81 | 72 | struct elevator_queue *e = hctx->queue->elevator; |
|---|
| 82 | 73 | |
|---|
| 83 | | - if (e && e->type->ops.mq.has_work) |
|---|
| 84 | | - return e->type->ops.mq.has_work(hctx); |
|---|
| 74 | + if (e && e->type->ops.has_work) |
|---|
| 75 | + return e->type->ops.has_work(hctx); |
|---|
| 85 | 76 | |
|---|
| 86 | 77 | return false; |
|---|
| 87 | 78 | } |
|---|