Message ID | 20220720030436.79520-7-xuanzhuo@linux.alibaba.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | virtio pci support VIRTIO_F_RING_RESET | expand |
在 2022/7/20 11:04, Xuan Zhuo 写道: > Separate the logic of virtqueue initialization. This logic is irrelevant > to ring layout. > > This logic can be called independently when implementing resize/reset > later. > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> Acked-by: Jason Wang <jasowang@redhat.com> > --- > drivers/virtio/virtio_ring.c | 61 ++++++++++++++++++------------------ > 1 file changed, 31 insertions(+), 30 deletions(-) > > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c > index 1bc5794e9739..87ce17562b29 100644 > --- a/drivers/virtio/virtio_ring.c > +++ b/drivers/virtio/virtio_ring.c > @@ -368,6 +368,34 @@ static int vring_mapping_error(const struct vring_virtqueue *vq, > return dma_mapping_error(vring_dma_dev(vq), addr); > } > > +static void virtqueue_init(struct vring_virtqueue *vq, u32 num) > +{ > + struct virtio_device *vdev; > + > + vdev = vq->vq.vdev; > + > + vq->vq.num_free = num; > + if (vq->packed_ring) > + vq->last_used_idx = 0 | (1 << VRING_PACKED_EVENT_F_WRAP_CTR); > + else > + vq->last_used_idx = 0; > + vq->event_triggered = false; > + vq->num_added = 0; > + vq->use_dma_api = vring_use_dma_api(vdev); > +#ifdef DEBUG > + vq->in_use = false; > + vq->last_add_time_valid = false; > +#endif > + > + vq->event = virtio_has_feature(vdev, VIRTIO_RING_F_EVENT_IDX); > + > + if (virtio_has_feature(vdev, VIRTIO_F_ORDER_PLATFORM)) > + vq->weak_barriers = false; > + > + /* Put everything in free lists. */ > + vq->free_head = 0; > +} > + > > /* > * Split ring specific functions - *_split(). > @@ -1706,7 +1734,6 @@ static struct virtqueue *vring_create_virtqueue_packed( > vq->vq.callback = callback; > vq->vq.vdev = vdev; > vq->vq.name = name; > - vq->vq.num_free = num; > vq->vq.index = index; > vq->we_own_ring = true; > vq->notify = notify; > @@ -1716,22 +1743,10 @@ static struct virtqueue *vring_create_virtqueue_packed( > #else > vq->broken = false; > #endif > - vq->last_used_idx = 0 | (1 << VRING_PACKED_EVENT_F_WRAP_CTR); > - vq->event_triggered = false; > - vq->num_added = 0; > vq->packed_ring = true; > - vq->use_dma_api = vring_use_dma_api(vdev); > -#ifdef DEBUG > - vq->in_use = false; > - vq->last_add_time_valid = false; > -#endif > > vq->indirect = virtio_has_feature(vdev, VIRTIO_RING_F_INDIRECT_DESC) && > !context; > - vq->event = virtio_has_feature(vdev, VIRTIO_RING_F_EVENT_IDX); > - > - 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; > @@ -1759,8 +1774,7 @@ static struct virtqueue *vring_create_virtqueue_packed( > memset(vq->packed.desc_state, 0, > num * sizeof(struct vring_desc_state_packed)); > > - /* Put everything in free lists. */ > - vq->free_head = 0; > + virtqueue_init(vq, num); > > vq->packed.desc_extra = vring_alloc_desc_extra(num); > if (!vq->packed.desc_extra) > @@ -2205,7 +2219,6 @@ struct virtqueue *__vring_new_virtqueue(unsigned int index, > vq->vq.callback = callback; > vq->vq.vdev = vdev; > vq->vq.name = name; > - vq->vq.num_free = vring.num; > vq->vq.index = index; > vq->we_own_ring = false; > vq->notify = notify; > @@ -2215,21 +2228,9 @@ struct virtqueue *__vring_new_virtqueue(unsigned int index, > #else > vq->broken = false; > #endif > - vq->last_used_idx = 0; > - vq->event_triggered = false; > - vq->num_added = 0; > - vq->use_dma_api = vring_use_dma_api(vdev); > -#ifdef DEBUG > - vq->in_use = false; > - vq->last_add_time_valid = false; > -#endif > > vq->indirect = virtio_has_feature(vdev, VIRTIO_RING_F_INDIRECT_DESC) && > !context; > - vq->event = virtio_has_feature(vdev, VIRTIO_RING_F_EVENT_IDX); > - > - if (virtio_has_feature(vdev, VIRTIO_F_ORDER_PLATFORM)) > - vq->weak_barriers = false; > > vq->split.queue_dma_addr = 0; > vq->split.queue_size_in_bytes = 0; > @@ -2255,11 +2256,11 @@ struct virtqueue *__vring_new_virtqueue(unsigned int index, > if (!vq->split.desc_extra) > goto err_extra; > > - /* Put everything in free lists. */ > - vq->free_head = 0; > memset(vq->split.desc_state, 0, vring.num * > sizeof(struct vring_desc_state_split)); > > + virtqueue_init(vq, vq->split.vring.num); > + > spin_lock(&vdev->vqs_list_lock); > list_add_tail(&vq->vq.list, &vdev->vqs); > spin_unlock(&vdev->vqs_list_lock);
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index 1bc5794e9739..87ce17562b29 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c @@ -368,6 +368,34 @@ static int vring_mapping_error(const struct vring_virtqueue *vq, return dma_mapping_error(vring_dma_dev(vq), addr); } +static void virtqueue_init(struct vring_virtqueue *vq, u32 num) +{ + struct virtio_device *vdev; + + vdev = vq->vq.vdev; + + vq->vq.num_free = num; + if (vq->packed_ring) + vq->last_used_idx = 0 | (1 << VRING_PACKED_EVENT_F_WRAP_CTR); + else + vq->last_used_idx = 0; + vq->event_triggered = false; + vq->num_added = 0; + vq->use_dma_api = vring_use_dma_api(vdev); +#ifdef DEBUG + vq->in_use = false; + vq->last_add_time_valid = false; +#endif + + vq->event = virtio_has_feature(vdev, VIRTIO_RING_F_EVENT_IDX); + + if (virtio_has_feature(vdev, VIRTIO_F_ORDER_PLATFORM)) + vq->weak_barriers = false; + + /* Put everything in free lists. */ + vq->free_head = 0; +} + /* * Split ring specific functions - *_split(). @@ -1706,7 +1734,6 @@ static struct virtqueue *vring_create_virtqueue_packed( vq->vq.callback = callback; vq->vq.vdev = vdev; vq->vq.name = name; - vq->vq.num_free = num; vq->vq.index = index; vq->we_own_ring = true; vq->notify = notify; @@ -1716,22 +1743,10 @@ static struct virtqueue *vring_create_virtqueue_packed( #else vq->broken = false; #endif - vq->last_used_idx = 0 | (1 << VRING_PACKED_EVENT_F_WRAP_CTR); - vq->event_triggered = false; - vq->num_added = 0; vq->packed_ring = true; - vq->use_dma_api = vring_use_dma_api(vdev); -#ifdef DEBUG - vq->in_use = false; - vq->last_add_time_valid = false; -#endif vq->indirect = virtio_has_feature(vdev, VIRTIO_RING_F_INDIRECT_DESC) && !context; - vq->event = virtio_has_feature(vdev, VIRTIO_RING_F_EVENT_IDX); - - 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; @@ -1759,8 +1774,7 @@ static struct virtqueue *vring_create_virtqueue_packed( memset(vq->packed.desc_state, 0, num * sizeof(struct vring_desc_state_packed)); - /* Put everything in free lists. */ - vq->free_head = 0; + virtqueue_init(vq, num); vq->packed.desc_extra = vring_alloc_desc_extra(num); if (!vq->packed.desc_extra) @@ -2205,7 +2219,6 @@ struct virtqueue *__vring_new_virtqueue(unsigned int index, vq->vq.callback = callback; vq->vq.vdev = vdev; vq->vq.name = name; - vq->vq.num_free = vring.num; vq->vq.index = index; vq->we_own_ring = false; vq->notify = notify; @@ -2215,21 +2228,9 @@ struct virtqueue *__vring_new_virtqueue(unsigned int index, #else vq->broken = false; #endif - vq->last_used_idx = 0; - vq->event_triggered = false; - vq->num_added = 0; - vq->use_dma_api = vring_use_dma_api(vdev); -#ifdef DEBUG - vq->in_use = false; - vq->last_add_time_valid = false; -#endif vq->indirect = virtio_has_feature(vdev, VIRTIO_RING_F_INDIRECT_DESC) && !context; - vq->event = virtio_has_feature(vdev, VIRTIO_RING_F_EVENT_IDX); - - if (virtio_has_feature(vdev, VIRTIO_F_ORDER_PLATFORM)) - vq->weak_barriers = false; vq->split.queue_dma_addr = 0; vq->split.queue_size_in_bytes = 0; @@ -2255,11 +2256,11 @@ struct virtqueue *__vring_new_virtqueue(unsigned int index, if (!vq->split.desc_extra) goto err_extra; - /* Put everything in free lists. */ - vq->free_head = 0; memset(vq->split.desc_state, 0, vring.num * sizeof(struct vring_desc_state_split)); + virtqueue_init(vq, vq->split.vring.num); + spin_lock(&vdev->vqs_list_lock); list_add_tail(&vq->vq.list, &vdev->vqs); spin_unlock(&vdev->vqs_list_lock);
Separate the logic of virtqueue initialization. This logic is irrelevant to ring layout. This logic can be called independently when implementing resize/reset later. Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> --- drivers/virtio/virtio_ring.c | 61 ++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 30 deletions(-)