md/raid1-10: factor out a helper to add bio to plug
The code in raid1 and raid10 is identical, prepare to limit the number of plugged bios. Signed-off-by: Yu Kuai <yukuai3@huawei.com> Signed-off-by: Song Liu <song@kernel.org> Link: https://lore.kernel.org/r/20230529131106.2123367-3-yukuai1@huaweicloud.com
This commit is contained in:
parent
010444623e
commit
5ec6ca140a
|
@ -110,3 +110,19 @@ static void md_bio_reset_resync_pages(struct bio *bio, struct resync_pages *rp,
|
||||||
size -= len;
|
size -= len;
|
||||||
} while (idx++ < RESYNC_PAGES && size > 0);
|
} while (idx++ < RESYNC_PAGES && size > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool raid1_add_bio_to_plug(struct mddev *mddev, struct bio *bio,
|
||||||
|
blk_plug_cb_fn unplug)
|
||||||
|
{
|
||||||
|
struct raid1_plug_cb *plug = NULL;
|
||||||
|
struct blk_plug_cb *cb = blk_check_plugged(unplug, mddev,
|
||||||
|
sizeof(*plug));
|
||||||
|
|
||||||
|
if (!cb)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
plug = container_of(cb, struct raid1_plug_cb, cb);
|
||||||
|
bio_list_add(&plug->pending, bio);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -1346,8 +1346,6 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,
|
||||||
struct bitmap *bitmap = mddev->bitmap;
|
struct bitmap *bitmap = mddev->bitmap;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct md_rdev *blocked_rdev;
|
struct md_rdev *blocked_rdev;
|
||||||
struct blk_plug_cb *cb;
|
|
||||||
struct raid1_plug_cb *plug = NULL;
|
|
||||||
int first_clone;
|
int first_clone;
|
||||||
int max_sectors;
|
int max_sectors;
|
||||||
bool write_behind = false;
|
bool write_behind = false;
|
||||||
|
@ -1576,15 +1574,7 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,
|
||||||
r1_bio->sector);
|
r1_bio->sector);
|
||||||
/* flush_pending_writes() needs access to the rdev so...*/
|
/* flush_pending_writes() needs access to the rdev so...*/
|
||||||
mbio->bi_bdev = (void *)rdev;
|
mbio->bi_bdev = (void *)rdev;
|
||||||
|
if (!raid1_add_bio_to_plug(mddev, mbio, raid1_unplug)) {
|
||||||
cb = blk_check_plugged(raid1_unplug, mddev, sizeof(*plug));
|
|
||||||
if (cb)
|
|
||||||
plug = container_of(cb, struct raid1_plug_cb, cb);
|
|
||||||
else
|
|
||||||
plug = NULL;
|
|
||||||
if (plug) {
|
|
||||||
bio_list_add(&plug->pending, mbio);
|
|
||||||
} else {
|
|
||||||
spin_lock_irqsave(&conf->device_lock, flags);
|
spin_lock_irqsave(&conf->device_lock, flags);
|
||||||
bio_list_add(&conf->pending_bio_list, mbio);
|
bio_list_add(&conf->pending_bio_list, mbio);
|
||||||
spin_unlock_irqrestore(&conf->device_lock, flags);
|
spin_unlock_irqrestore(&conf->device_lock, flags);
|
||||||
|
|
|
@ -1295,8 +1295,6 @@ static void raid10_write_one_disk(struct mddev *mddev, struct r10bio *r10_bio,
|
||||||
const blk_opf_t do_sync = bio->bi_opf & REQ_SYNC;
|
const blk_opf_t do_sync = bio->bi_opf & REQ_SYNC;
|
||||||
const blk_opf_t do_fua = bio->bi_opf & REQ_FUA;
|
const blk_opf_t do_fua = bio->bi_opf & REQ_FUA;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct blk_plug_cb *cb;
|
|
||||||
struct raid1_plug_cb *plug = NULL;
|
|
||||||
struct r10conf *conf = mddev->private;
|
struct r10conf *conf = mddev->private;
|
||||||
struct md_rdev *rdev;
|
struct md_rdev *rdev;
|
||||||
int devnum = r10_bio->devs[n_copy].devnum;
|
int devnum = r10_bio->devs[n_copy].devnum;
|
||||||
|
@ -1336,14 +1334,7 @@ static void raid10_write_one_disk(struct mddev *mddev, struct r10bio *r10_bio,
|
||||||
|
|
||||||
atomic_inc(&r10_bio->remaining);
|
atomic_inc(&r10_bio->remaining);
|
||||||
|
|
||||||
cb = blk_check_plugged(raid10_unplug, mddev, sizeof(*plug));
|
if (!raid1_add_bio_to_plug(mddev, mbio, raid10_unplug)) {
|
||||||
if (cb)
|
|
||||||
plug = container_of(cb, struct raid1_plug_cb, cb);
|
|
||||||
else
|
|
||||||
plug = NULL;
|
|
||||||
if (plug) {
|
|
||||||
bio_list_add(&plug->pending, mbio);
|
|
||||||
} else {
|
|
||||||
spin_lock_irqsave(&conf->device_lock, flags);
|
spin_lock_irqsave(&conf->device_lock, flags);
|
||||||
bio_list_add(&conf->pending_bio_list, mbio);
|
bio_list_add(&conf->pending_bio_list, mbio);
|
||||||
spin_unlock_irqrestore(&conf->device_lock, flags);
|
spin_unlock_irqrestore(&conf->device_lock, flags);
|
||||||
|
|
Loading…
Reference in New Issue