Skip to content

Commit

Permalink
virtio_ring: packed: extract the logic of alloc queue
Browse files Browse the repository at this point in the history
Separate the logic of packed to create vring queue.

This feature is required for subsequent virtuqueue reset vring.

Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Message-Id: <20220801063902.129329-19-xuanzhuo@linux.alibaba.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
Xuan Zhuo authored and Michael S. Tsirkin committed Aug 11, 2022
1 parent 6356f8b commit 6b60b9c
Showing 1 changed file with 51 additions and 29 deletions.
80 changes: 51 additions & 29 deletions drivers/virtio/virtio_ring.c
Original file line number Diff line number Diff line change
Expand Up @@ -1854,19 +1854,10 @@ static void vring_free_packed(struct vring_virtqueue_packed *vring_packed,
kfree(vring_packed->desc_extra);
}

static struct virtqueue *vring_create_virtqueue_packed(
unsigned int index,
unsigned int num,
unsigned int vring_align,
struct virtio_device *vdev,
bool weak_barriers,
bool may_reduce_num,
bool context,
bool (*notify)(struct virtqueue *),
void (*callback)(struct virtqueue *),
const char *name)
static int vring_alloc_queue_packed(struct vring_virtqueue_packed *vring_packed,
struct virtio_device *vdev,
u32 num)
{
struct vring_virtqueue *vq;
struct vring_packed_desc *ring;
struct vring_packed_desc_event *driver, *device;
dma_addr_t ring_dma_addr, driver_event_dma_addr, device_event_dma_addr;
Expand All @@ -1878,21 +1869,59 @@ static struct virtqueue *vring_create_virtqueue_packed(
&ring_dma_addr,
GFP_KERNEL|__GFP_NOWARN|__GFP_ZERO);
if (!ring)
goto err_ring;
goto err;

vring_packed->vring.desc = ring;
vring_packed->ring_dma_addr = ring_dma_addr;
vring_packed->ring_size_in_bytes = ring_size_in_bytes;

event_size_in_bytes = sizeof(struct vring_packed_desc_event);

driver = vring_alloc_queue(vdev, event_size_in_bytes,
&driver_event_dma_addr,
GFP_KERNEL|__GFP_NOWARN|__GFP_ZERO);
if (!driver)
goto err_driver;
goto err;

vring_packed->vring.driver = driver;
vring_packed->event_size_in_bytes = event_size_in_bytes;
vring_packed->driver_event_dma_addr = driver_event_dma_addr;

device = vring_alloc_queue(vdev, event_size_in_bytes,
&device_event_dma_addr,
GFP_KERNEL|__GFP_NOWARN|__GFP_ZERO);
if (!device)
goto err_device;
goto err;

vring_packed->vring.device = device;
vring_packed->device_event_dma_addr = device_event_dma_addr;

vring_packed->vring.num = num;

return 0;

err:
vring_free_packed(vring_packed, vdev);
return -ENOMEM;
}

static struct virtqueue *vring_create_virtqueue_packed(
unsigned int index,
unsigned int num,
unsigned int vring_align,
struct virtio_device *vdev,
bool weak_barriers,
bool may_reduce_num,
bool context,
bool (*notify)(struct virtqueue *),
void (*callback)(struct virtqueue *),
const char *name)
{
struct vring_virtqueue_packed vring_packed = {};
struct vring_virtqueue *vq;

if (vring_alloc_queue_packed(&vring_packed, vdev, num))
goto err_ring;

vq = kmalloc(sizeof(*vq), GFP_KERNEL);
if (!vq)
Expand Down Expand Up @@ -1920,17 +1949,14 @@ 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_dma_addr = vring_packed.ring_dma_addr;
vq->packed.driver_event_dma_addr = vring_packed.driver_event_dma_addr;
vq->packed.device_event_dma_addr = vring_packed.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.ring_size_in_bytes = vring_packed.ring_size_in_bytes;
vq->packed.event_size_in_bytes = vring_packed.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.vring = vring_packed.vring;

vq->packed.next_avail_idx = 0;
vq->packed.avail_wrap_counter = 1;
Expand Down Expand Up @@ -1972,11 +1998,7 @@ static struct virtqueue *vring_create_virtqueue_packed(
err_desc_state:
kfree(vq);
err_vq:
vring_free_queue(vdev, event_size_in_bytes, device, device_event_dma_addr);
err_device:
vring_free_queue(vdev, event_size_in_bytes, driver, driver_event_dma_addr);
err_driver:
vring_free_queue(vdev, ring_size_in_bytes, ring, ring_dma_addr);
vring_free_packed(&vring_packed, vdev);
err_ring:
return NULL;
}
Expand Down

0 comments on commit 6b60b9c

Please sign in to comment.