From: Zhengyuan Liu <liuzhengyuang521@gmail.com>
To: "shli@kernel.org" <shli@kernel.org>, linux-raid@vger.kernel.org
Cc: 刘云 <liuyun01@kylinos.cn>, 胡海 <huhai@kylinos.cn>
Subject: [PATCH] raid5: fix incorrectly counter of conf->empty_inactive_list_nr
Date: Wed, 20 Jul 2016 17:22:00 +0800 [thread overview]
Message-ID: <CAOOPZo5B8EF0C3+Yg1WVYJx_jerR6zjNjbixpHhvQx4zOJqvxw@mail.gmail.com> (raw)
The counter conf->empty_inactive_list_nr is only used for determine if
the raid5 is congested which is deal with in function
raid5_congested(). It was increased in get_free_stripe() when
conf->inactive_list got emptied and decreased in
release_inactive_stripe_list() when splice temp_inactive_list to
conf->inactive_list. However, this could cause to problem when
raid5_get_active_stripe was called, this function may call
list_del_init(&sh->lru) to delete sh from "conf->inactive_list +
hash" which may cause "conf->inactive_list + hash" to be empty when
atomic_inc_not_zero(&sh->count) got false.
I have found conf->empty_inactive_list_nr to be negative number
during my random test.
Is there anything out of my thinking?
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -659,6 +659,7 @@ raid5_get_active_stripe(struct r5conf *conf,
sector_t sector,
{
struct stripe_head *sh;
int hash = stripe_hash_locks_hash(sector);
+ int inc_empty_inactive_list_flag;
pr_debug("get_stripe, sector %llu\n", (unsigned long long)sector);
@@ -703,7 +704,14 @@ raid5_get_active_stripe(struct r5conf *conf,
sector_t sector,
atomic_inc(&conf->active_stripes);
BUG_ON(list_empty(&sh->lru) &&
!test_bit(STRIPE_EXPANDING, &sh->state));
+
+ inc_empty_inactive_list_flag = 0;
+ if(!list_empty(conf->inactive_list + hash))
+ inc_empty_inactive_list_flag = 1;
list_del_init(&sh->lru);
+ if(list_empty(conf->inactive_list +
hash) && inc_empty_inactive_list_flag)
+
atomic_inc(&conf->empty_inactive_list_nr);
+
if (sh->group) {
sh->group->stripes_cnt--;
sh->group = NULL;
next reply other threads:[~2016-07-20 9:22 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-20 9:22 Zhengyuan Liu [this message]
2016-07-28 0:19 ` [PATCH] raid5: fix incorrectly counter of conf->empty_inactive_list_nr Shaohua Li
2016-07-28 6:22 ZhengYuan Liu
2016-07-30 21:02 ` Shaohua Li
2016-08-03 0:44 ` NeilBrown
2016-08-03 0:44 ` NeilBrown
2016-08-03 5:51 liuzhengyuan
2016-08-03 22:44 ` NeilBrown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAOOPZo5B8EF0C3+Yg1WVYJx_jerR6zjNjbixpHhvQx4zOJqvxw@mail.gmail.com \
--to=liuzhengyuang521@gmail.com \
--cc=huhai@kylinos.cn \
--cc=linux-raid@vger.kernel.org \
--cc=liuyun01@kylinos.cn \
--cc=shli@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.