Skip to content

Commit

Permalink
net/virtio: support packed ring notification data
Browse files Browse the repository at this point in the history
This patch supports the feature that the driver passes extra data
(besides identifying the virtqueue) in its device notifications,
expanding the notifications to include the avail index and avail
wrap counter.

Signed-off-by: Cheng Jiang <cheng1.jiang@intel.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
  • Loading branch information
Cheng Jiang authored and Ferruh Yigit committed Jan 17, 2020
1 parent 109c38b commit 7e72f3e
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 3 deletions.
3 changes: 2 additions & 1 deletion drivers/net/virtio/virtio_ethdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@
1ULL << VIRTIO_F_IN_ORDER | \
1ULL << VIRTIO_F_RING_PACKED | \
1ULL << VIRTIO_F_IOMMU_PLATFORM | \
1ULL << VIRTIO_F_ORDER_PLATFORM)
1ULL << VIRTIO_F_ORDER_PLATFORM | \
1ULL << VIRTIO_F_NOTIFICATION_DATA)

#define VIRTIO_PMD_SUPPORTED_GUEST_FEATURES \
(VIRTIO_PMD_DEFAULT_GUEST_FEATURES | \
Expand Down
29 changes: 27 additions & 2 deletions drivers/net/virtio/virtio_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -416,9 +416,34 @@ modern_del_queue(struct virtio_hw *hw, struct virtqueue *vq)
}

static void
modern_notify_queue(struct virtio_hw *hw __rte_unused, struct virtqueue *vq)
modern_notify_queue(struct virtio_hw *hw, struct virtqueue *vq)
{
rte_write16(vq->vq_queue_index, vq->notify_addr);
uint32_t notify_data;

if (!vtpci_with_feature(hw, VIRTIO_F_NOTIFICATION_DATA)) {
rte_write16(vq->vq_queue_index, vq->notify_addr);
return;
}

if (vtpci_with_feature(hw, VIRTIO_F_RING_PACKED)) {
/*
* Bit[0:15]: vq queue index
* Bit[16:30]: avail index
* Bit[31]: avail wrap counter
*/
notify_data = ((uint32_t)(!!(vq->vq_packed.cached_flags &
VRING_PACKED_DESC_F_AVAIL)) << 31) |
((uint32_t)vq->vq_avail_idx << 16) |
vq->vq_queue_index;
} else {
/*
* Bit[0:15]: vq queue index
* Bit[16:31]: avail index
*/
notify_data = ((uint32_t)vq->vq_avail_idx << 16) |
vq->vq_queue_index;
}
rte_write32(notify_data, vq->notify_addr);
}

const struct virtio_pci_ops modern_ops = {
Expand Down
6 changes: 6 additions & 0 deletions drivers/net/virtio/virtio_pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,12 @@ struct virtnet_ctl;
*/
#define VIRTIO_F_ORDER_PLATFORM 36

/*
* This feature indicates that the driver passes extra data (besides
* identifying the virtqueue) in its device notifications.
*/
#define VIRTIO_F_NOTIFICATION_DATA 38

/* The Guest publishes the used index for which it expects an interrupt
* at the end of the avail ring. Host should ignore the avail->flags field. */
/* The Host publishes the avail index for which it expects a kick
Expand Down

0 comments on commit 7e72f3e

Please sign in to comment.