Message ID | 20220916113428.774061-4-yukuai1@huaweicloud.com (mailing list archive) |
---|---|
State | Mainlined, archived |
Delegated to: | Song Liu |
Headers | show |
Series | md/raid10: reduce lock contention for io | expand |
On 2022-09-16 05:34, Yu Kuai wrote: > From: Yu Kuai <yukuai3@huawei.com> > > Currently, wake_up() is called unconditionally in fast path such as > raid10_make_request(), which will cause lock contention under high > concurrency: > > raid10_make_request > wake_up > __wake_up_common_lock > spin_lock_irqsave > > Improve performance by only call wake_up() if waitqueue is not empty > in allow_barrier() and raid10_make_request(). > > Signed-off-by: Yu Kuai <yukuai3@huawei.com> Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
On 9/16/22 7:34 PM, Yu Kuai wrote: > From: Yu Kuai <yukuai3@huawei.com> > > Currently, wake_up() is called unconditionally in fast path such as > raid10_make_request(), which will cause lock contention under high > concurrency: > > raid10_make_request > wake_up > __wake_up_common_lock > spin_lock_irqsave > > Improve performance by only call wake_up() if waitqueue is not empty > in allow_barrier() and raid10_make_request(). > > Signed-off-by: Yu Kuai <yukuai3@huawei.com> > --- > drivers/md/raid10.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c > index df435d693637..cf452c25e1e5 100644 > --- a/drivers/md/raid10.c > +++ b/drivers/md/raid10.c > @@ -274,6 +274,12 @@ static void put_buf(struct r10bio *r10_bio) > lower_barrier(conf); > } > > +static void wake_up_barrier(struct r10conf *conf) > +{ > + if (wq_has_sleeper(&conf->wait_barrier)) > + wake_up(&conf->wait_barrier); > +} > + > static void reschedule_retry(struct r10bio *r10_bio) > { > unsigned long flags; > @@ -1015,7 +1021,7 @@ static void allow_barrier(struct r10conf *conf) > { > if ((atomic_dec_and_test(&conf->nr_pending)) || > (conf->array_freeze_pending)) > - wake_up(&conf->wait_barrier); > + wake_up_barrier(conf); > } > > static void freeze_array(struct r10conf *conf, int extra) > @@ -1891,7 +1897,7 @@ static bool raid10_make_request(struct mddev *mddev, struct bio *bio) > __make_request(mddev, bio, sectors); > > /* In case raid10d snuck in to freeze_array */ > - wake_up(&conf->wait_barrier); > + wake_up_barrier(conf); > return true; > } > Acked-by: Guoqing Jiang <guoqing.jiang@linux.dev> Thanks, Guoqing
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index df435d693637..cf452c25e1e5 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -274,6 +274,12 @@ static void put_buf(struct r10bio *r10_bio) lower_barrier(conf); } +static void wake_up_barrier(struct r10conf *conf) +{ + if (wq_has_sleeper(&conf->wait_barrier)) + wake_up(&conf->wait_barrier); +} + static void reschedule_retry(struct r10bio *r10_bio) { unsigned long flags; @@ -1015,7 +1021,7 @@ static void allow_barrier(struct r10conf *conf) { if ((atomic_dec_and_test(&conf->nr_pending)) || (conf->array_freeze_pending)) - wake_up(&conf->wait_barrier); + wake_up_barrier(conf); } static void freeze_array(struct r10conf *conf, int extra) @@ -1891,7 +1897,7 @@ static bool raid10_make_request(struct mddev *mddev, struct bio *bio) __make_request(mddev, bio, sectors); /* In case raid10d snuck in to freeze_array */ - wake_up(&conf->wait_barrier); + wake_up_barrier(conf); return true; }