From: Paolo Bonzini <pbonzini@redhat.com> To: "Michael S. Tsirkin" <mst@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, 04 Sep 2012 15:45:57 +0200 [thread overview] Message-ID: <50460615.3000006@redhat.com> (raw) In-Reply-To: <20120904133543.GF9805@redhat.com> Il 04/09/2012 15:35, Michael S. Tsirkin ha scritto: > 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. It seems more complicated to me for hardly any reason. (Besides, is it cheaper? It has one less memory barrier on some architectures I frankly do not care much about---not on x86---but it also has two memory accesses instead of one on all architectures). > Another simple idea: store last processor id in target, > if it is unchanged no need to play with req_vq > and take spinlock. Not so sure, consider the previous example with last_processor_id equal to 1. queuecommand on CPU #0 queuecommand #2 on CPU #1 -------------------------------------------------------------- atomic_inc_return(...) == 1 atomic_inc_return(...) == 2 virtscsi_queuecommand to queue #1 last_processor_id == 0? no spin_lock tgt->req_vq = queue #0 spin_unlock virtscsi_queuecommand to queue #0 This is not a network driver, there are still a lot of locks around. This micro-optimization doesn't pay enough for the pain. > 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. Because tgt->reqs will never become zero (which is a necessary condition for tgt->req_vq to change), as long as one request is executing virtscsi_queuecommand. Paolo
WARNING: multiple messages have this Message-ID (diff)
From: Paolo Bonzini <pbonzini@redhat.com> To: "Michael S. Tsirkin" <mst@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, 04 Sep 2012 15:45:57 +0200 [thread overview] Message-ID: <50460615.3000006@redhat.com> (raw) In-Reply-To: <20120904133543.GF9805@redhat.com> Il 04/09/2012 15:35, Michael S. Tsirkin ha scritto: > 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. It seems more complicated to me for hardly any reason. (Besides, is it cheaper? It has one less memory barrier on some architectures I frankly do not care much about---not on x86---but it also has two memory accesses instead of one on all architectures). > Another simple idea: store last processor id in target, > if it is unchanged no need to play with req_vq > and take spinlock. Not so sure, consider the previous example with last_processor_id equal to 1. queuecommand on CPU #0 queuecommand #2 on CPU #1 -------------------------------------------------------------- atomic_inc_return(...) == 1 atomic_inc_return(...) == 2 virtscsi_queuecommand to queue #1 last_processor_id == 0? no spin_lock tgt->req_vq = queue #0 spin_unlock virtscsi_queuecommand to queue #0 This is not a network driver, there are still a lot of locks around. This micro-optimization doesn't pay enough for the pain. > 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. Because tgt->reqs will never become zero (which is a necessary condition for tgt->req_vq to change), as long as one request is executing virtscsi_queuecommand. Paolo
next prev parent reply other threads:[~2012-09-04 13: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 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 [this message] 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=50460615.3000006@redhat.com \ --to=pbonzini@redhat.com \ --cc=axboe@kernel.dk \ --cc=hch@lst.de \ --cc=jasowang@redhat.com \ --cc=kvm@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-scsi@vger.kernel.org \ --cc=mst@redhat.com \ --cc=nab@linux-iscsi.org \ --cc=rusty@rustcorp.com.au \ --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: linkBe 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.