On Thu, Jun 11, 2020 at 04:24:52PM +0100, Stefan Hajnoczi wrote:
On Fri, Jun 05, 2020 at 07:35:37AM +0800, Coiby Xu wrote:
+static void coroutine_fn vu_block_virtio_process_req(void *opaque)
+{
+ struct req_data *data = opaque;
+ VuServer *server = data->server;
+ VuVirtq *vq = data->vq;
+ VuVirtqElement *elem = data->elem;
+ uint32_t type;
+ VuBlockReq *req;
+
+ VuBlockDev *vdev_blk = get_vu_block_device_by_server(server);
+ BlockBackend *backend = vdev_blk->backend;
+
+ struct iovec *in_iov = elem->in_sg;
+ struct iovec *out_iov = elem->out_sg;
+ unsigned in_num = elem->in_num;
+ unsigned out_num = elem->out_num;
+ /* refer to hw/block/virtio_blk.c */
+ if (elem->out_num < 1 || elem->in_num < 1) {
+ error_report("virtio-blk request missing headers");
+ free(elem);
+ return;
+ }
+
+ req = g_new0(VuBlockReq, 1);
elem was allocated with enough space for VuBlockReq. Can this allocation
be eliminated?
typedef struct VuBlockReq {
- VuVirtqElement *elem;
+ VuVirtqElement elem;
int64_t sector_num;
size_t size;
struct virtio_blk_inhdr *in;
struct virtio_blk_outhdr out;
VuServer *server;
struct VuVirtq *vq;
} VuBlockReq;
Thank you for review this patch. Other issues for this patch have been
addressed in v9 except for this one. I'm not sure what you mean. I can't
find a way that doesn't require to allocate a VuBlockReq struct.
--
Best regards,
Coiby