CFQ: update to rq-dyn API



 25-akpm/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	Wed Apr 30 15:23:26 2003
+++ 25-akpm/drivers/block/cfq-iosched.c	Wed Apr 30 15:23:26 2003
@@ -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,

_