Skip to content

Commit 02c72d5

Browse files
committed
Merge branch 'virtio-support-packed-ring'
Tiwei Bie says: ==================== virtio: support packed ring This patch set implements packed ring support in virtio driver. A performance test between pktgen (pktgen_sample03_burst_single_flow.sh) and DPDK vhost (testpmd/rxonly/vhost-PMD) has been done, I saw ~30% performance gain in packed ring in this case. To make this patch set work with below patch set for vhost, some hacks are needed to set the _F_NEXT flag in indirect descriptors (this should be fixed in vhost): https://lkml.org/lkml/2018/7/3/33 v2 -> v3: - Use leXX instead of virtioXX (MST); - Refactor split ring first (MST); - Add debug helpers (MST); - Put split/packed ring specific fields in sub structures (MST); - Handle normal descriptors and indirect descriptors differently (MST); - Track the DMA addr/len related info in a separate structure (MST); - Calculate AVAIL/USED flags only when wrap counter wraps (MST); - Define a struct/union to read event structure (MST); - Define a macro for wrap counter bit in uapi (MST); - Define the AVAIL/USED bits as shifts instead of values (MST); - s/_F_/_FLAG_/ in VRING_PACKED_EVENT_* as they are values (MST); - Drop the notify workaround for QEMU's tx-timer in packed ring (MST); v1 -> v2: - Use READ_ONCE() to read event off_wrap and flags together (Jason); - Add comments related to ccw (Jason); RFC v6 -> v1: - Avoid extra virtio_wmb() in virtqueue_enable_cb_delayed_packed() when event idx is off (Jason); - Fix bufs calculation in virtqueue_enable_cb_delayed_packed() (Jason); - Test the state of the desc at used_idx instead of last_used_idx in virtqueue_enable_cb_delayed_packed() (Jason); - Save wrap counter (as part of queue state) in the return value of virtqueue_enable_cb_prepare_packed(); - Refine the packed ring definitions in uapi; - Rebase on the net-next tree; RFC v5 -> RFC v6: - Avoid tracking addr/len/flags when DMA API isn't used (MST/Jason); - Define wrap counter as bool (Jason); - Use ALIGN() in vring_init_packed() (Jason); - Avoid using pointer to track `next` in detach_buf_packed() (Jason); - Add comments for barriers (Jason); - Don't enable RING_PACKED on ccw for now (noticed by Jason); - Refine the memory barrier in virtqueue_poll(); - Add a missing memory barrier in virtqueue_enable_cb_delayed_packed(); - Remove the hacks in virtqueue_enable_cb_prepare_packed(); RFC v4 -> RFC v5: - Save DMA addr, etc in desc state (Jason); - Track used wrap counter; RFC v3 -> RFC v4: - Make ID allocation support out-of-order (Jason); - Various fixes for EVENT_IDX support; RFC v2 -> RFC v3: - Split into small patches (Jason); - Add helper virtqueue_use_indirect() (Jason); - Just set id for the last descriptor of a list (Jason); - Calculate the prev in virtqueue_add_packed() (Jason); - Fix/improve desc suppression code (Jason/MST); - Refine the code layout for XXX_split/packed and wrappers (MST); - Fix the comments and API in uapi (MST); - Remove the BUG_ON() for indirect (Jason); - Some other refinements and bug fixes; RFC v1 -> RFC v2: - Add indirect descriptor support - compile test only; - Add event suppression supprt - compile test only; - Move vring_packed_init() out of uapi (Jason, MST); - Merge two loops into one in virtqueue_add_packed() (Jason); - Split vring_unmap_one() for packed ring and split ring (Jason); - Avoid using '%' operator (Jason); - Rename free_head -> next_avail_idx (Jason); - Add comments for virtio_wmb() in virtqueue_add_packed() (Jason); - Some other refinements and bug fixes; ==================== Acked-by: Michael S. Tsirkin <[email protected]> Signed-off-by: David S. Miller <[email protected]>
2 parents 4afe60a + f959a12 commit 02c72d5

