From: Nick Piggin Use the new elv_queue_empty() stuff drivers/block/as-iosched.c | 36 ++++++++++++------------------------ drivers/block/ll_rw_blk.c | 4 ++-- drivers/block/paride/pf.c | 4 ++-- 3 files changed, 16 insertions(+), 28 deletions(-) diff -puN drivers/block/as-iosched.c~as-use-queue_empty drivers/block/as-iosched.c --- 25/drivers/block/as-iosched.c~as-use-queue_empty 2003-04-07 01:40:45.000000000 -0700 +++ 25-akpm/drivers/block/as-iosched.c 2003-04-07 01:40:45.000000000 -0700 @@ -1247,33 +1247,21 @@ as_insert_request(request_queue_t *q, st } /* - * as_queue_notready tells us weather or not as_next_request - * will return us a request or NULL. With the previous work conserving - * scheduler this API was designed around, if a queue had requests in it, - * as_next_request would return a request, and drivers seem to make - * that assumption + * as_queue_empty tells us if there are requests left in the device. It may + * not be the case that a driver can get the next request even if the queue + * is not empty - it is used in the block layer to check for plugging and + * merging opportunities */ -static int as_queue_notready(request_queue_t *q) +static int as_queue_empty(request_queue_t *q) { - int ret = 0; struct as_data *ad = q->elevator.elevator_data; - if (!list_empty(ad->dispatch)) - goto out; - - if (ad->antic_status == ANTIC_WAIT_REQ || - ad->antic_status == ANTIC_WAIT_NEXT) { - ret = 1; - goto out; - } - - if (!as_dispatch_request(ad)) { - ret = 1; - goto out; - } + if (!list_empty(&ad->fifo_list[WRITE]) + || !list_empty(&ad->fifo_list[READ]) + || !list_empty(ad->dispatch)) + return 0; -out: - return ret; + return 1; } static struct request * @@ -1442,7 +1430,7 @@ static void as_work_handler(void *data) unsigned long flags; spin_lock_irqsave(q->queue_lock, flags); - if (!as_queue_notready(q)) + if (as_next_request(q)) q->request_fn(q); spin_unlock_irqrestore(q->queue_lock, flags); } @@ -1706,7 +1694,7 @@ elevator_t iosched_as = { .elevator_next_req_fn = as_next_request, .elevator_add_req_fn = as_insert_request, .elevator_remove_req_fn = as_remove_request, - .elevator_queue_empty_fn = as_queue_notready, + .elevator_queue_empty_fn = as_queue_empty, .elevator_former_req_fn = as_former_request, .elevator_latter_req_fn = as_latter_request, .elevator_init_fn = as_init, diff -puN drivers/block/ll_rw_blk.c~as-use-queue_empty drivers/block/ll_rw_blk.c --- 25/drivers/block/ll_rw_blk.c~as-use-queue_empty 2003-04-07 01:40:45.000000000 -0700 +++ 25-akpm/drivers/block/ll_rw_blk.c 2003-04-07 01:42:34.000000000 -0700 @@ -984,7 +984,7 @@ static inline void __generic_unplug_devi /* * was plugged, fire request_fn if queue has stuff to do */ - if (!elv_queue_empty(q)) + if (elv_next_request(q)) q->request_fn(q); } @@ -1038,7 +1038,7 @@ void blk_start_queue(request_queue_t *q) unsigned long flags; spin_lock_irqsave(q->queue_lock, flags); - if (!elv_queue_empty(q)) + if (elv_next_request(q)) q->request_fn(q); spin_unlock_irqrestore(q->queue_lock, flags); }