#include <linux/module.h>
#include <linux/mempool.h>
#include <linux/workqueue.h>
-#include <linux/blktrace_api.h>
#include <scsi/sg.h> /* for struct sg_iovec */
#define BIO_POOL_SIZE 256
-static kmem_cache_t *bio_slab __read_mostly;
+static kmem_cache_t *bio_slab;
#define BIOVEC_NR_POOLS 6
* basically we just need to survive
*/
#define BIO_SPLIT_ENTRIES 8
-mempool_t *bio_split_pool __read_mostly;
+mempool_t *bio_split_pool;
struct biovec_slab {
int nr_vecs;
return ERR_PTR(-ENOMEM);
ret = -ENOMEM;
- pages = kcalloc(nr_pages, sizeof(struct page *), GFP_KERNEL);
+ pages = kmalloc(nr_pages * sizeof(struct page *), GFP_KERNEL);
if (!pages)
goto out;
+ memset(pages, 0, nr_pages * sizeof(struct page *));
+
for (i = 0; i < iov_count; i++) {
unsigned long uaddr = (unsigned long)iov[i].iov_base;
unsigned long len = iov[i].iov_len;
if (!bp)
return bp;
- blk_add_trace_pdu_int(bdev_get_queue(bi->bi_bdev), BLK_TA_SPLIT, bi,
- bi->bi_sector + first_sectors);
-
BUG_ON(bi->bi_vcnt != 1);
BUG_ON(bi->bi_idx != 0);
atomic_set(&bp->cnt, 3);
return bp;
}
+static void *bio_pair_alloc(gfp_t gfp_flags, void *data)
+{
+ return kmalloc(sizeof(struct bio_pair), gfp_flags);
+}
+
+static void bio_pair_free(void *bp, void *data)
+{
+ kfree(bp);
+}
+
/*
* create memory pools for biovec's in a bio_set.
if (i >= scale)
pool_entries >>= 1;
- *bvp = mempool_create_slab_pool(pool_entries, bp->slab);
+ *bvp = mempool_create(pool_entries, mempool_alloc_slab,
+ mempool_free_slab, bp->slab);
if (!*bvp)
return -ENOMEM;
}
struct bio_set *bioset_create(int bio_pool_size, int bvec_pool_size, int scale)
{
- struct bio_set *bs = kzalloc(sizeof(*bs), GFP_KERNEL);
+ struct bio_set *bs = kmalloc(sizeof(*bs), GFP_KERNEL);
if (!bs)
return NULL;
- bs->bio_pool = mempool_create_slab_pool(bio_pool_size, bio_slab);
+ memset(bs, 0, sizeof(*bs));
+ bs->bio_pool = mempool_create(bio_pool_size, mempool_alloc_slab,
+ mempool_free_slab, bio_slab);
+
if (!bs->bio_pool)
goto bad;
scale = 4;
/*
- * Limit number of entries reserved -- mempools are only used when
- * the system is completely unable to allocate memory, so we only
- * need enough to make progress.
+ * scale number of entries
*/
- bvec_pool_entries = 1 + scale;
+ bvec_pool_entries = megabytes * 2;
+ if (bvec_pool_entries > 256)
+ bvec_pool_entries = 256;
fs_bio_set = bioset_create(BIO_POOL_SIZE, bvec_pool_entries, scale);
if (!fs_bio_set)
panic("bio: can't allocate bios\n");
- bio_split_pool = mempool_create_kmalloc_pool(BIO_SPLIT_ENTRIES,
- sizeof(struct bio_pair));
+ bio_split_pool = mempool_create(BIO_SPLIT_ENTRIES,
+ bio_pair_alloc, bio_pair_free, NULL);
if (!bio_split_pool)
panic("bio: can't create split pool\n");