MCPcopy Create free account
hub / github.com/F-Stack/f-stack / vhost_flush_enqueue_shadow_packed

Function vhost_flush_enqueue_shadow_packed

dpdk/lib/vhost/virtio_net.c:318–380  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

316}
317
318static __rte_always_inline void
319vhost_flush_enqueue_shadow_packed(struct virtio_net *dev,
320 struct vhost_virtqueue *vq)
321{
322 int i;
323 uint16_t used_idx = vq->last_used_idx;
324 uint16_t head_idx = vq->last_used_idx;
325 uint16_t head_flags = 0;
326
327 /* Split loop in two to save memory barriers */
328 for (i = 0; i < vq->shadow_used_idx; i++) {
329 vq->desc_packed[used_idx].id = vq->shadow_used_packed[i].id;
330 vq->desc_packed[used_idx].len = vq->shadow_used_packed[i].len;
331
332 used_idx += vq->shadow_used_packed[i].count;
333 if (used_idx >= vq->size)
334 used_idx -= vq->size;
335 }
336
337 /* The ordering for storing desc flags needs to be enforced. */
338 rte_atomic_thread_fence(rte_memory_order_release);
339
340 for (i = 0; i < vq->shadow_used_idx; i++) {
341 uint16_t flags;
342
343 if (vq->shadow_used_packed[i].len)
344 flags = VRING_DESC_F_WRITE;
345 else
346 flags = 0;
347
348 if (vq->used_wrap_counter) {
349 flags |= VRING_DESC_F_USED;
350 flags |= VRING_DESC_F_AVAIL;
351 } else {
352 flags &= ~VRING_DESC_F_USED;
353 flags &= ~VRING_DESC_F_AVAIL;
354 }
355
356 if (i > 0) {
357 vq->desc_packed[vq->last_used_idx].flags = flags;
358
359 vhost_log_cache_used_vring(dev, vq,
360 vq->last_used_idx *
361 sizeof(struct vring_packed_desc),
362 sizeof(struct vring_packed_desc));
363 } else {
364 head_idx = vq->last_used_idx;
365 head_flags = flags;
366 }
367
368 vq_inc_last_used_packed(vq, vq->shadow_used_packed[i].count);
369 }
370
371 vq->desc_packed[head_idx].flags = head_flags;
372
373 vhost_log_cache_used_vring(dev, vq,
374 head_idx *
375 sizeof(struct vring_packed_desc),

Callers 3

virtio_dev_rx_packedFunction · 0.85

Calls 4

vq_inc_last_used_packedFunction · 0.85
vhost_log_cache_syncFunction · 0.85
rte_atomic_thread_fenceFunction · 0.50

Tested by

no test coverage detected