@@ -223,15 +223,6 @@ struct vring_virtqueue {
223223#endif
224224};
225225
226- static struct virtqueue * __vring_new_virtqueue (unsigned int index ,
227- struct vring_virtqueue_split * vring_split ,
228- struct virtio_device * vdev ,
229- bool weak_barriers ,
230- bool context ,
231- bool (* notify )(struct virtqueue * ),
232- void (* callback )(struct virtqueue * ),
233- const char * name ,
234- struct device * dma_dev );
235226static struct vring_desc_extra * vring_alloc_desc_extra (unsigned int num );
236227static void vring_free (struct virtqueue * _vq );
237228
@@ -1135,6 +1126,64 @@ static int vring_alloc_queue_split(struct vring_virtqueue_split *vring_split,
11351126 return 0 ;
11361127}
11371128
1129+ static struct virtqueue * __vring_new_virtqueue_split (unsigned int index ,
1130+ struct vring_virtqueue_split * vring_split ,
1131+ struct virtio_device * vdev ,
1132+ bool weak_barriers ,
1133+ bool context ,
1134+ bool (* notify )(struct virtqueue * ),
1135+ void (* callback )(struct virtqueue * ),
1136+ const char * name ,
1137+ struct device * dma_dev )
1138+ {
1139+ struct vring_virtqueue * vq ;
1140+ int err ;
1141+
1142+ vq = kmalloc (sizeof (* vq ), GFP_KERNEL );
1143+ if (!vq )
1144+ return NULL ;
1145+
1146+ vq -> packed_ring = false;
1147+ vq -> vq .callback = callback ;
1148+ vq -> vq .vdev = vdev ;
1149+ vq -> vq .name = name ;
1150+ vq -> vq .index = index ;
1151+ vq -> vq .reset = false;
1152+ vq -> we_own_ring = false;
1153+ vq -> notify = notify ;
1154+ vq -> weak_barriers = weak_barriers ;
1155+ #ifdef CONFIG_VIRTIO_HARDEN_NOTIFICATION
1156+ vq -> broken = true;
1157+ #else
1158+ vq -> broken = false;
1159+ #endif
1160+ vq -> dma_dev = dma_dev ;
1161+ vq -> use_dma_api = vring_use_dma_api (vdev );
1162+
1163+ vq -> indirect = virtio_has_feature (vdev , VIRTIO_RING_F_INDIRECT_DESC ) &&
1164+ !context ;
1165+ vq -> event = virtio_has_feature (vdev , VIRTIO_RING_F_EVENT_IDX );
1166+
1167+ if (virtio_has_feature (vdev , VIRTIO_F_ORDER_PLATFORM ))
1168+ vq -> weak_barriers = false;
1169+
1170+ err = vring_alloc_state_extra_split (vring_split );
1171+ if (err ) {
1172+ kfree (vq );
1173+ return NULL ;
1174+ }
1175+
1176+ virtqueue_vring_init_split (vring_split , vq );
1177+
1178+ virtqueue_init (vq , vring_split -> vring .num );
1179+ virtqueue_vring_attach_split (vq , vring_split );
1180+
1181+ spin_lock (& vdev -> vqs_list_lock );
1182+ list_add_tail (& vq -> vq .list , & vdev -> vqs );
1183+ spin_unlock (& vdev -> vqs_list_lock );
1184+ return & vq -> vq ;
1185+ }
1186+
11381187static struct virtqueue * vring_create_virtqueue_split (
11391188 unsigned int index ,
11401189 unsigned int num ,
@@ -1157,7 +1206,7 @@ static struct virtqueue *vring_create_virtqueue_split(
11571206 if (err )
11581207 return NULL ;
11591208
1160- vq = __vring_new_virtqueue (index , & vring_split , vdev , weak_barriers ,
1209+ vq = __vring_new_virtqueue_split (index , & vring_split , vdev , weak_barriers ,
11611210 context , notify , callback , name , dma_dev );
11621211 if (!vq ) {
11631212 vring_free_split (& vring_split , vdev , dma_dev );
@@ -2055,36 +2104,29 @@ static void virtqueue_reinit_packed(struct vring_virtqueue *vq)
20552104 virtqueue_vring_init_packed (& vq -> packed , !!vq -> vq .callback );
20562105}
20572106
2058- static struct virtqueue * vring_create_virtqueue_packed (
2059- unsigned int index ,
2060- unsigned int num ,
2061- unsigned int vring_align ,
2062- struct virtio_device * vdev ,
2063- bool weak_barriers ,
2064- bool may_reduce_num ,
2065- bool context ,
2066- bool (* notify )(struct virtqueue * ),
2067- void (* callback )(struct virtqueue * ),
2068- const char * name ,
2069- struct device * dma_dev )
2107+ static struct virtqueue * __vring_new_virtqueue_packed (unsigned int index ,
2108+ struct vring_virtqueue_packed * vring_packed ,
2109+ struct virtio_device * vdev ,
2110+ bool weak_barriers ,
2111+ bool context ,
2112+ bool (* notify )(struct virtqueue * ),
2113+ void (* callback )(struct virtqueue * ),
2114+ const char * name ,
2115+ struct device * dma_dev )
20702116{
2071- struct vring_virtqueue_packed vring_packed = {};
20722117 struct vring_virtqueue * vq ;
20732118 int err ;
20742119
2075- if (vring_alloc_queue_packed (& vring_packed , vdev , num , dma_dev ))
2076- goto err_ring ;
2077-
20782120 vq = kmalloc (sizeof (* vq ), GFP_KERNEL );
20792121 if (!vq )
2080- goto err_vq ;
2122+ return NULL ;
20812123
20822124 vq -> vq .callback = callback ;
20832125 vq -> vq .vdev = vdev ;
20842126 vq -> vq .name = name ;
20852127 vq -> vq .index = index ;
20862128 vq -> vq .reset = false;
2087- vq -> we_own_ring = true ;
2129+ vq -> we_own_ring = false ;
20882130 vq -> notify = notify ;
20892131 vq -> weak_barriers = weak_barriers ;
20902132#ifdef CONFIG_VIRTIO_HARDEN_NOTIFICATION
@@ -2103,26 +2145,52 @@ static struct virtqueue *vring_create_virtqueue_packed(
21032145 if (virtio_has_feature (vdev , VIRTIO_F_ORDER_PLATFORM ))
21042146 vq -> weak_barriers = false;
21052147
2106- err = vring_alloc_state_extra_packed (& vring_packed );
2107- if (err )
2108- goto err_state_extra ;
2148+ err = vring_alloc_state_extra_packed (vring_packed );
2149+ if (err ) {
2150+ kfree (vq );
2151+ return NULL ;
2152+ }
21092153
2110- virtqueue_vring_init_packed (& vring_packed , !!callback );
2154+ virtqueue_vring_init_packed (vring_packed , !!callback );
21112155
2112- virtqueue_init (vq , num );
2113- virtqueue_vring_attach_packed (vq , & vring_packed );
2156+ virtqueue_init (vq , vring_packed -> vring . num );
2157+ virtqueue_vring_attach_packed (vq , vring_packed );
21142158
21152159 spin_lock (& vdev -> vqs_list_lock );
21162160 list_add_tail (& vq -> vq .list , & vdev -> vqs );
21172161 spin_unlock (& vdev -> vqs_list_lock );
21182162 return & vq -> vq ;
2163+ }
21192164
2120- err_state_extra :
2121- kfree (vq );
2122- err_vq :
2123- vring_free_packed (& vring_packed , vdev , dma_dev );
2124- err_ring :
2125- return NULL ;
2165+ static struct virtqueue * vring_create_virtqueue_packed (
2166+ unsigned int index ,
2167+ unsigned int num ,
2168+ unsigned int vring_align ,
2169+ struct virtio_device * vdev ,
2170+ bool weak_barriers ,
2171+ bool may_reduce_num ,
2172+ bool context ,
2173+ bool (* notify )(struct virtqueue * ),
2174+ void (* callback )(struct virtqueue * ),
2175+ const char * name ,
2176+ struct device * dma_dev )
2177+ {
2178+ struct vring_virtqueue_packed vring_packed = {};
2179+ struct virtqueue * vq ;
2180+
2181+ if (vring_alloc_queue_packed (& vring_packed , vdev , num , dma_dev ))
2182+ return NULL ;
2183+
2184+ vq = __vring_new_virtqueue_packed (index , & vring_packed , vdev , weak_barriers ,
2185+ context , notify , callback , name , dma_dev );
2186+ if (!vq ) {
2187+ vring_free_packed (& vring_packed , vdev , dma_dev );
2188+ return NULL ;
2189+ }
2190+
2191+ to_vvq (vq )-> we_own_ring = true;
2192+
2193+ return vq ;
21262194}
21272195
21282196static int virtqueue_resize_packed (struct virtqueue * _vq , u32 num )
@@ -2650,68 +2718,6 @@ irqreturn_t vring_interrupt(int irq, void *_vq)
26502718}
26512719EXPORT_SYMBOL_GPL (vring_interrupt );
26522720
2653- /* Only available for split ring */
2654- static struct virtqueue * __vring_new_virtqueue (unsigned int index ,
2655- struct vring_virtqueue_split * vring_split ,
2656- struct virtio_device * vdev ,
2657- bool weak_barriers ,
2658- bool context ,
2659- bool (* notify )(struct virtqueue * ),
2660- void (* callback )(struct virtqueue * ),
2661- const char * name ,
2662- struct device * dma_dev )
2663- {
2664- struct vring_virtqueue * vq ;
2665- int err ;
2666-
2667- if (virtio_has_feature (vdev , VIRTIO_F_RING_PACKED ))
2668- return NULL ;
2669-
2670- vq = kmalloc (sizeof (* vq ), GFP_KERNEL );
2671- if (!vq )
2672- return NULL ;
2673-
2674- vq -> packed_ring = false;
2675- vq -> vq .callback = callback ;
2676- vq -> vq .vdev = vdev ;
2677- vq -> vq .name = name ;
2678- vq -> vq .index = index ;
2679- vq -> vq .reset = false;
2680- vq -> we_own_ring = false;
2681- vq -> notify = notify ;
2682- vq -> weak_barriers = weak_barriers ;
2683- #ifdef CONFIG_VIRTIO_HARDEN_NOTIFICATION
2684- vq -> broken = true;
2685- #else
2686- vq -> broken = false;
2687- #endif
2688- vq -> dma_dev = dma_dev ;
2689- vq -> use_dma_api = vring_use_dma_api (vdev );
2690-
2691- vq -> indirect = virtio_has_feature (vdev , VIRTIO_RING_F_INDIRECT_DESC ) &&
2692- !context ;
2693- vq -> event = virtio_has_feature (vdev , VIRTIO_RING_F_EVENT_IDX );
2694-
2695- if (virtio_has_feature (vdev , VIRTIO_F_ORDER_PLATFORM ))
2696- vq -> weak_barriers = false;
2697-
2698- err = vring_alloc_state_extra_split (vring_split );
2699- if (err ) {
2700- kfree (vq );
2701- return NULL ;
2702- }
2703-
2704- virtqueue_vring_init_split (vring_split , vq );
2705-
2706- virtqueue_init (vq , vring_split -> vring .num );
2707- virtqueue_vring_attach_split (vq , vring_split );
2708-
2709- spin_lock (& vdev -> vqs_list_lock );
2710- list_add_tail (& vq -> vq .list , & vdev -> vqs );
2711- spin_unlock (& vdev -> vqs_list_lock );
2712- return & vq -> vq ;
2713- }
2714-
27152721struct virtqueue * vring_create_virtqueue (
27162722 unsigned int index ,
27172723 unsigned int num ,
@@ -2846,7 +2852,6 @@ int virtqueue_reset(struct virtqueue *_vq,
28462852}
28472853EXPORT_SYMBOL_GPL (virtqueue_reset );
28482854
2849- /* Only available for split ring */
28502855struct virtqueue * vring_new_virtqueue (unsigned int index ,
28512856 unsigned int num ,
28522857 unsigned int vring_align ,
@@ -2860,11 +2865,19 @@ struct virtqueue *vring_new_virtqueue(unsigned int index,
28602865{
28612866 struct vring_virtqueue_split vring_split = {};
28622867
2863- if (virtio_has_feature (vdev , VIRTIO_F_RING_PACKED ))
2864- return NULL ;
2868+ if (virtio_has_feature (vdev , VIRTIO_F_RING_PACKED )) {
2869+ struct vring_virtqueue_packed vring_packed = {};
2870+
2871+ vring_packed .vring .num = num ;
2872+ vring_packed .vring .desc = pages ;
2873+ return __vring_new_virtqueue_packed (index , & vring_packed ,
2874+ vdev , weak_barriers ,
2875+ context , notify , callback ,
2876+ name , vdev -> dev .parent );
2877+ }
28652878
28662879 vring_init (& vring_split .vring , num , pages , vring_align );
2867- return __vring_new_virtqueue (index , & vring_split , vdev , weak_barriers ,
2880+ return __vring_new_virtqueue_split (index , & vring_split , vdev , weak_barriers ,
28682881 context , notify , callback , name ,
28692882 vdev -> dev .parent );
28702883}
0 commit comments