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
