]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] elv_may_queue() API function
authorAndrew Morton <akpm@osdl.org>
Sat, 5 Jul 2003 02:36:16 +0000 (19:36 -0700)
committerLinus Torvalds <torvalds@home.osdl.org>
Sat, 5 Jul 2003 02:36:16 +0000 (19:36 -0700)
Introduces the elv_may_queue() predicate with which the IO scheduler may tell
the generic request layer that we may add another request to this queue.

It is used by the CFQ elevator.

drivers/block/elevator.c
drivers/block/ll_rw_blk.c
include/linux/elevator.h

index 00b56d022b0e4a0c107dea2052f794e342c96167..bf40a06781d5f1c547de1bee0170ba6733b4f884 100644 (file)
@@ -361,6 +361,16 @@ void elv_put_request(request_queue_t *q, struct request *rq)
                e->elevator_put_req_fn(q, rq);
 }
 
+int elv_may_queue(request_queue_t *q, int rw)
+{
+       elevator_t *e = &q->elevator;
+
+       if (e->elevator_may_queue_fn)
+               return e->elevator_may_queue_fn(q, rw);
+
+       return 1;
+}
+
 int elv_register_queue(struct gendisk *disk)
 {
        request_queue_t *q = disk->queue;
index 3e68ceb9578ca089aed73f89e9fe49da5a740577..1debfebc2f579951c00a626363b4a8a00d4acc62 100644 (file)
@@ -1294,7 +1294,7 @@ static struct request *get_request(request_queue_t *q, int rw, int gfp_mask)
        struct request_list *rl = &q->rq;
 
        spin_lock_irq(q->queue_lock);
-       if (rl->count[rw] == BLKDEV_MAX_RQ) {
+       if (rl->count[rw] == BLKDEV_MAX_RQ || !elv_may_queue(q, rw)) {
                spin_unlock_irq(q->queue_lock);
                goto out;
        }
index 522e51609ef3e5d50749d1503e3c962e5144445b..66bedb242218c4abd7dd27fbe744fb8bc3353dab 100644 (file)
@@ -15,6 +15,8 @@ typedef int (elevator_queue_empty_fn) (request_queue_t *);
 typedef void (elevator_remove_req_fn) (request_queue_t *, struct request *);
 typedef struct request *(elevator_request_list_fn) (request_queue_t *, struct request *);
 typedef struct list_head *(elevator_get_sort_head_fn) (request_queue_t *, struct request *);
+typedef int (elevator_may_queue_fn) (request_queue_t *, int);
+
 typedef int (elevator_set_req_fn) (request_queue_t *, struct request *, int);
 typedef void (elevator_put_req_fn) (request_queue_t *, struct request *);
 
@@ -39,6 +41,8 @@ struct elevator_s
        elevator_set_req_fn *elevator_set_req_fn;
        elevator_put_req_fn *elevator_put_req_fn;
 
+       elevator_may_queue_fn *elevator_may_queue_fn;
+
        elevator_init_fn *elevator_init_fn;
        elevator_exit_fn *elevator_exit_fn;
 
@@ -64,6 +68,7 @@ extern struct request *elv_former_request(request_queue_t *, struct request *);
 extern struct request *elv_latter_request(request_queue_t *, struct request *);
 extern int elv_register_queue(struct gendisk *);
 extern void elv_unregister_queue(struct gendisk *);
+extern int elv_may_queue(request_queue_t *, int);
 extern int elv_set_request(request_queue_t *, struct request *, int);
 extern void elv_put_request(request_queue_t *, struct request *);