From: "Michael S. Tsirkin" <mst@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: Jens Axboe <axboe@kernel.dk>,
linux-scsi@vger.kernel.org, kvm@vger.kernel.org,
linux-kernel@vger.kernel.org,
virtualization@lists.linux-foundation.org,
target-devel <target-devel@vger.kernel.org>,
Christoph Hellwig <hch@lst.de>
Subject: Re: [PATCH 5/5] virtio-scsi: introduce multiqueue support
Date: Tue, 4 Sep 2012 11:46:28 +0300 [thread overview]
Message-ID: <20120904084628.GA8437@redhat.com> (raw)
In-Reply-To: <5045A3B4.2030101@redhat.com>
On Tue, Sep 04, 2012 at 08:46:12AM +0200, Paolo Bonzini wrote:
> Il 04/09/2012 04:21, Nicholas A. Bellinger ha scritto:
> >> @@ -112,6 +118,9 @@ static void virtscsi_complete_cmd(struct virtio_scsi *vscsi, void *buf)
> >> struct virtio_scsi_cmd *cmd = buf;
> >> struct scsi_cmnd *sc = cmd->sc;
> >> struct virtio_scsi_cmd_resp *resp = &cmd->resp.cmd;
> >> + struct virtio_scsi_target_state *tgt = vscsi->tgt[sc->device->id];
> >> +
> >> + atomic_dec(&tgt->reqs);
> >>
> >
> > As tgt->tgt_lock is taken in virtscsi_queuecommand_multi() before the
> > atomic_inc_return(tgt->reqs) check, it seems like using atomic_dec() w/o
> > smp_mb__after_atomic_dec or tgt_lock access here is not using atomic.h
> > accessors properly, no..?
>
> No, only a single "thing" is being accessed, and there is no need to
> order the decrement with respect to preceding or subsequent accesses to
> other locations.
>
> In other words, tgt->reqs is already synchronized with itself, and that
> is enough.
I think your logic is correct and barrier is not needed,
but this needs better documentation.
> (Besides, on x86 smp_mb__after_atomic_dec is a nop).
> >> +static int virtscsi_queuecommand_multi(struct Scsi_Host *sh,
> >> + struct scsi_cmnd *sc)
> >> +{
> >> + struct virtio_scsi *vscsi = shost_priv(sh);
> >> + struct virtio_scsi_target_state *tgt = vscsi->tgt[sc->device->id];
> >> + unsigned long flags;
> >> + u32 queue_num;
> >> +
> >> + /* Using an atomic_t for tgt->reqs lets the virtqueue handler
> >> + * decrement it without taking the spinlock.
> >> + */
Above comment is not really helpful - reader can be safely assumed to
know what atomic_t is.
Please delete, and replace with the text from commit log
that explains the heuristic used to select req_vq.
Also please add a comment near 'reqs' definition.
Something like "number of outstanding requests - used to detect idle
target".
> >> + spin_lock_irqsave(&tgt->tgt_lock, flags);
Looks like this lock can be removed - req_vq is only
modified when target is idle and only used when it is
not idle.
> >> + if (atomic_inc_return(&tgt->reqs) == 1) {
> >> + queue_num = smp_processor_id();
> >> + while (unlikely(queue_num >= vscsi->num_queues))
> >> + queue_num -= vscsi->num_queues;
> >> + tgt->req_vq = &vscsi->req_vqs[queue_num];
> >> + }
> >> + spin_unlock_irqrestore(&tgt->tgt_lock, flags);
> >> + return virtscsi_queuecommand(vscsi, tgt, sc);
> >> +}
> >> +
> >> +
.....
> >> +static int virtscsi_queuecommand_single(struct Scsi_Host *sh,
> >> + struct scsi_cmnd *sc)
> >> +{
> >> + struct virtio_scsi *vscsi = shost_priv(sh);
> >> + struct virtio_scsi_target_state *tgt = vscsi->tgt[sc->device->id];
> >> +
> >> + atomic_inc(&tgt->reqs);
> >> + return virtscsi_queuecommand(vscsi, tgt, sc);
> >> +}
> >> +
Here, reqs is unused - why bother incrementing it?
A branch on completion would be cheaper IMHO.
>virtio-scsi multiqueue has a performance benefit up to 20%
To be fair, you could be running in single queue mode.
In that case extra atomics and indirection that this code
brings will just add overhead without benefits.
I don't know how significant would that be.
--
MST
WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Nicholas A. Bellinger" <nab@linux-iscsi.org>,
linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org,
kvm@vger.kernel.org, rusty@rustcorp.com.au, jasowang@redhat.com,
virtualization@lists.linux-foundation.org,
Christoph Hellwig <hch@lst.de>, Jens Axboe <axboe@kernel.dk>,
target-devel <target-devel@vger.kernel.org>
Subject: Re: [PATCH 5/5] virtio-scsi: introduce multiqueue support
Date: Tue, 4 Sep 2012 11:46:28 +0300 [thread overview]
Message-ID: <20120904084628.GA8437@redhat.com> (raw)
In-Reply-To: <5045A3B4.2030101@redhat.com>
On Tue, Sep 04, 2012 at 08:46:12AM +0200, Paolo Bonzini wrote:
> Il 04/09/2012 04:21, Nicholas A. Bellinger ha scritto:
> >> @@ -112,6 +118,9 @@ static void virtscsi_complete_cmd(struct virtio_scsi *vscsi, void *buf)
> >> struct virtio_scsi_cmd *cmd = buf;
> >> struct scsi_cmnd *sc = cmd->sc;
> >> struct virtio_scsi_cmd_resp *resp = &cmd->resp.cmd;
> >> + struct virtio_scsi_target_state *tgt = vscsi->tgt[sc->device->id];
> >> +
> >> + atomic_dec(&tgt->reqs);
> >>
> >
> > As tgt->tgt_lock is taken in virtscsi_queuecommand_multi() before the
> > atomic_inc_return(tgt->reqs) check, it seems like using atomic_dec() w/o
> > smp_mb__after_atomic_dec or tgt_lock access here is not using atomic.h
> > accessors properly, no..?
>
> No, only a single "thing" is being accessed, and there is no need to
> order the decrement with respect to preceding or subsequent accesses to
> other locations.
>
> In other words, tgt->reqs is already synchronized with itself, and that
> is enough.
I think your logic is correct and barrier is not needed,
but this needs better documentation.
> (Besides, on x86 smp_mb__after_atomic_dec is a nop).
> >> +static int virtscsi_queuecommand_multi(struct Scsi_Host *sh,
> >> + struct scsi_cmnd *sc)
> >> +{
> >> + struct virtio_scsi *vscsi = shost_priv(sh);
> >> + struct virtio_scsi_target_state *tgt = vscsi->tgt[sc->device->id];
> >> + unsigned long flags;
> >> + u32 queue_num;
> >> +
> >> + /* Using an atomic_t for tgt->reqs lets the virtqueue handler
> >> + * decrement it without taking the spinlock.
> >> + */
Above comment is not really helpful - reader can be safely assumed to
know what atomic_t is.
Please delete, and replace with the text from commit log
that explains the heuristic used to select req_vq.
Also please add a comment near 'reqs' definition.
Something like "number of outstanding requests - used to detect idle
target".
> >> + spin_lock_irqsave(&tgt->tgt_lock, flags);
Looks like this lock can be removed - req_vq is only
modified when target is idle and only used when it is
not idle.
> >> + if (atomic_inc_return(&tgt->reqs) == 1) {
> >> + queue_num = smp_processor_id();
> >> + while (unlikely(queue_num >= vscsi->num_queues))
> >> + queue_num -= vscsi->num_queues;
> >> + tgt->req_vq = &vscsi->req_vqs[queue_num];
> >> + }
> >> + spin_unlock_irqrestore(&tgt->tgt_lock, flags);
> >> + return virtscsi_queuecommand(vscsi, tgt, sc);
> >> +}
> >> +
> >> +
.....
> >> +static int virtscsi_queuecommand_single(struct Scsi_Host *sh,
> >> + struct scsi_cmnd *sc)
> >> +{
> >> + struct virtio_scsi *vscsi = shost_priv(sh);
> >> + struct virtio_scsi_target_state *tgt = vscsi->tgt[sc->device->id];
> >> +
> >> + atomic_inc(&tgt->reqs);
> >> + return virtscsi_queuecommand(vscsi, tgt, sc);
> >> +}
> >> +
Here, reqs is unused - why bother incrementing it?
A branch on completion would be cheaper IMHO.
>virtio-scsi multiqueue has a performance benefit up to 20%
To be fair, you could be running in single queue mode.
In that case extra atomics and indirection that this code
brings will just add overhead without benefits.
I don't know how significant would that be.
--
MST
next prev parent reply other threads:[~2012-09-04 8:46 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-28 11:54 [PATCH 0/5] Multiqueue virtio-scsi Paolo Bonzini
2012-08-28 11:54 ` Paolo Bonzini
2012-08-28 11:54 ` [PATCH 1/5] virtio-ring: move queue_index to vring_virtqueue Paolo Bonzini
2012-08-28 11:54 ` Paolo Bonzini
2012-08-29 7:54 ` Jason Wang
2012-08-29 7:54 ` Jason Wang
2012-09-05 23:32 ` Rusty Russell
2012-09-05 23:32 ` Rusty Russell
2012-08-28 11:54 ` [PATCH 2/5] virtio: introduce an API to set affinity for a virtqueue Paolo Bonzini
2012-08-28 11:54 ` Paolo Bonzini
2012-09-05 23:32 ` Rusty Russell
2012-09-05 23:32 ` Rusty Russell
2012-08-28 11:54 ` [PATCH 3/5] virtio-scsi: allocate target pointers in a separate memory block Paolo Bonzini
2012-08-28 11:54 ` Paolo Bonzini
2012-08-28 14:07 ` Sasha Levin
2012-08-28 14:07 ` Sasha Levin
2012-08-28 14:25 ` Paolo Bonzini
2012-08-28 14:25 ` Paolo Bonzini
2012-08-28 11:54 ` [PATCH 4/5] virtio-scsi: pass struct virtio_scsi to virtqueue completion function Paolo Bonzini
2012-08-28 11:54 ` Paolo Bonzini
2012-08-28 11:54 ` [PATCH 5/5] virtio-scsi: introduce multiqueue support Paolo Bonzini
2012-08-28 11:54 ` Paolo Bonzini
2012-09-04 2:21 ` Nicholas A. Bellinger
2012-09-04 2:21 ` Nicholas A. Bellinger
2012-09-04 6:46 ` Paolo Bonzini
2012-09-04 6:46 ` Paolo Bonzini
2012-09-04 8:46 ` Michael S. Tsirkin [this message]
2012-09-04 8:46 ` Michael S. Tsirkin
2012-09-04 10:25 ` Paolo Bonzini
2012-09-04 10:25 ` Paolo Bonzini
2012-09-04 11:09 ` Michael S. Tsirkin
2012-09-04 11:09 ` Michael S. Tsirkin
2012-09-04 11:18 ` Paolo Bonzini
2012-09-04 11:18 ` Paolo Bonzini
2012-09-04 13:35 ` Michael S. Tsirkin
2012-09-04 13:35 ` Michael S. Tsirkin
2012-09-04 13:45 ` Paolo Bonzini
2012-09-04 13:45 ` Paolo Bonzini
2012-09-04 14:19 ` Michael S. Tsirkin
2012-09-04 14:19 ` Michael S. Tsirkin
2012-09-04 14:25 ` Paolo Bonzini
2012-09-04 14:25 ` Paolo Bonzini
2012-09-04 20:11 ` Nicholas A. Bellinger
2012-09-04 20:11 ` Nicholas A. Bellinger
2012-09-05 7:03 ` Paolo Bonzini
2012-09-05 7:03 ` Paolo Bonzini
2012-09-04 12:48 ` Michael S. Tsirkin
2012-09-04 12:48 ` Michael S. Tsirkin
2012-09-04 13:49 ` Paolo Bonzini
2012-09-04 13:49 ` Paolo Bonzini
2012-09-04 14:21 ` Michael S. Tsirkin
2012-09-04 14:21 ` Michael S. Tsirkin
2012-09-04 14:30 ` Paolo Bonzini
2012-09-04 14:30 ` Paolo Bonzini
2012-09-04 14:41 ` Michael S. Tsirkin
2012-09-04 14:41 ` Michael S. Tsirkin
2012-09-04 14:47 ` Michael S. Tsirkin
2012-09-04 14:47 ` Michael S. Tsirkin
2012-09-04 14:55 ` Paolo Bonzini
2012-09-04 14:55 ` Paolo Bonzini
2012-09-04 15:03 ` Michael S. Tsirkin
2012-09-04 15:03 ` Michael S. Tsirkin
2012-08-30 7:13 ` [PATCH 0/5] Multiqueue virtio-scsi Stefan Hajnoczi
2012-08-30 7:13 ` Stefan Hajnoczi
2012-08-30 14:53 ` Michael S. Tsirkin
2012-08-30 14:53 ` Michael S. Tsirkin
2012-08-30 15:45 ` Paolo Bonzini
2012-08-30 15:45 ` Paolo Bonzini
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=20120904084628.GA8437@redhat.com \
--to=mst@redhat.com \
--cc=axboe@kernel.dk \
--cc=hch@lst.de \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=target-devel@vger.kernel.org \
--cc=virtualization@lists.linux-foundation.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.