All of lore.kernel.org
 help / color / mirror / Atom feed
* Question on vhost vq->signalled_used and vq->signalled_used_valid
@ 2022-06-15  0:46 Dongli Zhang
  0 siblings, 0 replies; only message in thread
From: Dongli Zhang @ 2022-06-15  0:46 UTC (permalink / raw)
  To: virtualization; +Cc: Joe Jin

Hello,

May I have a question on vq->signalled_used and vq->signalled_used_valid?

According to comments at line 2395, "If the driver never bothers to signal in a
very long while, used index might wrap around. If that happens, invalidate
signalled_used index we stored."

(BTW, I see QEMU-7.0 uses int16_t at something like line 2399 and I am thinking
about why)

2372 static int __vhost_add_used_n(struct vhost_virtqueue *vq,
2373                             struct vring_used_elem *heads,
2374                             unsigned count)
2375 {
2376         vring_used_elem_t __user *used;
2377         u16 old, new;
2378         int start;
2379
2380         start = vq->last_used_idx & (vq->num - 1);
2381         used = vq->used->ring + start;
2382         if (vhost_put_used(vq, heads, start, count)) {
2383                 vq_err(vq, "Failed to write used");
2384                 return -EFAULT;
2385         }
2386         if (unlikely(vq->log_used)) {
2387                 /* Make sure data is seen before log. */
2388                 smp_wmb();
2389                 /* Log used ring entry write. */
2390                 log_used(vq, ((void __user *)used - (void __user *)vq->used),
2391                          count * sizeof *used);
2392         }
2393         old = vq->last_used_idx;
2394         new = (vq->last_used_idx += count);
2395         /* If the driver never bothers to signal in a very long while,
2396          * used index might wrap around. If that happens, invalidate
2397          * signalled_used index we stored. TODO: make sure driver
2398          * signals at least once in 2^16 and remove this. */
2399         if (unlikely((u16)(new - vq->signalled_used) < (u16)(new - old)))
2400                 vq->signalled_used_valid = false;
2401         return 0;
2402 }

However, although the vhost signals the frontend virtio *conditionally*, the
vq->signalled_used is always updated at the end of vhost_notify() at line 2465,
no matter whether line 2475 returns true/false.

I did some tests but never see line 2399 returns true.

2441 static bool vhost_notify(struct vhost_dev *dev, struct vhost_virtqueue *vq)
2442 {
2443         __u16 old, new;
2444         __virtio16 event;
2445         bool v;
2446         /* Flush out used index updates. This is paired
2447          * with the barrier that the Guest executes when enabling
2448          * interrupts. */
2449         smp_mb();
2450
2451         if (vhost_has_feature(vq, VIRTIO_F_NOTIFY_ON_EMPTY) &&
2452             unlikely(vq->avail_idx == vq->last_avail_idx))
2453                 return true;
2454
2455         if (!vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX)) {
2456                 __virtio16 flags;
2457                 if (vhost_get_avail_flags(vq, &flags)) {
2458                         vq_err(vq, "Failed to get flags");
2459                         return true;
2460                 }
2461                 return !(flags & cpu_to_vhost16(vq,
VRING_AVAIL_F_NO_INTERRUPT));
2462         }
2463         old = vq->signalled_used;
2464         v = vq->signalled_used_valid;
2465         new = vq->signalled_used = vq->last_used_idx;
2466         vq->signalled_used_valid = true;
2467
2468         if (unlikely(!v))
2469                 return true;
2470
2471         if (vhost_get_used_event(vq, &event)) {
2472                 vq_err(vq, "Failed to get used event idx");
2473                 return true;
2474         }
2475         return vring_need_event(vhost16_to_cpu(vq, event), new, old);
2476 }


Therefore, would you mind helping me understand what does "If the driver never
bothers to signal in a very long while" indicate?

How the vhost driver "never bothers to signal in a very long while" as
vq->signalled_used is always updated?

About the naming, why not use "vq->added_used" because the value is always
updated after something is added to the vring buffer?

Perhaps this is a silly question. Sorry that currently I am stuck on it :)

Thank you very much!

Dongli Zhang
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-06-15  0:47 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-15  0:46 Question on vhost vq->signalled_used and vq->signalled_used_valid Dongli Zhang

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.