From: "Michael S. Tsirkin" <mst@redhat.com>
To: "Boyer, Andrew" <Andrew.Boyer@amd.com>
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>,
Jason Wang <jasowang@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Stefan Hajnoczi <stefanha@redhat.com>,
Eugenio Perez <eperezma@redhat.com>,
Xuan Zhuo <xuanzhuo@linux.alibaba.com>,
Jens Axboe <axboe@kernel.dk>,
"virtualization@lists.linux.dev" <virtualization@lists.linux.dev>,
"linux-block@vger.kernel.org" <linux-block@vger.kernel.org>,
"Nelson, Shannon" <Shannon.Nelson@amd.com>,
"Creeley, Brett" <Brett.Creeley@amd.com>,
"Hubbe, Allen" <Allen.Hubbe@amd.com>
Subject: Re: [PATCH] virtio_blk: always post notifications under the lock
Date: Thu, 23 Jan 2025 02:23:17 -0500 [thread overview]
Message-ID: <20250123022305-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <CF92E813-EE94-4F61-A8A9-278CA1BD3629@amd.com>
On Wed, Jan 22, 2025 at 10:34:25PM +0000, Boyer, Andrew wrote:
>
> > On Jan 22, 2025, at 5:25 PM, Michael S. Tsirkin <mst@redhat.com> wrote:
> >
> > Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding.
> >
> >
> > On Wed, Jan 22, 2025 at 10:14:52PM +0000, Boyer, Andrew wrote:
> >>
> >>> On Jan 22, 2025, at 5:07 PM, Michael S. Tsirkin <mst@redhat.com> wrote:
> >>>
> >>> Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding.
> >>>
> >>>
> >>> On Wed, Jan 22, 2025 at 06:33:04PM +0100, Christian Borntraeger wrote:
> >>>> Am 22.01.25 um 15:44 schrieb Boyer, Andrew:
> >>>> [...]
> >>>>
> >>>>>>>> --- a/drivers/block/virtio_blk.c
> >>>>>>>> +++ b/drivers/block/virtio_blk.c
> >>>>>>>> @@ -379,14 +379,10 @@ static void virtio_commit_rqs(struct blk_mq_hw_ctx *hctx)
> >>>>>>>> {
> >>>>>>>> struct virtio_blk *vblk = hctx->queue->queuedata;
> >>>>>>>> struct virtio_blk_vq *vq = &vblk->vqs[hctx->queue_num];
> >>>>>>>> - bool kick;
> >>>>>>>> spin_lock_irq(&vq->lock);
> >>>>>>>> - kick = virtqueue_kick_prepare(vq->vq);
> >>>>>>>> + virtqueue_kick(vq->vq);
> >>>>>>>> spin_unlock_irq(&vq->lock);
> >>>>>>>> -
> >>>>>>>> - if (kick)
> >>>>>>>> - virtqueue_notify(vq->vq);
> >>>>>>>> }
> >>>>>>>
> >>>>>>> I would assume this will be a performance nightmare for normal IO.
> >>>>>>
> >>>>>
> >>>>> Hello Michael and Christian and Jason,
> >>>>> Thank you for taking a look.
> >>>>>
> >>>>> Is the performance concern that the vmexit might lead to the underlying virtual storage stack doing the work immediately? Any other job posting to the same queue would presumably be blocked on a vmexit when it goes to attempt its own notification. That would be almost the same as having the other job block on a lock during the operation, although I guess if you are skipping notifications somehow it would look different.
> >>>>
> >>>> The performance concern is that you hold a lock and then exit. Exits are expensive and can schedule so you will increase the lock holding time significantly. This is begging for lock holder preemption.
> >>>> Really, dont do it.
> >>>
> >>>
> >>> The issue is with hardware that wants a copy of an index sent to
> >>> it in a notification. Now, you have a race:
> >>>
> >>> thread 1:
> >>>
> >>> index = 1
> >>> -> -> send 1 to hardware
> >>>
> >>>
> >>> thread 2:
> >>>
> >>> index = 2
> >>> -> send 2 to hardware
> >>>
> >>> the spec unfortunately does not say whether that is legal.
> >>>
> >>> As far as I could tell, the device can easily use the
> >>> wrap counter inside the notification to detect this
> >>> and simply discard the "1" notification.
> >>>
> >>>
> >>> If not, I'd like to understand why.
> >>
> >> "Easily"?
> >>
> >> This is a hardware doorbell block used for many different interfaces and devices. When the notification write comes through, the doorbell block updates the queue state and schedules the queue for work. If a second notification comes in and overwrites that update before the queue is able to run (going backwards but not wrapping), we'll have no way of detecting it.
> >>
> >> -Andrew
> >>
> >
> > Does not this work?
> >
> > notification includes two values:
> >
> > 1. offset
> > 2. wrap_counter
> >
> > if ((offset2 < offset1 && wrap_counter2 == wrap_counter1) ||
> > offset1 > offset1 && wrap_counter2 != wrap_counter1)) {
> > printf("going backwards, discard offset2");
> > }
> >
>
> No, Michael, this does not work in our programmable hardware device, because it is not software.
>
> -Andrew
>
Of course. The hardware equivalent.
next prev parent reply other threads:[~2025-01-23 7:23 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-07 18:25 [PATCH] virtio_blk: always post notifications under the lock Andrew Boyer
2025-01-08 2:02 ` Jason Wang
2025-01-09 10:19 ` Michael S. Tsirkin
2025-01-09 12:01 ` Christian Borntraeger
2025-01-09 13:42 ` Michael S. Tsirkin
2025-01-22 14:48 ` Boyer, Andrew
[not found] ` <FE77DD4F-AB39-4781-9D24-06F171F47FED@amd.com>
2025-01-22 15:13 ` Michael S. Tsirkin
2025-01-22 17:45 ` Boyer, Andrew
2025-01-23 6:53 ` Michael S. Tsirkin
2025-01-22 15:15 ` (repost) " Michael S. Tsirkin
2025-01-22 17:33 ` Christian Borntraeger
2025-01-22 17:49 ` Boyer, Andrew
2025-01-23 7:03 ` Michael S. Tsirkin
2025-01-22 22:07 ` Michael S. Tsirkin
2025-01-22 22:14 ` Boyer, Andrew
2025-01-22 22:25 ` Michael S. Tsirkin
2025-01-22 22:34 ` Boyer, Andrew
2025-01-23 1:47 ` Jason Wang
2025-01-23 6:51 ` Michael S. Tsirkin
2025-01-23 7:23 ` Michael S. Tsirkin [this message]
2025-01-23 8:39 ` Christian Borntraeger
2025-02-24 21:03 ` Michael S. Tsirkin
2025-02-24 21:31 ` Boyer, Andrew
2025-02-24 21:37 ` Michael S. Tsirkin
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=20250123022305-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=Allen.Hubbe@amd.com \
--cc=Andrew.Boyer@amd.com \
--cc=Brett.Creeley@amd.com \
--cc=Shannon.Nelson@amd.com \
--cc=axboe@kernel.dk \
--cc=borntraeger@linux.ibm.com \
--cc=eperezma@redhat.com \
--cc=jasowang@redhat.com \
--cc=linux-block@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=stefanha@redhat.com \
--cc=virtualization@lists.linux.dev \
--cc=xuanzhuo@linux.alibaba.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).