File tree

6 files changed

+1530
-376
lines changed

6 files changed

+1530
-376
lines changed

drivers/misc/mic/vop/vop_main.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,16 @@ static u64 vop_get_features(struct virtio_device *vdev)
129129
return features;
130130
}
131131

132+
static void vop_transport_features(struct virtio_device *vdev)
133+
{
134+
/*
135+
* Packed ring isn't enabled on virtio_vop for now,
136+
* because virtio_vop uses vring_new_virtqueue() which
137+
* creates virtio rings on preallocated memory.
138+
*/
139+
__virtio_clear_bit(vdev, VIRTIO_F_RING_PACKED);
140+
}
141+
132142
static int vop_finalize_features(struct virtio_device *vdev)
133143
{
134144
unsigned int i, bits;
@@ -141,6 +151,9 @@ static int vop_finalize_features(struct virtio_device *vdev)
141151
/* Give virtio_ring a chance to accept features. */
142152
vring_transport_features(vdev);
143153

154+
/* Give virtio_vop a chance to accept features. */
155+
vop_transport_features(vdev);
156+
144157
memset_io(out_features, 0, feature_len);
145158
bits = min_t(unsigned, feature_len,
146159
sizeof(vdev->features)) * 8;

drivers/remoteproc/remoteproc_virtio.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,16 @@ static u64 rproc_virtio_get_features(struct virtio_device *vdev)
214214
return rsc->dfeatures;
215215
}
216216

217+
static void rproc_transport_features(struct virtio_device *vdev)
218+
{
219+
/*
220+
* Packed ring isn't enabled on remoteproc for now,
221+
* because remoteproc uses vring_new_virtqueue() which
222+
* creates virtio rings on preallocated memory.
223+
*/
224+
__virtio_clear_bit(vdev, VIRTIO_F_RING_PACKED);
225+
}
226+
217227
static int rproc_virtio_finalize_features(struct virtio_device *vdev)
218228
{
219229
struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
@@ -224,6 +234,9 @@ static int rproc_virtio_finalize_features(struct virtio_device *vdev)
224234
/* Give virtio_ring a chance to accept features */
225235
vring_transport_features(vdev);
226236

237+
/* Give virtio_rproc a chance to accept features. */
238+
rproc_transport_features(vdev);
239+
227240
/* Make sure we don't have any features > 32 bits! */
228241
BUG_ON((u32)vdev->features != vdev->features);
229242

drivers/s390/virtio/virtio_ccw.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,17 @@ static u64 virtio_ccw_get_features(struct virtio_device *vdev)
765765
return rc;
766766
}
767767

768+
static void ccw_transport_features(struct virtio_device *vdev)
769+
{
770+
/*
771+
* Packed ring isn't enabled on virtio_ccw for now,
772+
* because virtio_ccw uses some legacy accessors,
773+
* e.g. virtqueue_get_avail() and virtqueue_get_used()
774+
* which aren't available in packed ring currently.
775+
*/
776+
__virtio_clear_bit(vdev, VIRTIO_F_RING_PACKED);
777+
}
778+
768779
static int virtio_ccw_finalize_features(struct virtio_device *vdev)
769780
{
770781
struct virtio_ccw_device *vcdev = to_vc_device(vdev);
@@ -791,6 +802,9 @@ static int virtio_ccw_finalize_features(struct virtio_device *vdev)
791802
/* Give virtio_ring a chance to accept features. */
792803
vring_transport_features(vdev);
793804

805+
/* Give virtio_ccw a chance to accept features. */
806+
ccw_transport_features(vdev);
807+
794808
features->index = 0;
795809
features->features = cpu_to_le32((u32)vdev->features);
796810
/* Write the first half of the feature bits to the host. */

0 commit comments

Comments
 (0)