Ping, Could you someone help to review this patch? Thanks Minfei On 09/10/15 at 04:09pm, Minfei Huang wrote: > From: Minfei Huang <mnfhuang@xxxxxxxxx> > > There is a buffer_head lru list cache in local cpu to accelerate the > speed. The LRU management algorithm is simple enough in > bh_lru_install(). > > There are three situtaions we should deal with. > 1) All/part of the lru cache is NULL. > 2) The new buffer_head hitts the lru cache. > 3) The new buffer_head does hit the lru cache. > > We put the new buffer_head at the head of lru cache, then copy the > buffer_head from the original lru cache, and drop the spare. > > Signed-off-by: Minfei Huang <mnfhuang@xxxxxxxxx> > --- > fs/buffer.c | 32 ++++++++++++++++++++------------ > 1 file changed, 20 insertions(+), 12 deletions(-) > > diff --git a/fs/buffer.c b/fs/buffer.c > index 1cf7a53..2139574 100644 > --- a/fs/buffer.c > +++ b/fs/buffer.c > @@ -1287,8 +1287,6 @@ static inline void check_irqs_on(void) > */ > static void bh_lru_install(struct buffer_head *bh) > { > - struct buffer_head *evictee = NULL; > - > check_irqs_on(); > bh_lru_lock(); > if (__this_cpu_read(bh_lrus.bhs[0]) != bh) { > @@ -1302,25 +1300,35 @@ static void bh_lru_install(struct buffer_head *bh) > struct buffer_head *bh2 = > __this_cpu_read(bh_lrus.bhs[in]); > > - if (bh2 == bh) { > + if (bh2 == NULL) { > + /* Rest value in bh_lrus.bhs always is NULL */ > + break; > + } else if (bh2 == bh) { > __brelse(bh2); > } else { > - if (out >= BH_LRU_SIZE) { > - BUG_ON(evictee != NULL); > - evictee = bh2; > + if (out == BH_LRU_SIZE) { > + /* > + * this condition will be happened, > + * only if none of entry in > + * bh_lrus.bhs hits the new bh, > + * so the last bh should be released. > + */ > + BUG_ON(in != BH_LRU_SIZE - 1); > + __brelse(bh2); > + break; > } else { > bhs[out++] = bh2; > } > } > } > - while (out < BH_LRU_SIZE) > - bhs[out++] = NULL; > - memcpy(this_cpu_ptr(&bh_lrus.bhs), bhs, sizeof(bhs)); > + /* > + * it is fine that the value out may be smaller than > + * BH_LRU_SIZE. The rest of the value in bh_lrus.bhs is NULL. > + */ > + memcpy(this_cpu_ptr(&bh_lrus.bhs), bhs, > + sizeof(struct buffer_head *) * out); > } > bh_lru_unlock(); > - > - if (evictee) > - __brelse(evictee); > } > > /* > -- > 2.1.0 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html