@@ -1904,6 +1904,35 @@ static int vring_alloc_state_extra_packed(u32 num,
return -ENOMEM;
}
+static void vring_virtqueue_attach_packed(struct vring_virtqueue *vq,
+ u32 num,
+ struct vring_packed_desc *ring,
+ struct vring_packed_desc_event *driver,
+ struct vring_packed_desc_event *device,
+ dma_addr_t ring_dma_addr,
+ dma_addr_t driver_event_dma_addr,
+ dma_addr_t device_event_dma_addr,
+ size_t ring_size_in_bytes,
+ size_t event_size_in_bytes,
+ struct vring_desc_state_packed *state,
+ struct vring_desc_extra *extra)
+{
+ vq->packed.ring_dma_addr = ring_dma_addr;
+ vq->packed.driver_event_dma_addr = driver_event_dma_addr;
+ vq->packed.device_event_dma_addr = device_event_dma_addr;
+
+ vq->packed.ring_size_in_bytes = ring_size_in_bytes;
+ vq->packed.event_size_in_bytes = event_size_in_bytes;
+
+ vq->packed.vring.num = num;
+ vq->packed.vring.desc = ring;
+ vq->packed.vring.driver = driver;
+ vq->packed.vring.device = device;
+
+ vq->packed.desc_state = state;
+ vq->packed.desc_extra = extra;
+}
+
static struct virtqueue *vring_create_virtqueue_packed(
unsigned int index,
unsigned int num,
@@ -1962,18 +1991,6 @@ static struct virtqueue *vring_create_virtqueue_packed(
if (virtio_has_feature(vdev, VIRTIO_F_ORDER_PLATFORM))
vq->weak_barriers = false;
- vq->packed.ring_dma_addr = ring_dma_addr;
- vq->packed.driver_event_dma_addr = driver_event_dma_addr;
- vq->packed.device_event_dma_addr = device_event_dma_addr;
-
- vq->packed.ring_size_in_bytes = ring_size_in_bytes;
- vq->packed.event_size_in_bytes = event_size_in_bytes;
-
- vq->packed.vring.num = num;
- vq->packed.vring.desc = ring;
- vq->packed.vring.driver = driver;
- vq->packed.vring.device = device;
-
vq->packed.next_avail_idx = 0;
vq->packed.avail_wrap_counter = 1;
vq->packed.used_wrap_counter = 1;
@@ -1984,8 +2001,10 @@ static struct virtqueue *vring_create_virtqueue_packed(
if (err)
goto err_state_extra;
- vq->packed.desc_state = state;
- vq->packed.desc_extra = extra;
+ vring_virtqueue_attach_packed(vq, num, ring, driver, device,
+ ring_dma_addr, driver_event_dma_addr,
+ device_event_dma_addr, ring_size_in_bytes,
+ event_size_in_bytes, state, extra);
/* Put everything in free lists. */
vq->free_head = 0;
Separate the logic of attach vring, the subsequent patch will call it separately. Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> --- drivers/virtio/virtio_ring.c | 47 +++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 14 deletions(-)