Test-Label: iol-testing Test-Status: WARNING http://dpdk.org/patch/99081 _apply patch failure_ Submitter: Yuan Wang Date: Friday, September 17 2021 08:12:38 Applied on: CommitID:4777674c4428f528fa2890d8afab551f6dd54c24 Apply patch set 99081-99083 failed: Checking patch doc/guides/prog_guide/vhost_lib.rst... error: while searching for: * ``rte_vhost_clear_queue_thread_unsafe(vid, queue_id, **pkts, count)`` Clear inflight packets which are submitted to DMA engine in vhost async data path. Completed packets are returned to applications through ``pkts``. * ``rte_vhost_async_try_dequeue_burst(vid, queue_id, mbuf_pool, pkts, count, nr_inflight)`` error: patch failed: doc/guides/prog_guide/vhost_lib.rst:300 Checking patch lib/vhost/rte_vhost_async.h... error: while searching for: __rte_experimental uint16_t rte_vhost_clear_queue_thread_unsafe(int vid, uint16_t queue_id, struct rte_mbuf **pkts, uint16_t count); /** * This function tries to receive packets from the guest with offloading * copies to the async channel. The packets that are transfer completed error: patch failed: lib/vhost/rte_vhost_async.h:256 Checking patch lib/vhost/version.map... error: while searching for: # added in 21.11 rte_vhost_async_try_dequeue_burst; }; error: patch failed: lib/vhost/version.map:88 Checking patch lib/vhost/virtio_net.c... error: while searching for: return n_pkts_cpl; } static __rte_always_inline uint32_t virtio_dev_rx_async_submit(struct virtio_net *dev, uint16_t queue_id, struct rte_mbuf **pkts, uint32_t count) error: patch failed: lib/vhost/virtio_net.c:2154 Applying patch doc/guides/prog_guide/vhost_lib.rst with 1 reject... Rejected hunk #1. Applying patch lib/vhost/rte_vhost_async.h with 1 reject... Rejected hunk #1. Applying patch lib/vhost/version.map with 1 reject... Rejected hunk #1. Applying patch lib/vhost/virtio_net.c with 1 reject... Rejected hunk #1. diff a/doc/guides/prog_guide/vhost_lib.rst b/doc/guides/prog_guide/vhost_lib.rst (rejected hunks) @@ -300,7 +300,13 @@ The following is an overview of some key Vhost API functions: * ``rte_vhost_clear_queue_thread_unsafe(vid, queue_id, **pkts, count)`` - Clear inflight packets which are submitted to DMA engine in vhost async data + Clear in-flight packets which are submitted to async channel in vhost + async data path without performing any locking. Completed packets are + returned to applications through ``pkts``. + +* ``rte_vhost_clear_queue(vid, queue_id, **pkts, count)`` + + Clear in-flight packets which are submitted to async channel in vhost async data path. Completed packets are returned to applications through ``pkts``. * ``rte_vhost_async_try_dequeue_burst(vid, queue_id, mbuf_pool, pkts, count, nr_inflight)`` diff a/lib/vhost/rte_vhost_async.h b/lib/vhost/rte_vhost_async.h (rejected hunks) @@ -256,6 +256,27 @@ int rte_vhost_async_get_inflight(int vid, uint16_t queue_id); __rte_experimental uint16_t rte_vhost_clear_queue_thread_unsafe(int vid, uint16_t queue_id, struct rte_mbuf **pkts, uint16_t count); + +/** + * This function checks async completion status and clear packets for + * a specific vhost device queue. Packets which are inflight will be + * returned in an array. + * + * @param vid + * ID of vhost device to clear data + * @param queue_id + * Queue id to clear data + * @param pkts + * Blank array to get return packet pointer + * @param count + * Size of the packet array + * @return + * Number of packets returned + */ +__rte_experimental +uint16_t rte_vhost_clear_queue(int vid, uint16_t queue_id, + struct rte_mbuf **pkts, uint16_t count); + /** * This function tries to receive packets from the guest with offloading * copies to the async channel. The packets that are transfer completed diff a/lib/vhost/version.map b/lib/vhost/version.map (rejected hunks) @@ -88,4 +88,5 @@ EXPERIMENTAL { # added in 21.11 rte_vhost_async_try_dequeue_burst; + rte_vhost_clear_queue; }; diff a/lib/vhost/virtio_net.c b/lib/vhost/virtio_net.c (rejected hunks) @@ -2154,6 +2154,55 @@ rte_vhost_clear_queue_thread_unsafe(int vid, uint16_t queue_id, return n_pkts_cpl; } +uint16_t +rte_vhost_clear_queue(int vid, uint16_t queue_id, struct rte_mbuf **pkts, uint16_t count) +{ + struct virtio_net *dev = get_device(vid); + struct vhost_virtqueue *vq; + uint16_t n_pkts_cpl; + + if (!dev) + return 0; + + VHOST_LOG_DATA(DEBUG, "(%d) %s\n", dev->vid, __func__); + if (unlikely(queue_id >= dev->nr_vring)) { + VHOST_LOG_DATA(ERR, "(%d) %s: invalid virtqueue idx %d.\n", + dev->vid, __func__, queue_id); + return 0; + } + + vq = dev->virtqueue[queue_id]; + + if (unlikely(!vq->async_registered)) { + VHOST_LOG_DATA(ERR, "(%d) %s: async not registered for queue id %d.\n", + dev->vid, __func__, queue_id); + return 0; + } + + if (!rte_spinlock_trylock(&vq->access_lock)) { + VHOST_LOG_DATA(ERR, + "(%d) %s: failed to clear async queue id %d, virtqueue busy.\n", + dev->vid, __func__, queue_id); + return 0; + } + + if (queue_id % 2 == 0) + n_pkts_cpl = vhost_poll_enqueue_completed(dev, queue_id, pkts, count); + else { + if (unlikely(vq_is_packed(dev))) + VHOST_LOG_DATA(ERR, + "(%d) %s: async dequeue does not support packed ring.\n", + dev->vid, __func__); + else + n_pkts_cpl = async_poll_dequeue_completed_split(dev, vq, queue_id, pkts, + count, dev->flags & VIRTIO_DEV_LEGACY_OL_FLAGS); + } + + rte_spinlock_unlock(&vq->access_lock); + + return n_pkts_cpl; +} + static __rte_always_inline uint32_t virtio_dev_rx_async_submit(struct virtio_net *dev, uint16_t queue_id, struct rte_mbuf **pkts, uint32_t count) https://lab.dpdk.org/results/dashboard/patchsets/18823/ UNH-IOL DPDK Community Lab