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 --- |