From ac062f74f4b054cb70bfbd32d0bae4e1a413e1f8 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Sat, 10 May 2003 08:05:58 -0700 Subject: [PATCH] dynamic request allocation This patch adds dynamic allocation of request structures. Right now we are reserving 256 requests per initialized queue, which adds up to quite a lot of memory for even a modest number of queues. For the quoted 4000 disk systems, it's a disaster. Instead, we mempool 4 requests per queue and put an upper limit on the number of requests that we will put in-flight as well. I've kept the 128 read/write max in-flight limit for now. It is trivial to experiement with larger queue sizes now, but I want to change one thing at the time (the truncate scenario doesn't look all that good with a huge number of requests, for instance). Patch has been in -mm for a while, I'm running it here against stock 2.5 as well. Additionally, it actually kills quite a bit of code as well --- include/linux/blkdev.h | 12 +++++++----- include/linux/elevator.h | 7 +++++++ 2 files changed, 14 insertions(+), 5 deletions(-) (limited to 'include') diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 32a8cddd2ca3..4c53e7bbcc25 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -18,10 +19,12 @@ typedef struct request_queue request_queue_t; struct elevator_s; typedef struct elevator_s elevator_t; +#define BLKDEV_MIN_RQ 4 +#define BLKDEV_MAX_RQ 128 + struct request_list { - unsigned int count; - struct list_head free; - wait_queue_head_t wait; + int count[2]; + mempool_t *rq_pool; }; /* @@ -180,7 +183,7 @@ struct request_queue /* * the queue request freelist, one for reads and one for writes */ - struct request_list rq[2]; + struct request_list rq; request_fn_proc *request_fn; merge_request_fn *back_merge_fn; @@ -329,7 +332,6 @@ extern void blk_put_request(struct request *); extern void blk_attempt_remerge(request_queue_t *, struct request *); extern void __blk_attempt_remerge(request_queue_t *, struct request *); extern struct request *blk_get_request(request_queue_t *, int, int); -extern struct request *__blk_get_request(request_queue_t *, int); extern void blk_put_request(struct request *); extern void blk_insert_request(request_queue_t *, struct request *, int, void *); extern void blk_plug_device(request_queue_t *); diff --git a/include/linux/elevator.h b/include/linux/elevator.h index 69648f495dc1..ef4e0e6c3ef7 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h @@ -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_set_req_fn) (request_queue_t *, struct request *, int); +typedef void (elevator_put_req_fn) (request_queue_t *, struct request *); typedef int (elevator_init_fn) (request_queue_t *, elevator_t *); typedef void (elevator_exit_fn) (request_queue_t *, elevator_t *); @@ -34,6 +36,9 @@ struct elevator_s elevator_request_list_fn *elevator_former_req_fn; elevator_request_list_fn *elevator_latter_req_fn; + elevator_set_req_fn *elevator_set_req_fn; + elevator_put_req_fn *elevator_put_req_fn; + elevator_init_fn *elevator_init_fn; elevator_exit_fn *elevator_exit_fn; @@ -59,6 +64,8 @@ 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_set_request(request_queue_t *, struct request *, int); +extern void elv_put_request(request_queue_t *, struct request *); #define __elv_add_request_pos(q, rq, pos) \ (q)->elevator.elevator_add_req_fn((q), (rq), (pos)) -- cgit v1.2.3