virtio_ring.c (198fa7be96e52bc89c9e8a7e1c3b9e059ff203a0) virtio_ring.c (e1d6a423ea1867a3a84f12a99981f036acb8f354)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/* Virtio ring implementation.
3 *
4 * Copyright 2007 Rusty Russell IBM Corporation
5 */
6#include <linux/virtio.h>
7#include <linux/virtio_ring.h>
8#include <linux/virtio_config.h>

--- 943 unchanged lines hidden (view full) ---

952 if (!vq->vq.callback) {
953 vring_split->avail_flags_shadow |= VRING_AVAIL_F_NO_INTERRUPT;
954 if (!vq->event)
955 vring_split->vring.avail->flags = cpu_to_virtio16(vdev,
956 vring_split->avail_flags_shadow);
957 }
958}
959
1// SPDX-License-Identifier: GPL-2.0-or-later
2/* Virtio ring implementation.
3 *
4 * Copyright 2007 Rusty Russell IBM Corporation
5 */
6#include <linux/virtio.h>
7#include <linux/virtio_ring.h>
8#include <linux/virtio_config.h>

--- 943 unchanged lines hidden (view full) ---

952 if (!vq->vq.callback) {
953 vring_split->avail_flags_shadow |= VRING_AVAIL_F_NO_INTERRUPT;
954 if (!vq->event)
955 vring_split->vring.avail->flags = cpu_to_virtio16(vdev,
956 vring_split->avail_flags_shadow);
957 }
958}
959
960static void virtqueue_vring_attach_split(struct vring_virtqueue *vq,
961 struct vring_virtqueue_split *vring_split)
962{
963 vq->split = *vring_split;
964
965 /* Put everything in free lists. */
966 vq->free_head = 0;
967}
968
960static int vring_alloc_state_extra_split(struct vring_virtqueue_split *vring_split)
961{
962 struct vring_desc_state_split *state;
963 struct vring_desc_extra *extra;
964 u32 num = vring_split->vring.num;
965
966 state = kmalloc_array(num, sizeof(struct vring_desc_state_split), GFP_KERNEL);
967 if (!state)

--- 94 unchanged lines hidden (view full) ---

1062
1063 vq = __vring_new_virtqueue(index, &vring_split, vdev, weak_barriers,
1064 context, notify, callback, name);
1065 if (!vq) {
1066 vring_free_split(&vring_split, vdev);
1067 return NULL;
1068 }
1069
969static int vring_alloc_state_extra_split(struct vring_virtqueue_split *vring_split)
970{
971 struct vring_desc_state_split *state;
972 struct vring_desc_extra *extra;
973 u32 num = vring_split->vring.num;
974
975 state = kmalloc_array(num, sizeof(struct vring_desc_state_split), GFP_KERNEL);
976 if (!state)

--- 94 unchanged lines hidden (view full) ---

1071
1072 vq = __vring_new_virtqueue(index, &vring_split, vdev, weak_barriers,
1073 context, notify, callback, name);
1074 if (!vq) {
1075 vring_free_split(&vring_split, vdev);
1076 return NULL;
1077 }
1078
1070 to_vvq(vq)->split.queue_dma_addr = vring_split.queue_dma_addr;
1071 to_vvq(vq)->split.queue_size_in_bytes = vring_split.queue_size_in_bytes;
1072 to_vvq(vq)->we_own_ring = true;
1073
1074 return vq;
1075}
1076
1077
1078/*
1079 * Packed ring specific functions - *_packed().

--- 1232 unchanged lines hidden (view full) ---

2312
2313 vq->indirect = virtio_has_feature(vdev, VIRTIO_RING_F_INDIRECT_DESC) &&
2314 !context;
2315 vq->event = virtio_has_feature(vdev, VIRTIO_RING_F_EVENT_IDX);
2316
2317 if (virtio_has_feature(vdev, VIRTIO_F_ORDER_PLATFORM))
2318 vq->weak_barriers = false;
2319
1079 to_vvq(vq)->we_own_ring = true;
1080
1081 return vq;
1082}
1083
1084
1085/*
1086 * Packed ring specific functions - *_packed().

--- 1232 unchanged lines hidden (view full) ---

2319
2320 vq->indirect = virtio_has_feature(vdev, VIRTIO_RING_F_INDIRECT_DESC) &&
2321 !context;
2322 vq->event = virtio_has_feature(vdev, VIRTIO_RING_F_EVENT_IDX);
2323
2324 if (virtio_has_feature(vdev, VIRTIO_F_ORDER_PLATFORM))
2325 vq->weak_barriers = false;
2326
2320 vq->split.queue_dma_addr = 0;
2321 vq->split.queue_size_in_bytes = 0;
2322
2323 vq->split.vring = vring_split->vring;
2324
2325 err = vring_alloc_state_extra_split(vring_split);
2326 if (err) {
2327 kfree(vq);
2328 return NULL;
2329 }
2330
2327 err = vring_alloc_state_extra_split(vring_split);
2328 if (err) {
2329 kfree(vq);
2330 return NULL;
2331 }
2332
2331 /* Put everything in free lists. */
2332 vq->free_head = 0;
2333
2334 vq->split.desc_state = vring_split->desc_state;
2335 vq->split.desc_extra = vring_split->desc_extra;
2336
2337 virtqueue_vring_init_split(vring_split, vq);
2338
2339 virtqueue_init(vq, vring_split->vring.num);
2333 virtqueue_vring_init_split(vring_split, vq);
2334
2335 virtqueue_init(vq, vring_split->vring.num);
2336 virtqueue_vring_attach_split(vq, vring_split);
2340
2341 spin_lock(&vdev->vqs_list_lock);
2342 list_add_tail(&vq->vq.list, &vdev->vqs);
2343 spin_unlock(&vdev->vqs_list_lock);
2344 return &vq->vq;
2345}
2346
2347struct virtqueue *vring_create_virtqueue(

--- 237 unchanged lines hidden ---
2337
2338 spin_lock(&vdev->vqs_list_lock);
2339 list_add_tail(&vq->vq.list, &vdev->vqs);
2340 spin_unlock(&vdev->vqs_list_lock);
2341 return &vq->vq;
2342}
2343
2344struct virtqueue *vring_create_virtqueue(

--- 237 unchanged lines hidden ---