@@ -223,15 +223,6 @@ struct vring_virtqueue {
223
223
#endif
224
224
};
225
225
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 );
235
226
static struct vring_desc_extra * vring_alloc_desc_extra (unsigned int num );
236
227
static void vring_free (struct virtqueue * _vq );
237
228
@@ -1135,6 +1126,64 @@ static int vring_alloc_queue_split(struct vring_virtqueue_split *vring_split,
1135
1126
return 0 ;
1136
1127
}
1137
1128
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
+
1138
1187
static struct virtqueue * vring_create_virtqueue_split (
1139
1188
unsigned int index ,
1140
1189
unsigned int num ,
@@ -1157,7 +1206,7 @@ static struct virtqueue *vring_create_virtqueue_split(
1157
1206
if (err )
1158
1207
return NULL ;
1159
1208
1160
- vq = __vring_new_virtqueue (index , & vring_split , vdev , weak_barriers ,
1209
+ vq = __vring_new_virtqueue_split (index , & vring_split , vdev , weak_barriers ,
1161
1210
context , notify , callback , name , dma_dev );
1162
1211
if (!vq ) {
1163
1212
vring_free_split (& vring_split , vdev , dma_dev );
@@ -2055,36 +2104,29 @@ static void virtqueue_reinit_packed(struct vring_virtqueue *vq)
2055
2104
virtqueue_vring_init_packed (& vq -> packed , !!vq -> vq .callback );
2056
2105
}
2057
2106
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 )
2070
2116
{
2071
- struct vring_virtqueue_packed vring_packed = {};
2072
2117
struct vring_virtqueue * vq ;
2073
2118
int err ;
2074
2119
2075
- if (vring_alloc_queue_packed (& vring_packed , vdev , num , dma_dev ))
2076
- goto err_ring ;
2077
-
2078
2120
vq = kmalloc (sizeof (* vq ), GFP_KERNEL );
2079
2121
if (!vq )
2080
- goto err_vq ;
2122
+ return NULL ;
2081
2123
2082
2124
vq -> vq .callback = callback ;
2083
2125
vq -> vq .vdev = vdev ;
2084
2126
vq -> vq .name = name ;
2085
2127
vq -> vq .index = index ;
2086
2128
vq -> vq .reset = false;
2087
- vq -> we_own_ring = true ;
2129
+ vq -> we_own_ring = false ;
2088
2130
vq -> notify = notify ;
2089
2131
vq -> weak_barriers = weak_barriers ;
2090
2132
#ifdef CONFIG_VIRTIO_HARDEN_NOTIFICATION
@@ -2103,26 +2145,52 @@ static struct virtqueue *vring_create_virtqueue_packed(
2103
2145
if (virtio_has_feature (vdev , VIRTIO_F_ORDER_PLATFORM ))
2104
2146
vq -> weak_barriers = false;
2105
2147
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
+ }
2109
2153
2110
- virtqueue_vring_init_packed (& vring_packed , !!callback );
2154
+ virtqueue_vring_init_packed (vring_packed , !!callback );
2111
2155
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 );
2114
2158
2115
2159
spin_lock (& vdev -> vqs_list_lock );
2116
2160
list_add_tail (& vq -> vq .list , & vdev -> vqs );
2117
2161
spin_unlock (& vdev -> vqs_list_lock );
2118
2162
return & vq -> vq ;
2163
+ }
2119
2164
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 ;
2126
2194
}
2127
2195
2128
2196
static int virtqueue_resize_packed (struct virtqueue * _vq , u32 num )
@@ -2650,68 +2718,6 @@ irqreturn_t vring_interrupt(int irq, void *_vq)
2650
2718
}
2651
2719
EXPORT_SYMBOL_GPL (vring_interrupt );
2652
2720
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
-
2715
2721
struct virtqueue * vring_create_virtqueue (
2716
2722
unsigned int index ,
2717
2723
unsigned int num ,
@@ -2846,7 +2852,6 @@ int virtqueue_reset(struct virtqueue *_vq,
2846
2852
}
2847
2853
EXPORT_SYMBOL_GPL (virtqueue_reset );
2848
2854
2849
- /* Only available for split ring */
2850
2855
struct virtqueue * vring_new_virtqueue (unsigned int index ,
2851
2856
unsigned int num ,
2852
2857
unsigned int vring_align ,
@@ -2860,11 +2865,19 @@ struct virtqueue *vring_new_virtqueue(unsigned int index,
2860
2865
{
2861
2866
struct vring_virtqueue_split vring_split = {};
2862
2867
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
+ }
2865
2878
2866
2879
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 ,
2868
2881
context , notify , callback , name ,
2869
2882
vdev -> dev .parent );
2870
2883
}
0 commit comments