All of lore.kernel.org
 help / color / mirror / Atom feed
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;

             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.