From: Bob Liu <bob.liu@oracle.com>
To: "Roger Pau Monné" <roger.pau@citrix.com>
Cc: xen-devel@lists.xen.org, konrad.wilk@oracle.com,
linux-kernel@vger.kernel.org, david.vrabel@citrix.com,
junxiao.bi@oracle.com
Subject: Re: [PATCH] xen/blkfront: restart request queue when there is enough persistent_gnts_c
Date: Tue, 13 Jan 2015 17:50:55 +0800 [thread overview]
Message-ID: <54B4EA7F.1060601@oracle.com> (raw)
In-Reply-To: <54B3B1B7.40700@citrix.com>
On 01/12/2015 07:36 PM, Roger Pau Monné wrote:
> El 12/01/15 a les 8.09, Bob Liu ha escrit:
>>
>> On 01/09/2015 11:51 PM, Roger Pau Monné wrote:
>>> El 06/01/15 a les 14.19, Bob Liu ha escrit:
>>>> When there is no enough free grants, gnttab_alloc_grant_references()
>>>> will fail and block request queue will stop.
>>>> If the system is always lack of grants, blkif_restart_queue_callback() can't be
>>>> scheduled and block request queue can't be restart(block I/O hang).
>>>>
>>>> But when there are former requests complete, some grants may free to
>>>> persistent_gnts_c, we can give the request queue another chance to restart and
>>>> avoid block hang.
>>>>
>>>> Reported-by: Junxiao Bi <junxiao.bi@oracle.com>
>>>> Signed-off-by: Bob Liu <bob.liu@oracle.com>
>>>> ---
>>>> drivers/block/xen-blkfront.c | 11 +++++++++++
>>>> 1 file changed, 11 insertions(+)
>>>>
>>>> diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
>>>> index 2236c6f..dd30f99 100644
>>>> --- a/drivers/block/xen-blkfront.c
>>>> +++ b/drivers/block/xen-blkfront.c
>>>> @@ -1125,6 +1125,17 @@ static void blkif_completion(struct blk_shadow *s, struct blkfront_info *info,
>>>> }
>>>> }
>>>> }
>>>> +
>>>> + /*
>>>> + * Request queue would be stopped if failed to alloc enough grants and
>>>> + * won't be restarted until gnttab_free_count >= info->callback->count.
>>>> + *
>>>> + * But there is another case, once we have enough persistent grants we
>>>> + * can try to restart the request queue instead of continue to wait for
>>>> + * 'gnttab_free_count'.
>>>> + */
>>>> + if (info->persistent_gnts_c >= info->callback.count)
>>>> + schedule_work(&info->work);
>>>
>>> I guess I'm missing something here, but blkif_completion is called by
>>> blkif_interrupt, which in turn calls kick_pending_request_queues when
>>> finished, which IMHO should be enough to restart the processing of requests.
>>>
>>
>> You are right, sorry for the mistake.
>>
>> The problem we met was a xenblock I/O hang.
>> Dumped data showed at that time info->persistent_gnt_c = 8, max_gref = 8
>> but block request queue was still stopped.
>> It's very hard to reproduce this issue, we only see it once.
>>
>> I think there might be a race condition:
>>
>> request A request B:
>>
>> info->persistent_gnts_c < max_grefs
>> and fail to alloc enough grants
>>
>>
>> ^^^^
>> interrupt happen, blkif_complte():
>> info->persistent_gnts_c++
>> kick_pending_request_queues()
>>
>> stop block request queue
>> added to callback list
>>
>> If the system don't have enough grants(but have enough persistent_gnts),
>> request queue would still hang.
>
> Not sure how can this happen, blkif_queue_request explicitly checks that
> persistent_gnts_c < max_grefs before adding the callback and stopping
> the request queue, so in your case the queue should not be blocked. Can
> you dump the state of info->connected?
>
All virtual disks are in "connected" status. And you are right this race
condition won't happen. I'll dump more data if see this issue again.
Thanks,
-Bob
next prev parent reply other threads:[~2015-01-13 9:51 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-06 13:19 [PATCH] xen/blkfront: restart request queue when there is enough persistent_gnts_c Bob Liu
2015-01-09 15:51 ` Roger Pau Monné
2015-01-09 15:51 ` Roger Pau Monné
2015-01-12 7:06 ` Bob Liu
2015-01-12 7:06 ` Bob Liu
2015-01-12 7:09 ` Bob Liu
2015-01-12 7:09 ` Bob Liu
2015-01-12 11:36 ` Roger Pau Monné
2015-01-12 13:04 ` David Vrabel
2015-01-12 13:04 ` David Vrabel
2015-01-12 15:14 ` Roger Pau Monné
2015-01-12 15:14 ` Roger Pau Monné
2015-01-13 9:49 ` Bob Liu
2015-01-13 9:49 ` Bob Liu
2015-01-13 9:50 ` Bob Liu
2015-01-13 9:50 ` Bob Liu [this message]
2015-01-12 11:36 ` Roger Pau Monné
-- strict thread matches above, loose matches on Subject: below --
2015-01-06 13:19 Bob Liu
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=54B4EA7F.1060601@oracle.com \
--to=bob.liu@oracle.com \
--cc=david.vrabel@citrix.com \
--cc=junxiao.bi@oracle.com \
--cc=konrad.wilk@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=roger.pau@citrix.com \
--cc=xen-devel@lists.xen.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.