From: Paolo Bonzini <pbonzini@redhat.com>
To: Ming Lei <tom.leiming@gmail.com>
Cc: Linux SCSI List <linux-scsi@vger.kernel.org>,
Wanlong Gao <gaowanlong@cn.fujitsu.com>,
Asias He <asias@redhat.com>,
"James E.J. Bottomley" <JBottomley@parallels.com>,
Rusty Russell <rusty@rustcorp.com.au>
Subject: Re: virtio-scsi: two questions related with picking up queue
Date: Wed, 07 May 2014 09:10:29 +0200 [thread overview]
Message-ID: <5369DC65.5030207@redhat.com> (raw)
In-Reply-To: <CACVXFVMfrfMdpM20SCcxnVZXDUuzAhtLATm9MX_Oq5p36bagUg@mail.gmail.com>
Il 07/05/2014 03:07, Ming Lei ha scritto:
> Hi Paolo,
>
> On Tue, May 6, 2014 at 9:17 PM, Paolo Bonzini <pbonzini@redhat.com> wrote:
>> Il 06/05/2014 11:26, Ming Lei ha scritto:
>>
>>> Hi Paolo and All,
>>>
>>> One question is about ACCESS_ONCE() in virtscsi_pick_vq(),
>>> looks it needn't since both reading and writing tgt->req_vq holds
>>> tgt->tgt_lock.
>>
>>
>> You're right. It should be possible to avoid the lock in virtscsi_pick_vq
>> like this:
>>
>> value = atomic_read(&tgt->reqs);
>
> I am wondering if atomic_read() is OK because atomic_read()
> should be treated as a simple C statement, and it may not reflect
> the latest value of tgt->reqs.
It would be caught by cmpxchg below.
>> retry:
>> if (value != 0) {
>> old_value = atomic_cmpxchg(&tgt->regs, value, value + 1)
>> if (old_value != value) {
>
> Maybe ' if (old_value != value && !old_value) ' is a bit better.
No, because if you have failed the cmpxchg you haven't incremented
tgt->reqs.
>> value = old_value;
>> goto retry;
>> }
>>
>> vq = ACCESS_ONCE(tgt->req_vq);
>> } else {
>> spin_lock_irqsave(&tgt->tgt_lock, flags);
>>
>> // tgt->reqs may not be 0 anymore, need to recheck
>> value = atomic_read(&tgt->reqs);
>> if (atomic_read(&tgt->reqs) != 0) {
>> spin_unlock_irqrestore(&tgt->tgt_lock, flags);
>> goto retry;
>> }
>
> Same with above, if atomic_read() still returns zero even
> after it is increased in read path from another CPU, then
> an obsolete vq pointer might be seen in the read path.
If I understand you correctly, then the CPUs wouldn't be cache-coherent.
You would have bigger problems.
>>
>> // tgt->reqs now will remain fixed to 0.
>> ...
>> tgt->req_vq = vq = ...;
>> smp_wmb();
>> atomic_set(&tgt->reqs, 1);
>> spin_unlock_irqrestore(&tgt->tgt_lock, flags);
>> }
>>
>> return vq;
>>
>> and then you would need the ACCESS_ONCE but I'm not sure it's worthwhile.
>>
>
> Yes, I agree, :-)
>
>>
>>> Another one is about the comment in virtscsi_req_done(), which
>>> said smp_read_barrier_depends() is needed for avoiding
>>> out of order between reading req_vq and decreasing tgt->reqs.
>>> But if I understand correctly, in virtscsi_req_done(), req_vq is
>>> read from vscsi->req_vqs[vq->index - VIRTIO_SCSI_VQ_BASE],
>>> instead of tgt->req_vq, and the former won't change wrt.
>>> inc/dec tgt->reqs, so can the barrier be removed?
>>
>>
>> Right. The comment is obsolete and dates to before vq->index existed.
>
> OK, I will cook a patch to remove the barrier and cleanup the comment.
Thanks. Please remove the ACCESS_ONCE too.
Paolo
next prev parent reply other threads:[~2014-05-07 7:10 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-06 9:26 virtio-scsi: two questions related with picking up queue Ming Lei
2014-05-06 13:17 ` Paolo Bonzini
2014-05-07 1:07 ` Ming Lei
2014-05-07 7:10 ` Paolo Bonzini [this message]
2014-05-07 16:24 ` Ming Lei
2014-05-07 16:43 ` Paolo Bonzini
2014-05-08 10:44 ` Ming Lei
2014-05-08 12:17 ` Paolo Bonzini
2014-05-08 12:55 ` Ming Lei
2014-05-08 13:21 ` Paolo Bonzini
2014-05-08 14:00 ` Ming Lei
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=5369DC65.5030207@redhat.com \
--to=pbonzini@redhat.com \
--cc=JBottomley@parallels.com \
--cc=asias@redhat.com \
--cc=gaowanlong@cn.fujitsu.com \
--cc=linux-scsi@vger.kernel.org \
--cc=rusty@rustcorp.com.au \
--cc=tom.leiming@gmail.com \
/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.