@@ -2152,6 +2152,43 @@ static int virtqueue_resize_packed(struct virtqueue *_vq, u32 num)
21522152 return - ENOMEM ;
21532153}
21542154
2155+ static int virtqueue_disable_and_recycle (struct virtqueue * _vq ,
2156+ void (* recycle )(struct virtqueue * vq , void * buf ))
2157+ {
2158+ struct vring_virtqueue * vq = to_vvq (_vq );
2159+ struct virtio_device * vdev = vq -> vq .vdev ;
2160+ void * buf ;
2161+ int err ;
2162+
2163+ if (!vq -> we_own_ring )
2164+ return - EPERM ;
2165+
2166+ if (!vdev -> config -> disable_vq_and_reset )
2167+ return - ENOENT ;
2168+
2169+ if (!vdev -> config -> enable_vq_after_reset )
2170+ return - ENOENT ;
2171+
2172+ err = vdev -> config -> disable_vq_and_reset (_vq );
2173+ if (err )
2174+ return err ;
2175+
2176+ while ((buf = virtqueue_detach_unused_buf (_vq )) != NULL )
2177+ recycle (_vq , buf );
2178+
2179+ return 0 ;
2180+ }
2181+
2182+ static int virtqueue_enable_after_reset (struct virtqueue * _vq )
2183+ {
2184+ struct vring_virtqueue * vq = to_vvq (_vq );
2185+ struct virtio_device * vdev = vq -> vq .vdev ;
2186+
2187+ if (vdev -> config -> enable_vq_after_reset (_vq ))
2188+ return - EBUSY ;
2189+
2190+ return 0 ;
2191+ }
21552192
21562193/*
21572194 * Generic functions and exported symbols.
@@ -2702,13 +2739,8 @@ int virtqueue_resize(struct virtqueue *_vq, u32 num,
27022739 void (* recycle )(struct virtqueue * vq , void * buf ))
27032740{
27042741 struct vring_virtqueue * vq = to_vvq (_vq );
2705- struct virtio_device * vdev = vq -> vq .vdev ;
2706- void * buf ;
27072742 int err ;
27082743
2709- if (!vq -> we_own_ring )
2710- return - EPERM ;
2711-
27122744 if (num > vq -> vq .num_max )
27132745 return - E2BIG ;
27142746
@@ -2718,28 +2750,16 @@ int virtqueue_resize(struct virtqueue *_vq, u32 num,
27182750 if ((vq -> packed_ring ? vq -> packed .vring .num : vq -> split .vring .num ) == num )
27192751 return 0 ;
27202752
2721- if (!vdev -> config -> disable_vq_and_reset )
2722- return - ENOENT ;
2723-
2724- if (!vdev -> config -> enable_vq_after_reset )
2725- return - ENOENT ;
2726-
2727- err = vdev -> config -> disable_vq_and_reset (_vq );
2753+ err = virtqueue_disable_and_recycle (_vq , recycle );
27282754 if (err )
27292755 return err ;
27302756
2731- while ((buf = virtqueue_detach_unused_buf (_vq )) != NULL )
2732- recycle (_vq , buf );
2733-
27342757 if (vq -> packed_ring )
27352758 err = virtqueue_resize_packed (_vq , num );
27362759 else
27372760 err = virtqueue_resize_split (_vq , num );
27382761
2739- if (vdev -> config -> enable_vq_after_reset (_vq ))
2740- return - EBUSY ;
2741-
2742- return err ;
2762+ return virtqueue_enable_after_reset (_vq );
27432763}
27442764EXPORT_SYMBOL_GPL (virtqueue_resize );
27452765
0 commit comments