Michael S. Tsirkin
2022-Jul-01 06:31 UTC
[PATCH v11 25/40] virtio: allow to unbreak/break virtqueue individually
On Wed, Jun 29, 2022 at 02:56:41PM +0800, Xuan Zhuo wrote:> This patch allows the new introduced > __virtqueue_break()/__virtqueue_unbreak() to break/unbreak the > virtqueue. > > Signed-off-by: Xuan Zhuo <xuanzhuo at linux.alibaba.com>I wonder how this interacts with the hardening patches. Jason?> --- > drivers/virtio/virtio_ring.c | 24 ++++++++++++++++++++++++ > include/linux/virtio.h | 3 +++ > 2 files changed, 27 insertions(+) > > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c > index 5ec43607cc15..7b02be7fce67 100644 > --- a/drivers/virtio/virtio_ring.c > +++ b/drivers/virtio/virtio_ring.c > @@ -2744,6 +2744,30 @@ unsigned int virtqueue_get_vring_size(struct virtqueue *_vq) > } > EXPORT_SYMBOL_GPL(virtqueue_get_vring_size); > > +/* > + * This function should only be called by the core, not directly by the driver. > + */ > +void __virtqueue_break(struct virtqueue *_vq) > +{ > + struct vring_virtqueue *vq = to_vvq(_vq); > + > + /* Pairs with READ_ONCE() in virtqueue_is_broken(). */ > + WRITE_ONCE(vq->broken, true); > +} > +EXPORT_SYMBOL_GPL(__virtqueue_break); > + > +/* > + * This function should only be called by the core, not directly by the driver. > + */ > +void __virtqueue_unbreak(struct virtqueue *_vq) > +{ > + struct vring_virtqueue *vq = to_vvq(_vq); > + > + /* Pairs with READ_ONCE() in virtqueue_is_broken(). */ > + WRITE_ONCE(vq->broken, false); > +}I don't think these "Pairs" comments have any value.> +EXPORT_SYMBOL_GPL(__virtqueue_unbreak); > + > bool virtqueue_is_broken(struct virtqueue *_vq) > { > struct vring_virtqueue *vq = to_vvq(_vq); > diff --git a/include/linux/virtio.h b/include/linux/virtio.h > index 1272566adec6..dc474a0d48d1 100644 > --- a/include/linux/virtio.h > +++ b/include/linux/virtio.h > @@ -138,6 +138,9 @@ bool is_virtio_device(struct device *dev); > void virtio_break_device(struct virtio_device *dev); > void __virtio_unbreak_device(struct virtio_device *dev); > > +void __virtqueue_break(struct virtqueue *_vq); > +void __virtqueue_unbreak(struct virtqueue *_vq); > + > void virtio_config_changed(struct virtio_device *dev); > #ifdef CONFIG_PM_SLEEP > int virtio_device_freeze(struct virtio_device *dev); > -- > 2.31.0
Jason Wang
2022-Jul-01 09:36 UTC
[PATCH v11 25/40] virtio: allow to unbreak/break virtqueue individually
? 2022/7/1 14:31, Michael S. Tsirkin ??:> On Wed, Jun 29, 2022 at 02:56:41PM +0800, Xuan Zhuo wrote: >> This patch allows the new introduced >> __virtqueue_break()/__virtqueue_unbreak() to break/unbreak the >> virtqueue. >> >> Signed-off-by: Xuan Zhuo <xuanzhuo at linux.alibaba.com> > I wonder how this interacts with the hardening patches. > Jason?Consider we've marked it as broken, I think we don't need to care about the hardening in this series. Just make it work without hardening. And I will handle vq reset when rework the IRQ hardening. Thanks> >> --- >> drivers/virtio/virtio_ring.c | 24 ++++++++++++++++++++++++ >> include/linux/virtio.h | 3 +++ >> 2 files changed, 27 insertions(+) >> >> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c >> index 5ec43607cc15..7b02be7fce67 100644 >> --- a/drivers/virtio/virtio_ring.c >> +++ b/drivers/virtio/virtio_ring.c >> @@ -2744,6 +2744,30 @@ unsigned int virtqueue_get_vring_size(struct virtqueue *_vq) >> } >> EXPORT_SYMBOL_GPL(virtqueue_get_vring_size); >> >> +/* >> + * This function should only be called by the core, not directly by the driver. >> + */ >> +void __virtqueue_break(struct virtqueue *_vq) >> +{ >> + struct vring_virtqueue *vq = to_vvq(_vq); >> + >> + /* Pairs with READ_ONCE() in virtqueue_is_broken(). */ >> + WRITE_ONCE(vq->broken, true); >> +} >> +EXPORT_SYMBOL_GPL(__virtqueue_break); >> + >> +/* >> + * This function should only be called by the core, not directly by the driver. >> + */ >> +void __virtqueue_unbreak(struct virtqueue *_vq) >> +{ >> + struct vring_virtqueue *vq = to_vvq(_vq); >> + >> + /* Pairs with READ_ONCE() in virtqueue_is_broken(). */ >> + WRITE_ONCE(vq->broken, false); >> +} > I don't think these "Pairs" comments have any value. > > >> +EXPORT_SYMBOL_GPL(__virtqueue_unbreak); >> + >> bool virtqueue_is_broken(struct virtqueue *_vq) >> { >> struct vring_virtqueue *vq = to_vvq(_vq); >> diff --git a/include/linux/virtio.h b/include/linux/virtio.h >> index 1272566adec6..dc474a0d48d1 100644 >> --- a/include/linux/virtio.h >> +++ b/include/linux/virtio.h >> @@ -138,6 +138,9 @@ bool is_virtio_device(struct device *dev); >> void virtio_break_device(struct virtio_device *dev); >> void __virtio_unbreak_device(struct virtio_device *dev); >> >> +void __virtqueue_break(struct virtqueue *_vq); >> +void __virtqueue_unbreak(struct virtqueue *_vq); >> + >> void virtio_config_changed(struct virtio_device *dev); >> #ifdef CONFIG_PM_SLEEP >> int virtio_device_freeze(struct virtio_device *dev); >> -- >> 2.31.0