2006-01-28 00:19:46

by Matthew Dobson

[permalink] [raw]
Subject: [patch 2/6] Create and Use common mempool allocators

plain text document attachment (mempool-use_page_allocator.patch)
From: Matthew Dobson <[email protected]>
Subject: [patch 2/6] mempool - Use common mempool page allocator

Convert two mempool users that currently use their own mempool-backed page
allocators to use the generic mempool page allocator.

Also included are 2 trivial whitespace fixes.

Signed-off-by: Matthew Dobson <[email protected]>

drivers/md/dm-crypt.c | 18 ++----------------
mm/highmem.c | 24 ++++++++----------------
2 files changed, 10 insertions(+), 32 deletions(-)

Index: linux-2.6.16-rc1-mm3+mempool_work/drivers/md/dm-crypt.c
===================================================================
--- linux-2.6.16-rc1-mm3+mempool_work.orig/drivers/md/dm-crypt.c
+++ linux-2.6.16-rc1-mm3+mempool_work/drivers/md/dm-crypt.c
@@ -94,20 +94,6 @@ struct crypt_config {
static kmem_cache_t *_crypt_io_pool;

/*
- * Mempool alloc and free functions for the page
- */
-static void *mempool_alloc_page(gfp_t gfp_mask, void *data)
-{
- return alloc_page(gfp_mask);
-}
-
-static void mempool_free_page(void *page, void *data)
-{
- __free_page(page);
-}
-
-
-/*
* Different IV generation algorithms:
*
* plain: the initial vector is the 32-bit low-endian version of the sector
@@ -637,8 +623,8 @@ static int crypt_ctr(struct dm_target *t
goto bad3;
}

- cc->page_pool = mempool_create(MIN_POOL_PAGES, mempool_alloc_page,
- mempool_free_page, NULL);
+ cc->page_pool = mempool_create(MIN_POOL_PAGES, mempool_alloc_pages,
+ mempool_free_pages, 0);
if (!cc->page_pool) {
ti->error = PFX "Cannot allocate page mempool";
goto bad4;
Index: linux-2.6.16-rc1-mm3+mempool_work/mm/highmem.c
===================================================================
--- linux-2.6.16-rc1-mm3+mempool_work.orig/mm/highmem.c
+++ linux-2.6.16-rc1-mm3+mempool_work/mm/highmem.c
@@ -31,14 +31,9 @@

static mempool_t *page_pool, *isa_page_pool;

-static void *page_pool_alloc_isa(gfp_t gfp_mask, void *data)
+static void *mempool_alloc_pages_isa(gfp_t gfp_mask, void *data)
{
- return alloc_page(gfp_mask | GFP_DMA);
-}
-
-static void page_pool_free(void *page, void *data)
-{
- __free_page(page);
+ return mempool_alloc_pages(gfp_mask | GFP_DMA, data);
}

/*
@@ -51,11 +46,6 @@ static void page_pool_free(void *page, v
*/
#ifdef CONFIG_HIGHMEM

-static void *page_pool_alloc(gfp_t gfp_mask, void *data)
-{
- return alloc_page(gfp_mask);
-}
-
static int pkmap_count[LAST_PKMAP];
static unsigned int last_pkmap_nr;
static __cacheline_aligned_in_smp DEFINE_SPINLOCK(kmap_lock);
@@ -229,7 +219,8 @@ static __init int init_emergency_pool(vo
if (!i.totalhigh)
return 0;

- page_pool = mempool_create(POOL_SIZE, page_pool_alloc, page_pool_free, NULL);
+ page_pool = mempool_create(POOL_SIZE, mempool_alloc_pages,
+ mempool_free_pages, 0);
if (!page_pool)
BUG();
printk("highmem bounce pool size: %d pages\n", POOL_SIZE);
@@ -272,7 +263,8 @@ int init_emergency_isa_pool(void)
if (isa_page_pool)
return 0;

- isa_page_pool = mempool_create(ISA_POOL_SIZE, page_pool_alloc_isa, page_pool_free, NULL);
+ isa_page_pool = mempool_create(ISA_POOL_SIZE, mempool_alloc_pages_isa,
+ mempool_free_pages, 0);
if (!isa_page_pool)
BUG();

@@ -337,7 +329,7 @@ static void bounce_end_io(struct bio *bi
bio_put(bio);
}

-static int bounce_end_io_write(struct bio *bio, unsigned int bytes_done,int err)
+static int bounce_end_io_write(struct bio *bio, unsigned int bytes_done, int err)
{
if (bio->bi_size)
return 1;
@@ -384,7 +376,7 @@ static int bounce_end_io_read_isa(struct
}

static void __blk_queue_bounce(request_queue_t *q, struct bio **bio_orig,
- mempool_t *pool)
+ mempool_t *pool)
{
struct page *page;
struct bio *bio = NULL;

--


2006-01-28 10:08:15

by Pekka Enberg

[permalink] [raw]
Subject: Re: [patch 2/6] Create and Use common mempool allocators

Hi,

On Fri, 2006-01-27 at 16:19 -0800, Matthew Dobson wrote:
> - cc->page_pool = mempool_create(MIN_POOL_PAGES, mempool_alloc_page,
> - mempool_free_page, NULL);
> + cc->page_pool = mempool_create(MIN_POOL_PAGES, mempool_alloc_pages,
> + mempool_free_pages, 0);

You need to cast that zero to a void pointer to avoid compliation
warning (found in various other places as well). Would probably make
sense to implement helper functions so the casting doesn't spread all
over the place. Other than that, looks good to me.

Pekka