Message ID | 20190111110757.17936-2-mfo@canonical.com |
---|---|
State | New |
Headers | show |
Series | blk-wbt: fix for LP#1810998 | expand |
On 1/11/19 12:07 PM, Mauricio Faria de Oliveira wrote: > From: Jens Axboe <axboe@kernel.dk> > > BugLink: https://bugs.launchpad.net/bugs/1810998 > > This is in preparation for having more write queues, in which > case we would have needed to pass in more information than just > a simple 'is_kswapd' boolean. > > Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> > Reviewed-by: Omar Sandoval <osandov@fb.com> > Signed-off-by: Jens Axboe <axboe@kernel.dk> > (cherry-picked from commit 8bea60901974ad44b06b08d52e1dd421ea8c6e9c) The correct string would be: (cherry picked from commit...) which is how 'git cherry-pick -x' adds it. No need to re-send, we can fix it when applying the patch. Thanks, Kleber > Signed-off-by: Mauricio Faria de Oliveira <mfo@canonical.com> > --- > block/blk-wbt.c | 25 +++++++++++++++---------- > block/blk-wbt.h | 4 +++- > 2 files changed, 18 insertions(+), 11 deletions(-) > > diff --git a/block/blk-wbt.c b/block/blk-wbt.c > index f92fc84b5e2c..4afa0ebb5953 100644 > --- a/block/blk-wbt.c > +++ b/block/blk-wbt.c > @@ -101,9 +101,13 @@ static bool wb_recent_wait(struct rq_wb *rwb) > return time_before(jiffies, wb->dirty_sleep + HZ); > } > > -static inline struct rq_wait *get_rq_wait(struct rq_wb *rwb, bool is_kswapd) > +static inline struct rq_wait *get_rq_wait(struct rq_wb *rwb, > + enum wbt_flags wb_acct) > { > - return &rwb->rq_wait[is_kswapd]; > + if (wb_acct & WBT_KSWAPD) > + return &rwb->rq_wait[WBT_RWQ_KSWAPD]; > + > + return &rwb->rq_wait[WBT_RWQ_BG]; > } > > static void rwb_wake_all(struct rq_wb *rwb) > @@ -126,7 +130,7 @@ void __wbt_done(struct rq_wb *rwb, enum wbt_flags wb_acct) > if (!(wb_acct & WBT_TRACKED)) > return; > > - rqw = get_rq_wait(rwb, wb_acct & WBT_KSWAPD); > + rqw = get_rq_wait(rwb, wb_acct); > inflight = atomic_dec_return(&rqw->inflight); > > /* > @@ -529,11 +533,12 @@ static inline bool may_queue(struct rq_wb *rwb, struct rq_wait *rqw, > * Block if we will exceed our limit, or if we are currently waiting for > * the timer to kick off queuing again. > */ > -static void __wbt_wait(struct rq_wb *rwb, unsigned long rw, spinlock_t *lock) > +static void __wbt_wait(struct rq_wb *rwb, enum wbt_flags wb_acct, > + unsigned long rw, spinlock_t *lock) > __releases(lock) > __acquires(lock) > { > - struct rq_wait *rqw = get_rq_wait(rwb, current_is_kswapd()); > + struct rq_wait *rqw = get_rq_wait(rwb, wb_acct); > DEFINE_WAIT(wait); > > if (may_queue(rwb, rqw, &wait, rw)) > @@ -584,7 +589,7 @@ static inline bool wbt_should_throttle(struct rq_wb *rwb, struct bio *bio) > */ > enum wbt_flags wbt_wait(struct rq_wb *rwb, struct bio *bio, spinlock_t *lock) > { > - unsigned int ret = 0; > + enum wbt_flags ret = 0; > > if (!rwb_enabled(rwb)) > return 0; > @@ -598,14 +603,14 @@ enum wbt_flags wbt_wait(struct rq_wb *rwb, struct bio *bio, spinlock_t *lock) > return ret; > } > > - __wbt_wait(rwb, bio->bi_opf, lock); > + if (current_is_kswapd()) > + ret |= WBT_KSWAPD; > + > + __wbt_wait(rwb, ret, bio->bi_opf, lock); > > if (!blk_stat_is_active(rwb->cb)) > rwb_arm_timer(rwb); > > - if (current_is_kswapd()) > - ret |= WBT_KSWAPD; > - > return ret | WBT_TRACKED; > } > > diff --git a/block/blk-wbt.h b/block/blk-wbt.h > index a232c98fbf4d..8038b4a0d4ef 100644 > --- a/block/blk-wbt.h > +++ b/block/blk-wbt.h > @@ -19,7 +19,9 @@ enum wbt_flags { > }; > > enum { > - WBT_NUM_RWQ = 2, > + WBT_RWQ_BG = 0, > + WBT_RWQ_KSWAPD, > + WBT_NUM_RWQ, > }; > > /*
On Fri, Jan 11, 2019 at 12:23 PM Kleber Souza <kleber.souza@canonical.com> wrote: > > On 1/11/19 12:07 PM, Mauricio Faria de Oliveira wrote: [...] > > (cherry-picked from commit 8bea60901974ad44b06b08d52e1dd421ea8c6e9c) > > The correct string would be: > > (cherry picked from commit...) > > which is how 'git cherry-pick -x' adds it. > > No need to re-send, we can fix it when applying the patch. Oops, sorry! Wondering how I did that! :P '-sx' is what I usually do. Thanks, Kleber! > > > Thanks, > Kleber > > > Signed-off-by: Mauricio Faria de Oliveira <mfo@canonical.com> > > --- > > block/blk-wbt.c | 25 +++++++++++++++---------- > > block/blk-wbt.h | 4 +++- > > 2 files changed, 18 insertions(+), 11 deletions(-) > > > > diff --git a/block/blk-wbt.c b/block/blk-wbt.c > > index f92fc84b5e2c..4afa0ebb5953 100644 > > --- a/block/blk-wbt.c > > +++ b/block/blk-wbt.c > > @@ -101,9 +101,13 @@ static bool wb_recent_wait(struct rq_wb *rwb) > > return time_before(jiffies, wb->dirty_sleep + HZ); > > } > > > > -static inline struct rq_wait *get_rq_wait(struct rq_wb *rwb, bool is_kswapd) > > +static inline struct rq_wait *get_rq_wait(struct rq_wb *rwb, > > + enum wbt_flags wb_acct) > > { > > - return &rwb->rq_wait[is_kswapd]; > > + if (wb_acct & WBT_KSWAPD) > > + return &rwb->rq_wait[WBT_RWQ_KSWAPD]; > > + > > + return &rwb->rq_wait[WBT_RWQ_BG]; > > } > > > > static void rwb_wake_all(struct rq_wb *rwb) > > @@ -126,7 +130,7 @@ void __wbt_done(struct rq_wb *rwb, enum wbt_flags wb_acct) > > if (!(wb_acct & WBT_TRACKED)) > > return; > > > > - rqw = get_rq_wait(rwb, wb_acct & WBT_KSWAPD); > > + rqw = get_rq_wait(rwb, wb_acct); > > inflight = atomic_dec_return(&rqw->inflight); > > > > /* > > @@ -529,11 +533,12 @@ static inline bool may_queue(struct rq_wb *rwb, struct rq_wait *rqw, > > * Block if we will exceed our limit, or if we are currently waiting for > > * the timer to kick off queuing again. > > */ > > -static void __wbt_wait(struct rq_wb *rwb, unsigned long rw, spinlock_t *lock) > > +static void __wbt_wait(struct rq_wb *rwb, enum wbt_flags wb_acct, > > + unsigned long rw, spinlock_t *lock) > > __releases(lock) > > __acquires(lock) > > { > > - struct rq_wait *rqw = get_rq_wait(rwb, current_is_kswapd()); > > + struct rq_wait *rqw = get_rq_wait(rwb, wb_acct); > > DEFINE_WAIT(wait); > > > > if (may_queue(rwb, rqw, &wait, rw)) > > @@ -584,7 +589,7 @@ static inline bool wbt_should_throttle(struct rq_wb *rwb, struct bio *bio) > > */ > > enum wbt_flags wbt_wait(struct rq_wb *rwb, struct bio *bio, spinlock_t *lock) > > { > > - unsigned int ret = 0; > > + enum wbt_flags ret = 0; > > > > if (!rwb_enabled(rwb)) > > return 0; > > @@ -598,14 +603,14 @@ enum wbt_flags wbt_wait(struct rq_wb *rwb, struct bio *bio, spinlock_t *lock) > > return ret; > > } > > > > - __wbt_wait(rwb, bio->bi_opf, lock); > > + if (current_is_kswapd()) > > + ret |= WBT_KSWAPD; > > + > > + __wbt_wait(rwb, ret, bio->bi_opf, lock); > > > > if (!blk_stat_is_active(rwb->cb)) > > rwb_arm_timer(rwb); > > > > - if (current_is_kswapd()) > > - ret |= WBT_KSWAPD; > > - > > return ret | WBT_TRACKED; > > } > > > > diff --git a/block/blk-wbt.h b/block/blk-wbt.h > > index a232c98fbf4d..8038b4a0d4ef 100644 > > --- a/block/blk-wbt.h > > +++ b/block/blk-wbt.h > > @@ -19,7 +19,9 @@ enum wbt_flags { > > }; > > > > enum { > > - WBT_NUM_RWQ = 2, > > + WBT_RWQ_BG = 0, > > + WBT_RWQ_KSWAPD, > > + WBT_NUM_RWQ, > > }; > > > > /* > >
diff --git a/block/blk-wbt.c b/block/blk-wbt.c index f92fc84b5e2c..4afa0ebb5953 100644 --- a/block/blk-wbt.c +++ b/block/blk-wbt.c @@ -101,9 +101,13 @@ static bool wb_recent_wait(struct rq_wb *rwb) return time_before(jiffies, wb->dirty_sleep + HZ); } -static inline struct rq_wait *get_rq_wait(struct rq_wb *rwb, bool is_kswapd) +static inline struct rq_wait *get_rq_wait(struct rq_wb *rwb, + enum wbt_flags wb_acct) { - return &rwb->rq_wait[is_kswapd]; + if (wb_acct & WBT_KSWAPD) + return &rwb->rq_wait[WBT_RWQ_KSWAPD]; + + return &rwb->rq_wait[WBT_RWQ_BG]; } static void rwb_wake_all(struct rq_wb *rwb) @@ -126,7 +130,7 @@ void __wbt_done(struct rq_wb *rwb, enum wbt_flags wb_acct) if (!(wb_acct & WBT_TRACKED)) return; - rqw = get_rq_wait(rwb, wb_acct & WBT_KSWAPD); + rqw = get_rq_wait(rwb, wb_acct); inflight = atomic_dec_return(&rqw->inflight); /* @@ -529,11 +533,12 @@ static inline bool may_queue(struct rq_wb *rwb, struct rq_wait *rqw, * Block if we will exceed our limit, or if we are currently waiting for * the timer to kick off queuing again. */ -static void __wbt_wait(struct rq_wb *rwb, unsigned long rw, spinlock_t *lock) +static void __wbt_wait(struct rq_wb *rwb, enum wbt_flags wb_acct, + unsigned long rw, spinlock_t *lock) __releases(lock) __acquires(lock) { - struct rq_wait *rqw = get_rq_wait(rwb, current_is_kswapd()); + struct rq_wait *rqw = get_rq_wait(rwb, wb_acct); DEFINE_WAIT(wait); if (may_queue(rwb, rqw, &wait, rw)) @@ -584,7 +589,7 @@ static inline bool wbt_should_throttle(struct rq_wb *rwb, struct bio *bio) */ enum wbt_flags wbt_wait(struct rq_wb *rwb, struct bio *bio, spinlock_t *lock) { - unsigned int ret = 0; + enum wbt_flags ret = 0; if (!rwb_enabled(rwb)) return 0; @@ -598,14 +603,14 @@ enum wbt_flags wbt_wait(struct rq_wb *rwb, struct bio *bio, spinlock_t *lock) return ret; } - __wbt_wait(rwb, bio->bi_opf, lock); + if (current_is_kswapd()) + ret |= WBT_KSWAPD; + + __wbt_wait(rwb, ret, bio->bi_opf, lock); if (!blk_stat_is_active(rwb->cb)) rwb_arm_timer(rwb); - if (current_is_kswapd()) - ret |= WBT_KSWAPD; - return ret | WBT_TRACKED; } diff --git a/block/blk-wbt.h b/block/blk-wbt.h index a232c98fbf4d..8038b4a0d4ef 100644 --- a/block/blk-wbt.h +++ b/block/blk-wbt.h @@ -19,7 +19,9 @@ enum wbt_flags { }; enum { - WBT_NUM_RWQ = 2, + WBT_RWQ_BG = 0, + WBT_RWQ_KSWAPD, + WBT_NUM_RWQ, }; /*