From: Zhou Jie <zhoujie2011@cn.fujitsu.com>
To: Alex Williamson <alex.williamson@redhat.com>
Cc: <fan.chen@easystack.cn>, <linux-kernel@vger.kernel.org>,
<qemu-devel@nongnu.org>, Chen Fan <chen.fan.fnst@cn.fujitsu.com>,
<izumi.taku@jp.fujitsu.com>
Subject: Re: [Qemu-devel] [PATCH v2 2/2] vfio : add aer process
Date: Tue, 2 Aug 2016 09:22:35 +0800 [thread overview]
Message-ID: <aba2b6c3-eac1-5a5c-5f75-de1d9deadab9@cn.fujitsu.com> (raw)
In-Reply-To: <20160801093649.69c44e89@t450s.home>
Hi, Alex
>>> Clearly this has only been tested for a single instance of an AER error
>>> event and resume per device. Are the things you're intending to block
>>> actually blocked for subsequent events? Note how complete_all() fills
>>> the done field to let all current and future waiters go through and
>>> nowhere is there a call to reinit_completion() to drain that path.
>>> Thanks,
>>>
>>> Alex
>>
>> Do you mean this condition?
>>
>> For device 1:
>> error1 occurs ---- error1 resumes
>> error2 occurs ---- error2 resumes
>> error3 occurs ---- error3 resumes
>>
>> In current code, I do complete_all() when error1 resumes.
>> And this will unblock the device
>> when error2 and error3 are still be processed.
>
> So walk me through how this works. On vfio_pci_open() we call
> init_completion(), which sets aer_error_completion.done equal to zero
> (BTW, a user can open the device file descriptor multiple times, so
> there's already a bug here).
I will call init_completion() in vfio_pci_probe.
> Let's assume that an error occurs and the
> user stalls a single access on wait_for_completion_interruptible().
> The bulk of this function happens here:
>
> static inline long __sched
> do_wait_for_common(struct completion *x,
> long (*action)(long), long timeout, int state)
> {
> if (!x->done) {
> DECLARE_WAITQUEUE(wait, current);
>
> __add_wait_queue_tail_exclusive(&x->wait, &wait);
> do {
> if (signal_pending_state(state, current)) {
> timeout = -ERESTARTSYS;
> break;
> }
> __set_current_state(state);
> spin_unlock_irq(&x->wait.lock);
> timeout = action(timeout);
> spin_lock_irq(&x->wait.lock);
> } while (!x->done && timeout);
> __remove_wait_queue(&x->wait, &wait);
> if (!x->done)
> return timeout;
> }
> x->done--;
> return timeout ?: 1;
> }
>
> So it waits within that do{}while loop for a completion, interruption,
> or timeout. Then we have:
>
> void complete_all(struct completion *x)
> {
> unsigned long flags;
>
> spin_lock_irqsave(&x->wait.lock, flags);
> x->done += UINT_MAX/2;
> __wake_up_locked(&x->wait, TASK_NORMAL, 0);
> spin_unlock_irqrestore(&x->wait.lock, flags);
> }
>
> So aer_error_completion.done gets incremented to let a couple billion
> completion waiters through... Show me how another call to
> wait_for_completion_interruptible() will ever block again within our
> lifetime when the actual wait of do_wait_for_common() is only entered
> when 'done' count is equal to zero. This seems to be why
> reinit_completion() exists, but it's not used here. Thanks,
>
> Alex
I will call reinit_completion() in vfio_pci_aer_err_detected when
an aer error is detected.
Thank you very much.
Sincerely
ZhouJie
prev parent reply other threads:[~2016-08-02 1:23 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-19 7:32 [PATCH v2 0/2] vfio: " Zhou Jie
2016-07-19 7:32 ` [PATCH v2 1/2] vfio : resume notifier Zhou Jie
2016-07-19 7:39 ` Chen Fan
2016-07-19 7:32 ` [PATCH v2 2/2] vfio : add aer process Zhou Jie
2016-07-29 17:12 ` [Qemu-devel] " Alex Williamson
2016-08-01 2:14 ` Zhou Jie
2016-08-01 15:36 ` Alex Williamson
2016-08-02 1:22 ` Zhou Jie [this message]
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=aba2b6c3-eac1-5a5c-5f75-de1d9deadab9@cn.fujitsu.com \
--to=zhoujie2011@cn.fujitsu.com \
--cc=alex.williamson@redhat.com \
--cc=chen.fan.fnst@cn.fujitsu.com \
--cc=fan.chen@easystack.cn \
--cc=izumi.taku@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=qemu-devel@nongnu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®