diff options
author | Lars Ellenberg <lars.ellenberg@linbit.com> | 2011-02-23 11:02:01 -0500 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2011-10-14 10:48:06 -0400 |
commit | da4a75d2ef064501f6756986af6ea330ba0585d7 (patch) | |
tree | 1f5c9d466fd09a95d4d6febef5ac6597bc3cc2c0 /drivers | |
parent | 9db4e77f8cbbeeb32a4d2aea022c80333c445984 (diff) |
drbd: introduce a bio_set to allocate housekeeping bios from
Don't rely on availability of bios from the global fs_bio_set,
we should use our own bio_set for meta data IO.
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/block/drbd/drbd_actlog.c | 2 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_bitmap.c | 3 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_int.h | 6 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 28 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 6 |
5 files changed, 41 insertions, 4 deletions
diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index ea3895de4e6d..7cd78617669b 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c | |||
@@ -125,7 +125,7 @@ static int _drbd_md_sync_page_io(struct drbd_conf *mdev, | |||
125 | rw |= REQ_FUA | REQ_FLUSH; | 125 | rw |= REQ_FUA | REQ_FLUSH; |
126 | rw |= REQ_SYNC; | 126 | rw |= REQ_SYNC; |
127 | 127 | ||
128 | bio = bio_alloc(GFP_NOIO, 1); | 128 | bio = bio_alloc_drbd(GFP_NOIO); |
129 | bio->bi_bdev = bdev->md_bdev; | 129 | bio->bi_bdev = bdev->md_bdev; |
130 | bio->bi_sector = sector; | 130 | bio->bi_sector = sector; |
131 | ok = (bio_add_page(bio, page, size, 0) == size); | 131 | ok = (bio_add_page(bio, page, size, 0) == size); |
diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c index 0009e40744ab..52c48143b22a 100644 --- a/drivers/block/drbd/drbd_bitmap.c +++ b/drivers/block/drbd/drbd_bitmap.c | |||
@@ -974,8 +974,7 @@ static void bm_async_io_complete(struct bio *bio, int error) | |||
974 | 974 | ||
975 | static void bm_page_io_async(struct bm_aio_ctx *ctx, int page_nr, int rw) __must_hold(local) | 975 | static void bm_page_io_async(struct bm_aio_ctx *ctx, int page_nr, int rw) __must_hold(local) |
976 | { | 976 | { |
977 | /* we are process context. we always get a bio */ | 977 | struct bio *bio = bio_alloc_drbd(GFP_KERNEL); |
978 | struct bio *bio = bio_alloc(GFP_KERNEL, 1); | ||
979 | struct drbd_conf *mdev = ctx->mdev; | 978 | struct drbd_conf *mdev = ctx->mdev; |
980 | struct drbd_bitmap *b = mdev->bitmap; | 979 | struct drbd_bitmap *b = mdev->bitmap; |
981 | struct page *page; | 980 | struct page *page; |
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 2444a1683475..e68758344647 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h | |||
@@ -1489,6 +1489,12 @@ extern wait_queue_head_t drbd_pp_wait; | |||
1489 | #define DRBD_MIN_POOL_PAGES 128 | 1489 | #define DRBD_MIN_POOL_PAGES 128 |
1490 | extern mempool_t *drbd_md_io_page_pool; | 1490 | extern mempool_t *drbd_md_io_page_pool; |
1491 | 1491 | ||
1492 | /* We also need to make sure we get a bio | ||
1493 | * when we need it for housekeeping purposes */ | ||
1494 | extern struct bio_set *drbd_md_io_bio_set; | ||
1495 | /* to allocate from that set */ | ||
1496 | extern struct bio *bio_alloc_drbd(gfp_t gfp_mask); | ||
1497 | |||
1492 | extern rwlock_t global_state_lock; | 1498 | extern rwlock_t global_state_lock; |
1493 | 1499 | ||
1494 | extern int conn_lowest_minor(struct drbd_tconn *tconn); | 1500 | extern int conn_lowest_minor(struct drbd_tconn *tconn); |
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 5f4c95905d5e..997b2e214670 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
@@ -130,6 +130,7 @@ struct kmem_cache *drbd_al_ext_cache; /* activity log extents */ | |||
130 | mempool_t *drbd_request_mempool; | 130 | mempool_t *drbd_request_mempool; |
131 | mempool_t *drbd_ee_mempool; | 131 | mempool_t *drbd_ee_mempool; |
132 | mempool_t *drbd_md_io_page_pool; | 132 | mempool_t *drbd_md_io_page_pool; |
133 | struct bio_set *drbd_md_io_bio_set; | ||
133 | 134 | ||
134 | /* I do not use a standard mempool, because: | 135 | /* I do not use a standard mempool, because: |
135 | 1) I want to hand out the pre-allocated objects first. | 136 | 1) I want to hand out the pre-allocated objects first. |
@@ -150,6 +151,25 @@ static const struct block_device_operations drbd_ops = { | |||
150 | .release = drbd_release, | 151 | .release = drbd_release, |
151 | }; | 152 | }; |
152 | 153 | ||
154 | static void bio_destructor_drbd(struct bio *bio) | ||
155 | { | ||
156 | bio_free(bio, drbd_md_io_bio_set); | ||
157 | } | ||
158 | |||
159 | struct bio *bio_alloc_drbd(gfp_t gfp_mask) | ||
160 | { | ||
161 | struct bio *bio; | ||
162 | |||
163 | if (!drbd_md_io_bio_set) | ||
164 | return bio_alloc(gfp_mask, 1); | ||
165 | |||
166 | bio = bio_alloc_bioset(gfp_mask, 1, drbd_md_io_bio_set); | ||
167 | if (!bio) | ||
168 | return NULL; | ||
169 | bio->bi_destructor = bio_destructor_drbd; | ||
170 | return bio; | ||
171 | } | ||
172 | |||
153 | #ifdef __CHECKER__ | 173 | #ifdef __CHECKER__ |
154 | /* When checking with sparse, and this is an inline function, sparse will | 174 | /* When checking with sparse, and this is an inline function, sparse will |
155 | give tons of false positives. When this is a real functions sparse works. | 175 | give tons of false positives. When this is a real functions sparse works. |
@@ -1953,6 +1973,8 @@ static void drbd_destroy_mempools(void) | |||
1953 | 1973 | ||
1954 | /* D_ASSERT(atomic_read(&drbd_pp_vacant)==0); */ | 1974 | /* D_ASSERT(atomic_read(&drbd_pp_vacant)==0); */ |
1955 | 1975 | ||
1976 | if (drbd_md_io_bio_set) | ||
1977 | bioset_free(drbd_md_io_bio_set); | ||
1956 | if (drbd_md_io_page_pool) | 1978 | if (drbd_md_io_page_pool) |
1957 | mempool_destroy(drbd_md_io_page_pool); | 1979 | mempool_destroy(drbd_md_io_page_pool); |
1958 | if (drbd_ee_mempool) | 1980 | if (drbd_ee_mempool) |
@@ -1968,6 +1990,7 @@ static void drbd_destroy_mempools(void) | |||
1968 | if (drbd_al_ext_cache) | 1990 | if (drbd_al_ext_cache) |
1969 | kmem_cache_destroy(drbd_al_ext_cache); | 1991 | kmem_cache_destroy(drbd_al_ext_cache); |
1970 | 1992 | ||
1993 | drbd_md_io_bio_set = NULL; | ||
1971 | drbd_md_io_page_pool = NULL; | 1994 | drbd_md_io_page_pool = NULL; |
1972 | drbd_ee_mempool = NULL; | 1995 | drbd_ee_mempool = NULL; |
1973 | drbd_request_mempool = NULL; | 1996 | drbd_request_mempool = NULL; |
@@ -1993,6 +2016,7 @@ static int drbd_create_mempools(void) | |||
1993 | drbd_al_ext_cache = NULL; | 2016 | drbd_al_ext_cache = NULL; |
1994 | drbd_pp_pool = NULL; | 2017 | drbd_pp_pool = NULL; |
1995 | drbd_md_io_page_pool = NULL; | 2018 | drbd_md_io_page_pool = NULL; |
2019 | drbd_md_io_bio_set = NULL; | ||
1996 | 2020 | ||
1997 | /* caches */ | 2021 | /* caches */ |
1998 | drbd_request_cache = kmem_cache_create( | 2022 | drbd_request_cache = kmem_cache_create( |
@@ -2016,6 +2040,10 @@ static int drbd_create_mempools(void) | |||
2016 | goto Enomem; | 2040 | goto Enomem; |
2017 | 2041 | ||
2018 | /* mempools */ | 2042 | /* mempools */ |
2043 | drbd_md_io_bio_set = bioset_create(DRBD_MIN_POOL_PAGES, 0); | ||
2044 | if (drbd_md_io_bio_set == NULL) | ||
2045 | goto Enomem; | ||
2046 | |||
2019 | drbd_md_io_page_pool = mempool_create_page_pool(DRBD_MIN_POOL_PAGES, 0); | 2047 | drbd_md_io_page_pool = mempool_create_page_pool(DRBD_MIN_POOL_PAGES, 0); |
2020 | if (drbd_md_io_page_pool == NULL) | 2048 | if (drbd_md_io_page_pool == NULL) |
2021 | goto Enomem; | 2049 | goto Enomem; |
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index cd78ebfefe52..6dcf65484c26 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c | |||
@@ -1124,7 +1124,11 @@ int drbd_submit_peer_request(struct drbd_conf *mdev, | |||
1124 | /* In most cases, we will only need one bio. But in case the lower | 1124 | /* In most cases, we will only need one bio. But in case the lower |
1125 | * level restrictions happen to be different at this offset on this | 1125 | * level restrictions happen to be different at this offset on this |
1126 | * side than those of the sending peer, we may need to submit the | 1126 | * side than those of the sending peer, we may need to submit the |
1127 | * request in more than one bio. */ | 1127 | * request in more than one bio. |
1128 | * | ||
1129 | * Plain bio_alloc is good enough here, this is no DRBD internally | ||
1130 | * generated bio, but a bio allocated on behalf of the peer. | ||
1131 | */ | ||
1128 | next_bio: | 1132 | next_bio: |
1129 | bio = bio_alloc(GFP_NOIO, nr_pages); | 1133 | bio = bio_alloc(GFP_NOIO, nr_pages); |
1130 | if (!bio) { | 1134 | if (!bio) { |