Commit 1b47f531 authored by Jens Axboe's avatar Jens Axboe Committed by Jens Axboe

[PATCH] generic dispatch fixes

- Split elv_dispatch_insert() into two functions
- Rename rq_last_sector() to rq_end_sector()
Signed-off-by: default avatarJens Axboe <axboe@suse.de>
parent 8922e16c
...@@ -40,11 +40,6 @@ ...@@ -40,11 +40,6 @@
static DEFINE_SPINLOCK(elv_list_lock); static DEFINE_SPINLOCK(elv_list_lock);
static LIST_HEAD(elv_list); static LIST_HEAD(elv_list);
static inline sector_t rq_last_sector(struct request *rq)
{
return rq->sector + rq->nr_sectors;
}
/* /*
* can we safely merge with this request? * can we safely merge with this request?
*/ */
...@@ -148,7 +143,7 @@ static int elevator_attach(request_queue_t *q, struct elevator_type *e, ...@@ -148,7 +143,7 @@ static int elevator_attach(request_queue_t *q, struct elevator_type *e,
INIT_LIST_HEAD(&q->queue_head); INIT_LIST_HEAD(&q->queue_head);
q->last_merge = NULL; q->last_merge = NULL;
q->elevator = eq; q->elevator = eq;
q->last_sector = 0; q->end_sector = 0;
q->boundary_rq = NULL; q->boundary_rq = NULL;
q->max_back_kb = 0; q->max_back_kb = 0;
...@@ -233,26 +228,22 @@ void elevator_exit(elevator_t *e) ...@@ -233,26 +228,22 @@ void elevator_exit(elevator_t *e)
kfree(e); kfree(e);
} }
void elv_dispatch_insert_tail(request_queue_t *q, struct request *rq)
{
}
/* /*
* Insert rq into dispatch queue of q. Queue lock must be held on * Insert rq into dispatch queue of q. Queue lock must be held on
* entry. If sort != 0, rq is sort-inserted; otherwise, rq will be * entry. If sort != 0, rq is sort-inserted; otherwise, rq will be
* appended to the dispatch queue. To be used by specific elevators. * appended to the dispatch queue. To be used by specific elevators.
*/ */
void elv_dispatch_insert(request_queue_t *q, struct request *rq, int sort) void elv_dispatch_sort(request_queue_t *q, struct request *rq)
{ {
sector_t boundary; sector_t boundary;
unsigned max_back; unsigned max_back;
struct list_head *entry; struct list_head *entry;
if (!sort) { boundary = q->end_sector;
/* Specific elevator is performing sort. Step away. */
q->last_sector = rq_last_sector(rq);
q->boundary_rq = rq;
list_add_tail(&rq->queuelist, &q->queue_head);
return;
}
boundary = q->last_sector;
max_back = q->max_back_kb * 2; max_back = q->max_back_kb * 2;
boundary = boundary > max_back ? boundary - max_back : 0; boundary = boundary > max_back ? boundary - max_back : 0;
...@@ -343,10 +334,10 @@ void __elv_add_request(request_queue_t *q, struct request *rq, int where, ...@@ -343,10 +334,10 @@ void __elv_add_request(request_queue_t *q, struct request *rq, int where,
where = ELEVATOR_INSERT_BACK; where = ELEVATOR_INSERT_BACK;
/* /*
* this request is scheduling boundary, update last_sector * this request is scheduling boundary, update end_sector
*/ */
if (blk_fs_request(rq)) { if (blk_fs_request(rq)) {
q->last_sector = rq_last_sector(rq); q->end_sector = rq_end_sector(rq);
q->boundary_rq = rq; q->boundary_rq = rq;
} }
} }
...@@ -479,7 +470,7 @@ struct request *elv_next_request(request_queue_t *q) ...@@ -479,7 +470,7 @@ struct request *elv_next_request(request_queue_t *q)
q->last_merge = NULL; q->last_merge = NULL;
if (!q->boundary_rq || q->boundary_rq == rq) { if (!q->boundary_rq || q->boundary_rq == rq) {
q->last_sector = rq_last_sector(rq); q->end_sector = rq_end_sector(rq);
q->boundary_rq = NULL; q->boundary_rq = NULL;
} }
...@@ -802,7 +793,7 @@ ssize_t elv_iosched_show(request_queue_t *q, char *name) ...@@ -802,7 +793,7 @@ ssize_t elv_iosched_show(request_queue_t *q, char *name)
return len; return len;
} }
EXPORT_SYMBOL(elv_dispatch_insert); EXPORT_SYMBOL(elv_dispatch_sort);
EXPORT_SYMBOL(elv_add_request); EXPORT_SYMBOL(elv_add_request);
EXPORT_SYMBOL(__elv_add_request); EXPORT_SYMBOL(__elv_add_request);
EXPORT_SYMBOL(elv_requeue_request); EXPORT_SYMBOL(elv_requeue_request);
......
...@@ -337,7 +337,7 @@ struct request_queue ...@@ -337,7 +337,7 @@ struct request_queue
/* /*
* Dispatch queue sorting * Dispatch queue sorting
*/ */
sector_t last_sector; sector_t end_sector;
struct request *boundary_rq; struct request *boundary_rq;
unsigned int max_back_kb; unsigned int max_back_kb;
...@@ -624,6 +624,17 @@ static inline void blkdev_dequeue_request(struct request *req) ...@@ -624,6 +624,17 @@ static inline void blkdev_dequeue_request(struct request *req)
elv_dequeue_request(req->q, req); elv_dequeue_request(req->q, req);
} }
/*
* This should be in elevator.h, but that requires pulling in rq and q
*/
static inline void elv_dispatch_add_tail(struct request_queue *q,
struct request *rq)
{
q->end_sector = rq_end_sector(rq);
q->boundary_rq = rq;
list_add_tail(&rq->queuelist, &q->queue_head);
}
/* /*
* Access functions for manipulating queue properties * Access functions for manipulating queue properties
*/ */
......
...@@ -79,7 +79,7 @@ struct elevator_queue ...@@ -79,7 +79,7 @@ struct elevator_queue
/* /*
* block elevator interface * block elevator interface
*/ */
extern void elv_dispatch_insert(request_queue_t *, struct request *, int); extern void elv_dispatch_sort(request_queue_t *, struct request *);
extern void elv_add_request(request_queue_t *, struct request *, int, int); extern void elv_add_request(request_queue_t *, struct request *, int, int);
extern void __elv_add_request(request_queue_t *, struct request *, int, int); extern void __elv_add_request(request_queue_t *, struct request *, int, int);
extern int elv_merge(request_queue_t *, struct request **, struct bio *); extern int elv_merge(request_queue_t *, struct request **, struct bio *);
...@@ -140,4 +140,6 @@ enum { ...@@ -140,4 +140,6 @@ enum {
ELV_MQUEUE_MUST, ELV_MQUEUE_MUST,
}; };
#define rq_end_sector(rq) ((rq)->sector + (rq)->nr_sectors)
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment