Thread (34 messages) 34 messages, 7 authors, 2012-09-06

Re: [PATCH 5/5] virtio-scsi: introduce multiqueue support

flat view

From: Michael S. Tsirkin <mst@redhat.com>
Date: 2012-09-04 13:34:40
Also in: kvm, linux-scsi, lkml

On Tue, Sep 04, 2012 at 01:18:31PM +0200, Paolo Bonzini wrote:
Il 04/09/2012 13:09, Michael S. Tsirkin ha scritto:
quoted
quoted
quoted
    queuecommand on CPU #0         queuecommand #2 on CPU #1
  --------------------------------------------------------------
    atomic_inc_return(...) == 1
                                   atomic_inc_return(...) == 2
                                   virtscsi_queuecommand to queue #1
    tgt->req_vq = queue #0
    virtscsi_queuecommand to queue #0

then two requests are issued to different queues without a quiescent
point in the middle.
What happens then? Does this break correctness?
Yes, requests to the same target should be processed in FIFO order, or
you have things like a flush issued before the write it was supposed to
flush.  This is why I can only change the queue when there is no request
pending.

Paolo
I see.  I guess you can rewrite this as:
atomic_inc
if (atomic_read() == 1)
which is a bit cheaper, and make the fact
that you do not need increment and return to be atomic,
explicit.

Another simple idea: store last processor id in target,
if it is unchanged no need to play with req_vq
and take spinlock.

Also - some kind of comment explaining why a similar race can not happen
with this lock in place would be nice: I see why this specific race can
not trigger but since lock is dropped later before you submit command, I
have hard time convincing myself what exactly gurantees that vq is never
switched before or even while command is submitted.




-- 
MST
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help