CFQ: update to rq-dyn API drivers/block/cfq-iosched.c | 93 ++++++++++++++++++-------------------------- 1 files changed, 39 insertions(+), 54 deletions(-) diff -puN drivers/block/cfq-iosched.c~cfq-iosched-dyn drivers/block/cfq-iosched.c --- 25/drivers/block/cfq-iosched.c~cfq-iosched-dyn 2003-05-16 21:43:32.000000000 -0700 +++ 25-akpm/drivers/block/cfq-iosched.c 2003-05-16 21:43:32.000000000 -0700 @@ -73,7 +73,7 @@ struct cfq_data { int busy_queues; - unsigned long random_seed; + mempool_t *crq_pool; }; struct cfq_rq { @@ -562,51 +562,48 @@ out: return ret; } -static void cfq_exit(request_queue_t *q, elevator_t *e) +static void cfq_put_request(request_queue_t *q, struct request *rq) { - struct cfq_data *cfqd = e->elevator_data; - struct cfq_rq *crq; - struct request *rq; - int i; - - for (i = READ; i <= WRITE; i++) { - struct request_list *rl = &q->rq[i]; - struct list_head *entry; - - list_for_each(entry, &rl->free) { - rq = list_entry_rq(entry); - - crq = RQ_DATA(rq); - if (!crq) - continue; + struct cfq_data *cfqd = q->elevator.elevator_data; + struct cfq_rq *crq = RQ_DATA(rq); - rq->elevator_private = NULL; - kmem_cache_free(crq_pool, crq); - } + if (crq) { + mempool_free(crq, cfqd->crq_pool); + rq->elevator_private = NULL; } - - e->elevator_data = NULL; - kfree(cfqd->crq_hash); - kfree(cfqd->cfq_hash); - kfree(cfqd); } -static void *slab_pool_alloc(int gfp_mask, void *data) +static int cfq_set_request(request_queue_t *q, struct request *rq, int gfp_mask) { - return kmem_cache_alloc(data, gfp_mask); + struct cfq_data *cfqd = q->elevator.elevator_data; + struct cfq_rq *crq = mempool_alloc(cfqd->crq_pool, gfp_mask); + + if (crq) { + crq->request = rq; + crq->cfq_queue = NULL; + INIT_LIST_HEAD(&crq->hash); + rq->elevator_private = crq; + return 0; + } + + return 1; } -static void slab_pool_free(void *ptr, void *data) +static void cfq_exit(request_queue_t *q, elevator_t *e) { - kmem_cache_free(data, ptr); + struct cfq_data *cfqd = e->elevator_data; + + e->elevator_data = NULL; + mempool_destroy(cfqd->crq_pool); + kfree(cfqd->crq_hash); + kfree(cfqd->cfq_hash); + kfree(cfqd); } static int cfq_init(request_queue_t *q, elevator_t *e) { struct cfq_data *cfqd; - struct request *rq; - struct cfq_rq *crq; - int i, ret = 0; + int i; cfqd = kmalloc(sizeof(*cfqd), GFP_KERNEL); if (!cfqd) @@ -623,34 +620,20 @@ static int cfq_init(request_queue_t *q, if (!cfqd->cfq_hash) goto out_cfqhash; + cfqd->crq_pool = mempool_create(BLKDEV_MIN_RQ, mempool_alloc_slab, mempool_free_slab, crq_pool); + if (!cfqd->crq_pool) + goto out_crqpool; + for (i = 0; i < CFQ_MHASH_ENTRIES; i++) INIT_LIST_HEAD(&cfqd->crq_hash[i]); for (i = 0; i < CFQ_QHASH_ENTRIES; i++) INIT_LIST_HEAD(&cfqd->cfq_hash[i]); - for (i = READ; i <= WRITE; i++) { - struct request_list *rl = &q->rq[i]; - struct list_head *entry; - - list_for_each(entry, &rl->free) { - rq = list_entry_rq(entry); - - crq = kmem_cache_alloc(crq_pool, GFP_KERNEL); - if (!crq) { - ret = -ENOMEM; - break; - } - - memset(crq, 0, sizeof(*crq)); - INIT_LIST_HEAD(&crq->hash); - crq->request = rq; - rq->elevator_private = crq; - } - } - cfqd->dispatch = &q->queue_head; e->elevator_data = cfqd; - return ret; + return 0; +out_crqpool: + kfree(cfqd->cfq_hash); out_cfqhash: kfree(cfqd->crq_hash); out_crqhash: @@ -672,7 +655,7 @@ static int __init cfq_slab_setup(void) if (!cfq_pool) panic("cfq_iosched: can't init cfq pool\n"); - cfq_mpool = mempool_create(64, slab_pool_alloc, slab_pool_free, cfq_pool); + cfq_mpool = mempool_create(64, mempool_alloc_slab, mempool_free_slab, cfq_pool); if (!cfq_mpool) panic("cfq_iosched: can't init cfq mpool\n"); @@ -692,6 +675,8 @@ elevator_t iosched_cfq = { .elevator_queue_empty_fn = cfq_queue_empty, .elevator_former_req_fn = cfq_former_request, .elevator_latter_req_fn = cfq_latter_request, + .elevator_set_req_fn = cfq_set_request, + .elevator_put_req_fn = cfq_put_request, .elevator_may_queue_fn = cfq_may_queue, .elevator_init_fn = cfq_init, .elevator_exit_fn = cfq_exit, _