From: Kevin Wolf <kwolf@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com
Subject: [Qemu-devel] [PULL 22/47] virtio-blk: Convert VirtIOBlockReq.elem to pointer
Date: Fri, 27 Jun 2014 21:08:41 +0200 [thread overview]
Message-ID: <1403896146-3063-23-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1403896146-3063-1-git-send-email-kwolf@redhat.com>
From: Fam Zheng <famz@redhat.com>
This will make converging with dataplane code easier.
Add virtio_blk_free_request to handle the freeing of request internal
fields.
Signed-off-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
hw/block/virtio-blk.c | 85 +++++++++++++++++++++++-------------------
include/hw/virtio/virtio-blk.h | 2 +-
2 files changed, 47 insertions(+), 40 deletions(-)
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
index 4ff6487..b5cc385 100644
--- a/hw/block/virtio-blk.c
+++ b/hw/block/virtio-blk.c
@@ -27,6 +27,22 @@
#endif
#include "hw/virtio/virtio-bus.h"
+static VirtIOBlockReq *virtio_blk_alloc_request(VirtIOBlock *s)
+{
+ VirtIOBlockReq *req = g_slice_new0(VirtIOBlockReq);
+ req->dev = s;
+ req->elem = g_slice_new0(VirtQueueElement);
+ return req;
+}
+
+static void virtio_blk_free_request(VirtIOBlockReq *req)
+{
+ if (req) {
+ g_slice_free(VirtQueueElement, req->elem);
+ g_slice_free(VirtIOBlockReq, req);
+ }
+}
+
static void virtio_blk_req_complete(VirtIOBlockReq *req, int status)
{
VirtIOBlock *s = req->dev;
@@ -35,7 +51,7 @@ static void virtio_blk_req_complete(VirtIOBlockReq *req, int status)
trace_virtio_blk_req_complete(req, status);
stb_p(&req->in->status, status);
- virtqueue_push(s->vq, &req->elem, req->qiov.size + sizeof(*req->in));
+ virtqueue_push(s->vq, req->elem, req->qiov.size + sizeof(*req->in));
virtio_notify(vdev, s->vq);
}
@@ -51,7 +67,7 @@ static int virtio_blk_handle_rw_error(VirtIOBlockReq *req, int error,
} else if (action == BLOCK_ERROR_ACTION_REPORT) {
virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR);
bdrv_acct_done(s->bs, &req->acct);
- g_free(req);
+ virtio_blk_free_request(req);
}
bdrv_error_action(s->bs, action, is_read, error);
@@ -72,7 +88,7 @@ static void virtio_blk_rw_complete(void *opaque, int ret)
virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);
bdrv_acct_done(req->dev->bs, &req->acct);
- g_free(req);
+ virtio_blk_free_request(req);
}
static void virtio_blk_flush_complete(void *opaque, int ret)
@@ -87,27 +103,16 @@ static void virtio_blk_flush_complete(void *opaque, int ret)
virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);
bdrv_acct_done(req->dev->bs, &req->acct);
- g_free(req);
-}
-
-static VirtIOBlockReq *virtio_blk_alloc_request(VirtIOBlock *s)
-{
- VirtIOBlockReq *req = g_malloc(sizeof(*req));
- req->dev = s;
- req->qiov.size = 0;
- req->next = NULL;
- return req;
+ virtio_blk_free_request(req);
}
static VirtIOBlockReq *virtio_blk_get_request(VirtIOBlock *s)
{
VirtIOBlockReq *req = virtio_blk_alloc_request(s);
- if (req != NULL) {
- if (!virtqueue_pop(s->vq, &req->elem)) {
- g_free(req);
- return NULL;
- }
+ if (!virtqueue_pop(s->vq, req->elem)) {
+ virtio_blk_free_request(req);
+ return NULL;
}
return req;
@@ -236,9 +241,9 @@ static void virtio_blk_handle_scsi(VirtIOBlockReq *req)
{
int status;
- status = virtio_blk_handle_scsi_req(req->dev, &req->elem);
+ status = virtio_blk_handle_scsi_req(req->dev, req->elem);
virtio_blk_req_complete(req, status);
- g_free(req);
+ virtio_blk_free_request(req);
}
typedef struct MultiReqBuffer {
@@ -340,19 +345,19 @@ static void virtio_blk_handle_request(VirtIOBlockReq *req,
{
uint32_t type;
- if (req->elem.out_num < 1 || req->elem.in_num < 1) {
+ if (req->elem->out_num < 1 || req->elem->in_num < 1) {
error_report("virtio-blk missing headers");
exit(1);
}
- if (req->elem.out_sg[0].iov_len < sizeof(*req->out) ||
- req->elem.in_sg[req->elem.in_num - 1].iov_len < sizeof(*req->in)) {
+ if (req->elem->out_sg[0].iov_len < sizeof(*req->out) ||
+ req->elem->in_sg[req->elem->in_num - 1].iov_len < sizeof(*req->in)) {
error_report("virtio-blk header not in correct element");
exit(1);
}
- req->out = (void *)req->elem.out_sg[0].iov_base;
- req->in = (void *)req->elem.in_sg[req->elem.in_num - 1].iov_base;
+ req->out = (void *)req->elem->out_sg[0].iov_base;
+ req->in = (void *)req->elem->in_sg[req->elem->in_num - 1].iov_base;
type = ldl_p(&req->out->type);
@@ -367,23 +372,23 @@ static void virtio_blk_handle_request(VirtIOBlockReq *req,
* NB: per existing s/n string convention the string is
* terminated by '\0' only when shorter than buffer.
*/
- strncpy(req->elem.in_sg[0].iov_base,
+ strncpy(req->elem->in_sg[0].iov_base,
s->blk.serial ? s->blk.serial : "",
- MIN(req->elem.in_sg[0].iov_len, VIRTIO_BLK_ID_BYTES));
+ MIN(req->elem->in_sg[0].iov_len, VIRTIO_BLK_ID_BYTES));
virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);
- g_free(req);
+ virtio_blk_free_request(req);
} else if (type & VIRTIO_BLK_T_OUT) {
- qemu_iovec_init_external(&req->qiov, &req->elem.out_sg[1],
- req->elem.out_num - 1);
+ qemu_iovec_init_external(&req->qiov, &req->elem->out_sg[1],
+ req->elem->out_num - 1);
virtio_blk_handle_write(req, mrb);
} else if (type == VIRTIO_BLK_T_IN || type == VIRTIO_BLK_T_BARRIER) {
/* VIRTIO_BLK_T_IN is 0, so we can't just & it. */
- qemu_iovec_init_external(&req->qiov, &req->elem.in_sg[0],
- req->elem.in_num - 1);
+ qemu_iovec_init_external(&req->qiov, &req->elem->in_sg[0],
+ req->elem->in_num - 1);
virtio_blk_handle_read(req);
} else {
virtio_blk_req_complete(req, VIRTIO_BLK_S_UNSUPP);
- g_free(req);
+ virtio_blk_free_request(req);
}
}
@@ -598,7 +603,8 @@ static void virtio_blk_save(QEMUFile *f, void *opaque)
while (req) {
qemu_put_sbyte(f, 1);
- qemu_put_buffer(f, (unsigned char*)&req->elem, sizeof(req->elem));
+ qemu_put_buffer(f, (unsigned char *)req->elem,
+ sizeof(VirtQueueElement));
req = req->next;
}
qemu_put_sbyte(f, 0);
@@ -620,14 +626,15 @@ static int virtio_blk_load(QEMUFile *f, void *opaque, int version_id)
while (qemu_get_sbyte(f)) {
VirtIOBlockReq *req = virtio_blk_alloc_request(s);
- qemu_get_buffer(f, (unsigned char*)&req->elem, sizeof(req->elem));
+ qemu_get_buffer(f, (unsigned char *)req->elem,
+ sizeof(VirtQueueElement));
req->next = s->rq;
s->rq = req;
- virtqueue_map_sg(req->elem.in_sg, req->elem.in_addr,
- req->elem.in_num, 1);
- virtqueue_map_sg(req->elem.out_sg, req->elem.out_addr,
- req->elem.out_num, 0);
+ virtqueue_map_sg(req->elem->in_sg, req->elem->in_addr,
+ req->elem->in_num, 1);
+ virtqueue_map_sg(req->elem->out_sg, req->elem->out_addr,
+ req->elem->out_num, 0);
}
return 0;
diff --git a/include/hw/virtio/virtio-blk.h b/include/hw/virtio/virtio-blk.h
index d05d177..b495e42 100644
--- a/include/hw/virtio/virtio-blk.h
+++ b/include/hw/virtio/virtio-blk.h
@@ -136,7 +136,7 @@ typedef struct VirtIOBlock {
typedef struct VirtIOBlockReq {
VirtIOBlock *dev;
- VirtQueueElement elem;
+ VirtQueueElement *elem;
struct virtio_blk_inhdr *in;
struct virtio_blk_outhdr *out;
QEMUIOVector qiov;
--
1.8.3.1
next prev parent reply other threads:[~2014-06-27 19:09 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-27 19:08 [Qemu-devel] [PULL 00/47] Block patches for 2.1.0-rc0 Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 01/47] blockjob: Add block_job_yield() Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 02/47] mirror: Go through ready -> complete process for 0 len image Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 03/47] qemu-iotests: Test BLOCK_JOB_READY event for 0Kb image active commit Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 04/47] qemu-iotests: Test 0-length image for mirror Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 05/47] block/nfs: fix url parameter checking Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 06/47] block/nfs: add knob to set readahead Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 07/47] block: Create bdrv_fill_options() Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 08/47] block: Move bdrv_fill_options() call to bdrv_open() Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 09/47] block: Move json: parsing to bdrv_fill_options() Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 10/47] block: Always pass driver name through options QDict Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 11/47] block: Use common driver selection code for bdrv_open_file() Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 12/47] block: Inline bdrv_file_open() Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 13/47] block: Remove second bdrv_open() recursion Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 14/47] block: Catch backing files assigned to non-COW drivers Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 15/47] block: Remove a special case for protocols Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 16/47] qemu_opts_append: Play nicely with QemuOptsList's head Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 17/47] block: check for RESIZE blocker in the QMP command, not bdrv_truncate() Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 18/47] block: add qemu-iotest for resize base during live commit Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 19/47] quorum: Add the rewrite-corrupted parameter to quorum Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 20/47] block: Add node-name argument to drive-mirror Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 21/47] virtio-blk: Move VirtIOBlockReq to header Kevin Wolf
2014-06-27 19:08 ` Kevin Wolf [this message]
2014-06-27 19:08 ` [Qemu-devel] [PULL 23/47] virtio-blk: Drop bounce buffer from dataplane code Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 24/47] virtio-blk: Drop VirtIOBlockRequest.read Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 25/47] virtio-blk: Replace VirtIOBlockRequest with VirtIOBlockReq Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 26/47] virtio-blk: Use VirtIOBlockReq.in to drop VirtIOBlockReq.inhdr Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 27/47] virtio-blk: Convert VirtIOBlockReq.out to structrue Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 28/47] virtio-blk: Fill in VirtIOBlockReq.out in dataplane code Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 29/47] virtio-blk: Fix and clean up the in_sg and out_sg check Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 30/47] block: make bdrv_query_stats() static Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 31/47] block: acquire AioContext in qmp_query_blockstats() Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 32/47] virtio-blk: Make request completion function virtual Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 33/47] virtio-blk: Export request handling functions to dataplane Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 34/47] virtio-blk: Schedule BH in the right context Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 35/47] virtio-blk: Unify {non-, }dataplane's request handlings Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 36/47] virtio-blk: Rename complete_request_early to complete_request_vring Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 37/47] blockjob: Fix recent BLOCK_JOB_READY regression Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 38/47] blockjob: Fix recent BLOCK_JOB_ERROR regression Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 39/47] block: Add replaces argument to drive-mirror Kevin Wolf
2014-06-27 19:08 ` [Qemu-devel] [PULL 40/47] qemu-iotests: Add TestRepairQuorum to 041 to test drive-mirror node-name mode Kevin Wolf
2014-06-27 19:09 ` [Qemu-devel] [PULL 41/47] block.c: Don't return success for bdrv_append_temp_snapshot() failure Kevin Wolf
2014-06-27 19:09 ` [Qemu-devel] [PULL 42/47] iotests: Allow out-of-tree run Kevin Wolf
2014-06-27 19:09 ` [Qemu-devel] [PULL 43/47] configure: Enable out-of-tree iotests Kevin Wolf
2014-06-27 19:09 ` [Qemu-devel] [PULL 44/47] iotests: Source common.env Kevin Wolf
2014-06-27 19:09 ` [Qemu-devel] [PULL 45/47] iotests: Use $PYTHON for Python scripts Kevin Wolf
2014-06-27 19:09 ` [Qemu-devel] [PULL 46/47] iotests: Drop Python version from 065's Shebang Kevin Wolf
2014-06-27 19:09 ` [Qemu-devel] [PULL 47/47] iotests: Fix 083 for out-of-tree builds Kevin Wolf
2014-06-29 15:15 ` [Qemu-devel] [PULL 00/47] Block patches for 2.1.0-rc0 Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1403896146-3063-23-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).