lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Mon, 7 Feb 2022 14:45:02 +0800 From: Jason Wang <jasowang@...hat.com> To: Xuan Zhuo <xuanzhuo@...ux.alibaba.com>, virtualization@...ts.linux-foundation.org, netdev@...r.kernel.org Cc: "Michael S. Tsirkin" <mst@...hat.com>, "David S. Miller" <davem@...emloft.net>, Jakub Kicinski <kuba@...nel.org>, Alexei Starovoitov <ast@...nel.org>, Daniel Borkmann <daniel@...earbox.net>, Jesper Dangaard Brouer <hawk@...nel.org>, John Fastabend <john.fastabend@...il.com>, bpf@...r.kernel.org Subject: Re: [PATCH v3 03/17] virtio: queue_reset: struct virtio_config_ops add callbacks for queue_reset 在 2022/1/26 下午3:35, Xuan Zhuo 写道: > Performing reset on a queue is divided into two steps: > > 1. reset_vq: reset one vq > 2. enable_reset_vq: re-enable the reset queue > > In the first step, these tasks will be completed: > 1. notify the hardware queue to reset > 2. recycle the buffer from vq > 3. release the ring of the vq > > The second step is similar to find vqs, Not sure, since find_vqs will usually try to allocate interrupts. > passing parameters callback and > name, etc. Based on the original vq, the ring is re-allocated and > configured to the backend. I wonder whether we really have such requirement. For example, do we really have a use case that may change: vq callback, ctx, ring_num or even re-create the virtqueue? Thanks > > So add two callbacks reset_vq, enable_reset_vq to struct > virtio_config_ops. > > Add a structure for passing parameters. This will facilitate subsequent > expansion of the parameters of enable reset vq. > There is currently only one default extended parameter ring_num. > > Signed-off-by: Xuan Zhuo <xuanzhuo@...ux.alibaba.com> > --- > include/linux/virtio_config.h | 43 ++++++++++++++++++++++++++++++++++- > 1 file changed, 42 insertions(+), 1 deletion(-) > > diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h > index 4d107ad31149..51dd8461d1b6 100644 > --- a/include/linux/virtio_config.h > +++ b/include/linux/virtio_config.h > @@ -16,6 +16,44 @@ struct virtio_shm_region { > u64 len; > }; > > +typedef void vq_callback_t(struct virtqueue *); > + > +/* virtio_reset_vq: specify parameters for queue_reset > + * > + * vdev: the device > + * queue_index: the queue index > + * > + * free_unused_cb: callback to free unused bufs > + * data: used by free_unused_cb > + * > + * callback: callback for the virtqueue, NULL for vq that do not need a > + * callback > + * name: virtqueue names (mainly for debugging), NULL for vq unused by > + * driver > + * ctx: ctx > + * > + * ring_num: specify ring num for the vq to be re-enabled. 0 means use the > + * default value. MUST be a power of 2. > + */ > +struct virtio_reset_vq; > +typedef void vq_reset_callback_t(struct virtio_reset_vq *param, void *buf); > +struct virtio_reset_vq { > + struct virtio_device *vdev; > + u16 queue_index; > + > + /* reset vq param */ > + vq_reset_callback_t *free_unused_cb; > + void *data; > + > + /* enable reset vq param */ > + vq_callback_t *callback; > + const char *name; > + const bool *ctx; > + > + /* ext enable reset vq param */ > + u16 ring_num; > +}; > + > /** > * virtio_config_ops - operations for configuring a virtio device > * Note: Do not assume that a transport implements all of the operations > @@ -74,8 +112,9 @@ struct virtio_shm_region { > * @set_vq_affinity: set the affinity for a virtqueue (optional). > * @get_vq_affinity: get the affinity for a virtqueue (optional). > * @get_shm_region: get a shared memory region based on the index. > + * @reset_vq: reset a queue individually > + * @enable_reset_vq: enable a reset queue > */ > -typedef void vq_callback_t(struct virtqueue *); > struct virtio_config_ops { > void (*enable_cbs)(struct virtio_device *vdev); > void (*get)(struct virtio_device *vdev, unsigned offset, > @@ -100,6 +139,8 @@ struct virtio_config_ops { > int index); > bool (*get_shm_region)(struct virtio_device *vdev, > struct virtio_shm_region *region, u8 id); > + int (*reset_vq)(struct virtio_reset_vq *param); > + struct virtqueue *(*enable_reset_vq)(struct virtio_reset_vq *param); > }; > > /* If driver didn't advertise the feature, it will never appear. */
Powered by blists - more mailing lists