From: Jia Jia <physicalmtea@gmail.com>
To: mst@redhat.com
Cc: stefanha@redhat.com, kvm@vger.kernel.org,
virtualization@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 1/2] vhost/vsock: discard IOTLB when ACCESS_PLATFORM is cleared
Date: Tue, 4 Aug 2026 15:21:59 +0800 [thread overview]
Message-ID: <20260804072159.7506-1-physicalmtea@gmail.com> (raw)
In-Reply-To: <20260803231405-mutt-send-email-mst@kernel.org>
On Mon, Aug 03, 2026 at 11:18:50PM -0400, Michael S. Tsirkin wrote:
> Why lock down all vqs like this? Would this work just as well instead?
>
> iotlb = vsock->dev.iotlb;
> vsock->dev.iotlb = NULL;
>
> for (i = 0; i < ARRAY_SIZE(vsock->vqs); i++) {
> mutex_lock(&vsock->vqs[i].mutex);
> vq = &vsock->vqs[i];
> vq->iotlb = NULL;
> memset(vq->meta_iotlb, 0, sizeof(vq->meta_iotlb));
> vq->acked_features = features;
> mutex_unlock(&vsock->vqs[i].mutex);
> }
>
> and if no why not?
Let me add a little more detail to my earlier reasoning. Locking the VQs
one at a time does reduce lock hold time and avoids blocking one queue
while waiting for another. However, the additional blocking from taking
all VQ mutexes is confined to the `VHOST_SET_FEATURES` transition and
does not add any steady-state data-path overhead. vsock has only two VQs,
and once the locks have been acquired, the critical section only updates
a few pointers, metadata caches, and feature fields.
`dev->iotlb` is shared by all VQs, while `vq->iotlb`, `meta_iotlb`, and
`acked_features` are per-VQ state protected by that VQ's mutex. A kick
handler only holds its own VQ mutex. The following interleaving therefore
seems possible:
```text
worker: holds vq->mutex with the old vq->iotlb
ioctl: sets dev->iotlb = NULL
ioctl: waits for vq->mutex
worker: continues processing with the old per-VQ state
```
During this window, the state can be:
```text
vq->iotlb = old_iotlb
vq->meta_iotlb = old mappings
vq->acked_features = ACCESS_PLATFORM enabled
dev->iotlb = NULL
```
`vq_meta_prefetch()` may still use the old `vq->iotlb` and metadata
cache, while `translate_desc()` sees `dev->iotlb == NULL` and falls back
to `dev->umem`. The same handler could therefore access the vring through
the old IOTLB and then interpret a descriptor address as a GPA when
translating the payload.
If that IOVA has no corresponding GPA mapping, `translate_desc()`
returns `-EFAULT` and aborts the current queue-processing pass. If it
happens to fall within a valid GPA mapping, the translation may produce
an iovec for a different HVA.
Clearing `dev->iotlb` is also different from replacing one mapping table
with another under the same address model, since it changes the address
interpretation from IOVA to GPA.
As I mentioned in my earlier reply, I do not see any check in the
vhost-vsock `VHOST_SET_FEATURES` ioctl path that guarantees all VQs are
stopped or otherwise quiesced, so I thought the transition also needed
to be safe while a VQ may still be active.
Please let me know if I am missing such a guarantee elsewhere. Thanks.
next prev parent reply other threads:[~2026-08-04 7:22 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-30 4:09 [PATCH] vhost/vsock: prevent stale IOTLB after ACCESS_PLATFORM changes Jia Jia
2026-07-30 13:55 ` Stefan Hajnoczi
2026-07-30 14:48 ` Michael S. Tsirkin
2026-07-30 14:51 ` Michael S. Tsirkin
2026-07-31 4:41 ` Jia Jia
2026-07-31 9:38 ` Michael S. Tsirkin
2026-07-31 10:34 ` [PATCH v2 0/2] vhost/vsock: fix device IOTLB feature lifecycle Jia Jia
2026-07-31 10:34 ` [PATCH v2 1/2] vhost/vsock: discard IOTLB when ACCESS_PLATFORM is cleared Jia Jia
2026-08-04 3:18 ` Michael S. Tsirkin
2026-08-04 4:18 ` Jia Jia
2026-08-04 7:21 ` Jia Jia [this message]
2026-07-31 10:34 ` [PATCH v2 2/2] vhost/vsock: keep IOTLB across feature updates Jia Jia
2026-08-04 3:20 ` Michael S. Tsirkin
2026-08-04 4:26 ` Jia Jia
2026-08-04 3:19 ` [PATCH v2 0/2] vhost/vsock: fix device IOTLB feature lifecycle Michael S. Tsirkin
2026-08-04 4:30 ` Jia Jia
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=20260804072159.7506-1-physicalmtea@gmail.com \
--to=physicalmtea@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=stefanha@redhat.com \
--cc=virtualization@lists.linux.dev \
/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