* [RFC v3] RBD: Add support readv,writev for rbd
@ 2017-01-21 10:59 ` jazeltq
0 siblings, 0 replies; 25+ messages in thread
From: jazeltq @ 2017-01-21 10:59 UTC (permalink / raw)
To: jdurgin, jcody, jdillama, kwolf, mreitz, qemu-block
Cc: qemu-devel, ceph-devel, tianqing
From: tianqing <tianqing@unitedstack.com>
Rbd can do readv and writev directly, so wo do not need to transform
iov to buf or vice versa any more.
Signed-off-by: tianqing <tianqing@unitedstack.com>
---
block/rbd.c | 47 +++++++++++++++++++++++++++++++++++++++++------
1 file changed, 41 insertions(+), 6 deletions(-)
diff --git a/block/rbd.c b/block/rbd.c
index a57b3e3..4add4dd 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
BlockAIOCB common;
int64_t ret;
QEMUIOVector *qiov;
+/* Note:
+ * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
+ */
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *bounce;
+#endif
RBDAIOCmd cmd;
int error;
struct BDRVRBDState *s;
@@ -83,7 +88,9 @@ typedef struct RADOSCB {
RBDAIOCB *acb;
struct BDRVRBDState *s;
int64_t size;
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *buf;
+#endif
int64_t ret;
} RADOSCB;
@@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
}
} else {
if (r < 0) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf, 0, rcb->size);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
+#endif
acb->ret = r;
acb->error = 1;
} else if (r < rcb->size) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf + r, 0, rcb->size - r);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov,
+ r, 0, acb->qiov->size - r);
+#endif
+
if (!acb->error) {
acb->ret = rcb->size;
}
@@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
if (acb->cmd == RBD_AIO_READ) {
qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
}
qemu_vfree(acb->bounce);
+#endif
acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
qemu_aio_unref(acb);
@@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
RBDAIOCB *acb;
RADOSCB *rcb = NULL;
rbd_completion_t c;
- char *buf;
int r;
+#ifndef LIBRBD_SUPPORTS_IOVEC
+ char * buf = NULL;
+#endif
BDRVRBDState *s = bs->opaque;
@@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
acb->cmd = cmd;
acb->qiov = qiov;
assert(!qiov || qiov->size == size);
+#ifndef LIBRBD_SUPPORTS_IOVEC
+
if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
acb->bounce = NULL;
} else {
@@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
goto failed;
}
}
- acb->ret = 0;
- acb->error = 0;
- acb->s = s;
-
if (cmd == RBD_AIO_WRITE) {
qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
}
-
buf = acb->bounce;
+#endif
+ acb->ret = 0;
+ acb->error = 0;
+ acb->s = s;
rcb = g_new(RADOSCB, 1);
+
rcb->acb = acb;
+#ifndef LIBRBD_SUPPORTS_IOVEC
rcb->buf = buf;
+#endif
rcb->s = acb->s;
rcb->size = size;
r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
@@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
switch (cmd) {
case RBD_AIO_WRITE:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_write(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_READ:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_read(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_DISCARD:
r = rbd_aio_discard_wrapper(s->image, off, size, c);
@@ -719,7 +752,9 @@ failed_completion:
rbd_aio_release(c);
failed:
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
qemu_vfree(acb->bounce);
+#endif
qemu_aio_unref(acb);
return NULL;
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [RFC v3] RBD: Add support readv,writev for rbd
@ 2017-01-21 10:59 ` jazeltq
0 siblings, 0 replies; 25+ messages in thread
From: jazeltq @ 2017-01-21 10:59 UTC (permalink / raw)
To: jdurgin, jcody, jdillama, kwolf, mreitz, qemu-block
Cc: qemu-devel, ceph-devel, tianqing
From: tianqing <tianqing@unitedstack.com>
Rbd can do readv and writev directly, so wo do not need to transform
iov to buf or vice versa any more.
Signed-off-by: tianqing <tianqing@unitedstack.com>
---
block/rbd.c | 47 +++++++++++++++++++++++++++++++++++++++++------
1 file changed, 41 insertions(+), 6 deletions(-)
diff --git a/block/rbd.c b/block/rbd.c
index a57b3e3..4add4dd 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
BlockAIOCB common;
int64_t ret;
QEMUIOVector *qiov;
+/* Note:
+ * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
+ */
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *bounce;
+#endif
RBDAIOCmd cmd;
int error;
struct BDRVRBDState *s;
@@ -83,7 +88,9 @@ typedef struct RADOSCB {
RBDAIOCB *acb;
struct BDRVRBDState *s;
int64_t size;
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *buf;
+#endif
int64_t ret;
} RADOSCB;
@@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
}
} else {
if (r < 0) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf, 0, rcb->size);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
+#endif
acb->ret = r;
acb->error = 1;
} else if (r < rcb->size) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf + r, 0, rcb->size - r);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov,
+ r, 0, acb->qiov->size - r);
+#endif
+
if (!acb->error) {
acb->ret = rcb->size;
}
@@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
if (acb->cmd == RBD_AIO_READ) {
qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
}
qemu_vfree(acb->bounce);
+#endif
acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
qemu_aio_unref(acb);
@@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
RBDAIOCB *acb;
RADOSCB *rcb = NULL;
rbd_completion_t c;
- char *buf;
int r;
+#ifndef LIBRBD_SUPPORTS_IOVEC
+ char * buf = NULL;
+#endif
BDRVRBDState *s = bs->opaque;
@@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
acb->cmd = cmd;
acb->qiov = qiov;
assert(!qiov || qiov->size == size);
+#ifndef LIBRBD_SUPPORTS_IOVEC
+
if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
acb->bounce = NULL;
} else {
@@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
goto failed;
}
}
- acb->ret = 0;
- acb->error = 0;
- acb->s = s;
-
if (cmd == RBD_AIO_WRITE) {
qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
}
-
buf = acb->bounce;
+#endif
+ acb->ret = 0;
+ acb->error = 0;
+ acb->s = s;
rcb = g_new(RADOSCB, 1);
+
rcb->acb = acb;
+#ifndef LIBRBD_SUPPORTS_IOVEC
rcb->buf = buf;
+#endif
rcb->s = acb->s;
rcb->size = size;
r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
@@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
switch (cmd) {
case RBD_AIO_WRITE:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_write(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_READ:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_read(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_DISCARD:
r = rbd_aio_discard_wrapper(s->image, off, size, c);
@@ -719,7 +752,9 @@ failed_completion:
rbd_aio_release(c);
failed:
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
qemu_vfree(acb->bounce);
+#endif
qemu_aio_unref(acb);
return NULL;
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [RFC v3] RBD: Add support readv,writev for rbd
2017-01-21 10:59 ` [Qemu-devel] " jazeltq
(?)
@ 2017-01-21 11:13 ` no-reply
2017-01-21 13:19 ` [Qemu-devel] " jazeltq
-1 siblings, 1 reply; 25+ messages in thread
From: no-reply @ 2017-01-21 11:13 UTC (permalink / raw)
To: jazeltq
Cc: famz, jdurgin, jcody, jdillama, kwolf, mreitz, qemu-block,
tianqing, ceph-devel, qemu-devel
Hi,
Your series seems to have some coding style problems. See output below for
more information:
Subject: [Qemu-devel] [RFC v3] RBD: Add support readv,writev for rbd
Message-id: 20170121105949.15466-1-jazeltq@gmail.com
Type: series
=== TEST SCRIPT BEGIN ===
#!/bin/bash
BASE=base
n=1
total=$(git log --oneline $BASE.. | wc -l)
failed=0
# Useful git options
git config --local diff.renamelimit 0
git config --local diff.renames True
commits="$(git log --format=%H --reverse $BASE..)"
for c in $commits; do
echo "Checking PATCH $n/$total: $(git log -n 1 --format=%s $c)..."
if ! git show $c --format=email | ./scripts/checkpatch.pl --mailback -; then
failed=1
echo
fi
n=$((n+1))
done
exit $failed
=== TEST SCRIPT END ===
Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
Switched to a new branch 'test'
f826583 RBD: Add support readv,writev for rbd
=== OUTPUT BEGIN ===
Checking PATCH 1/1: RBD: Add support readv,writev for rbd...
ERROR: trailing whitespace
#81: FILE: block/rbd.c:679:
+ char * buf = NULL; $
ERROR: "foo * bar" should be "foo *bar"
#81: FILE: block/rbd.c:679:
+ char * buf = NULL;
ERROR: trailing whitespace
#91: FILE: block/rbd.c:689:
+ $
total: 3 errors, 0 warnings, 126 lines checked
Your patch has style problems, please review. If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
=== OUTPUT END ===
Test command exited with code: 1
---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@freelists.org
^ permalink raw reply [flat|nested] 25+ messages in thread
* [RFC v4] RBD: Add support readv,writev for rbd
2017-01-21 11:13 ` no-reply
@ 2017-01-21 13:19 ` jazeltq
0 siblings, 0 replies; 25+ messages in thread
From: jazeltq @ 2017-01-21 13:19 UTC (permalink / raw)
To: jdurgin, jcody, jdillama, kwolf, mreitz, qemu-block
Cc: tianqing, ceph-devel, qemu-devel
From: tianqing <tianqing@unitedstack.com>
Rbd can do readv and writev directly, so wo do not need to transform
iov to buf or vice versa any more.
Signed-off-by: tianqing <tianqing@unitedstack.com>
---
block/rbd.c | 47 +++++++++++++++++++++++++++++++++++++++++------
1 file changed, 41 insertions(+), 6 deletions(-)
diff --git a/block/rbd.c b/block/rbd.c
index a57b3e3..0cbd9e3 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
BlockAIOCB common;
int64_t ret;
QEMUIOVector *qiov;
+/* Note:
+ * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
+ */
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *bounce;
+#endif
RBDAIOCmd cmd;
int error;
struct BDRVRBDState *s;
@@ -83,7 +88,9 @@ typedef struct RADOSCB {
RBDAIOCB *acb;
struct BDRVRBDState *s;
int64_t size;
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *buf;
+#endif
int64_t ret;
} RADOSCB;
@@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
}
} else {
if (r < 0) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf, 0, rcb->size);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
+#endif
acb->ret = r;
acb->error = 1;
} else if (r < rcb->size) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf + r, 0, rcb->size - r);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov,
+ r, 0, acb->qiov->size - r);
+#endif
+
if (!acb->error) {
acb->ret = rcb->size;
}
@@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
if (acb->cmd == RBD_AIO_READ) {
qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
}
qemu_vfree(acb->bounce);
+#endif
acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
qemu_aio_unref(acb);
@@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
RBDAIOCB *acb;
RADOSCB *rcb = NULL;
rbd_completion_t c;
- char *buf;
int r;
+#ifndef LIBRBD_SUPPORTS_IOVEC
+ char *buf = NULL;
+#endif
BDRVRBDState *s = bs->opaque;
@@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
acb->cmd = cmd;
acb->qiov = qiov;
assert(!qiov || qiov->size == size);
+#ifndef LIBRBD_SUPPORTS_IOVEC
+
if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
acb->bounce = NULL;
} else {
@@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
goto failed;
}
}
- acb->ret = 0;
- acb->error = 0;
- acb->s = s;
-
if (cmd == RBD_AIO_WRITE) {
qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
}
-
buf = acb->bounce;
+#endif
+ acb->ret = 0;
+ acb->error = 0;
+ acb->s = s;
rcb = g_new(RADOSCB, 1);
+
rcb->acb = acb;
+#ifndef LIBRBD_SUPPORTS_IOVEC
rcb->buf = buf;
+#endif
rcb->s = acb->s;
rcb->size = size;
r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
@@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
switch (cmd) {
case RBD_AIO_WRITE:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_write(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_READ:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_read(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_DISCARD:
r = rbd_aio_discard_wrapper(s->image, off, size, c);
@@ -719,7 +752,9 @@ failed_completion:
rbd_aio_release(c);
failed:
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
qemu_vfree(acb->bounce);
+#endif
qemu_aio_unref(acb);
return NULL;
}
--
2.10.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [RFC v4] RBD: Add support readv,writev for rbd
@ 2017-01-21 13:19 ` jazeltq
0 siblings, 0 replies; 25+ messages in thread
From: jazeltq @ 2017-01-21 13:19 UTC (permalink / raw)
To: jdurgin, jcody, jdillama, kwolf, mreitz, qemu-block
Cc: qemu-devel, ceph-devel, tianqing
From: tianqing <tianqing@unitedstack.com>
Rbd can do readv and writev directly, so wo do not need to transform
iov to buf or vice versa any more.
Signed-off-by: tianqing <tianqing@unitedstack.com>
---
block/rbd.c | 47 +++++++++++++++++++++++++++++++++++++++++------
1 file changed, 41 insertions(+), 6 deletions(-)
diff --git a/block/rbd.c b/block/rbd.c
index a57b3e3..0cbd9e3 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
BlockAIOCB common;
int64_t ret;
QEMUIOVector *qiov;
+/* Note:
+ * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
+ */
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *bounce;
+#endif
RBDAIOCmd cmd;
int error;
struct BDRVRBDState *s;
@@ -83,7 +88,9 @@ typedef struct RADOSCB {
RBDAIOCB *acb;
struct BDRVRBDState *s;
int64_t size;
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *buf;
+#endif
int64_t ret;
} RADOSCB;
@@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
}
} else {
if (r < 0) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf, 0, rcb->size);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
+#endif
acb->ret = r;
acb->error = 1;
} else if (r < rcb->size) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf + r, 0, rcb->size - r);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov,
+ r, 0, acb->qiov->size - r);
+#endif
+
if (!acb->error) {
acb->ret = rcb->size;
}
@@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
if (acb->cmd == RBD_AIO_READ) {
qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
}
qemu_vfree(acb->bounce);
+#endif
acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
qemu_aio_unref(acb);
@@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
RBDAIOCB *acb;
RADOSCB *rcb = NULL;
rbd_completion_t c;
- char *buf;
int r;
+#ifndef LIBRBD_SUPPORTS_IOVEC
+ char *buf = NULL;
+#endif
BDRVRBDState *s = bs->opaque;
@@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
acb->cmd = cmd;
acb->qiov = qiov;
assert(!qiov || qiov->size == size);
+#ifndef LIBRBD_SUPPORTS_IOVEC
+
if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
acb->bounce = NULL;
} else {
@@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
goto failed;
}
}
- acb->ret = 0;
- acb->error = 0;
- acb->s = s;
-
if (cmd == RBD_AIO_WRITE) {
qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
}
-
buf = acb->bounce;
+#endif
+ acb->ret = 0;
+ acb->error = 0;
+ acb->s = s;
rcb = g_new(RADOSCB, 1);
+
rcb->acb = acb;
+#ifndef LIBRBD_SUPPORTS_IOVEC
rcb->buf = buf;
+#endif
rcb->s = acb->s;
rcb->size = size;
r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
@@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
switch (cmd) {
case RBD_AIO_WRITE:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_write(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_READ:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_read(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_DISCARD:
r = rbd_aio_discard_wrapper(s->image, off, size, c);
@@ -719,7 +752,9 @@ failed_completion:
rbd_aio_release(c);
failed:
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
qemu_vfree(acb->bounce);
+#endif
qemu_aio_unref(acb);
return NULL;
}
--
2.10.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [RFC v4] RBD: Add support readv,writev for rbd
2017-01-21 13:19 ` [Qemu-devel] " jazeltq
@ 2017-02-16 8:43 ` jazeltq
-1 siblings, 0 replies; 25+ messages in thread
From: jazeltq @ 2017-02-16 8:43 UTC (permalink / raw)
To: jdurgin, jcody, dillaman, kwolf, mreitz, qemu-block
Cc: qemu-devel, ceph-devel, jazeltq, tianqing
From: tianqing <tianqing@unitedstack.com>
Rbd can do readv and writev directly, so wo do not need to transform
iov to buf or vice versa any more.
Signed-off-by: tianqing <tianqing@unitedstack.com>
---
block/rbd.c | 47 +++++++++++++++++++++++++++++++++++++++++------
1 file changed, 41 insertions(+), 6 deletions(-)
diff --git a/block/rbd.c b/block/rbd.c
index a57b3e3..0cbd9e3 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
BlockAIOCB common;
int64_t ret;
QEMUIOVector *qiov;
+/* Note:
+ * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
+ */
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *bounce;
+#endif
RBDAIOCmd cmd;
int error;
struct BDRVRBDState *s;
@@ -83,7 +88,9 @@ typedef struct RADOSCB {
RBDAIOCB *acb;
struct BDRVRBDState *s;
int64_t size;
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *buf;
+#endif
int64_t ret;
} RADOSCB;
@@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
}
} else {
if (r < 0) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf, 0, rcb->size);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
+#endif
acb->ret = r;
acb->error = 1;
} else if (r < rcb->size) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf + r, 0, rcb->size - r);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov,
+ r, 0, acb->qiov->size - r);
+#endif
+
if (!acb->error) {
acb->ret = rcb->size;
}
@@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
if (acb->cmd == RBD_AIO_READ) {
qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
}
qemu_vfree(acb->bounce);
+#endif
acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
qemu_aio_unref(acb);
@@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
RBDAIOCB *acb;
RADOSCB *rcb = NULL;
rbd_completion_t c;
- char *buf;
int r;
+#ifndef LIBRBD_SUPPORTS_IOVEC
+ char *buf = NULL;
+#endif
BDRVRBDState *s = bs->opaque;
@@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
acb->cmd = cmd;
acb->qiov = qiov;
assert(!qiov || qiov->size == size);
+#ifndef LIBRBD_SUPPORTS_IOVEC
+
if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
acb->bounce = NULL;
} else {
@@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
goto failed;
}
}
- acb->ret = 0;
- acb->error = 0;
- acb->s = s;
-
if (cmd == RBD_AIO_WRITE) {
qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
}
-
buf = acb->bounce;
+#endif
+ acb->ret = 0;
+ acb->error = 0;
+ acb->s = s;
rcb = g_new(RADOSCB, 1);
+
rcb->acb = acb;
+#ifndef LIBRBD_SUPPORTS_IOVEC
rcb->buf = buf;
+#endif
rcb->s = acb->s;
rcb->size = size;
r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
@@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
switch (cmd) {
case RBD_AIO_WRITE:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_write(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_READ:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_read(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_DISCARD:
r = rbd_aio_discard_wrapper(s->image, off, size, c);
@@ -719,7 +752,9 @@ failed_completion:
rbd_aio_release(c);
failed:
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
qemu_vfree(acb->bounce);
+#endif
qemu_aio_unref(acb);
return NULL;
}
--
2.10.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [RFC v4] RBD: Add support readv,writev for rbd
@ 2017-02-16 8:43 ` jazeltq
0 siblings, 0 replies; 25+ messages in thread
From: jazeltq @ 2017-02-16 8:43 UTC (permalink / raw)
To: jdurgin, jcody, dillaman, kwolf, mreitz, qemu-block
Cc: qemu-devel, ceph-devel, jazeltq, tianqing
From: tianqing <tianqing@unitedstack.com>
Rbd can do readv and writev directly, so wo do not need to transform
iov to buf or vice versa any more.
Signed-off-by: tianqing <tianqing@unitedstack.com>
---
block/rbd.c | 47 +++++++++++++++++++++++++++++++++++++++++------
1 file changed, 41 insertions(+), 6 deletions(-)
diff --git a/block/rbd.c b/block/rbd.c
index a57b3e3..0cbd9e3 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
BlockAIOCB common;
int64_t ret;
QEMUIOVector *qiov;
+/* Note:
+ * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
+ */
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *bounce;
+#endif
RBDAIOCmd cmd;
int error;
struct BDRVRBDState *s;
@@ -83,7 +88,9 @@ typedef struct RADOSCB {
RBDAIOCB *acb;
struct BDRVRBDState *s;
int64_t size;
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *buf;
+#endif
int64_t ret;
} RADOSCB;
@@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
}
} else {
if (r < 0) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf, 0, rcb->size);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
+#endif
acb->ret = r;
acb->error = 1;
} else if (r < rcb->size) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf + r, 0, rcb->size - r);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov,
+ r, 0, acb->qiov->size - r);
+#endif
+
if (!acb->error) {
acb->ret = rcb->size;
}
@@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
if (acb->cmd == RBD_AIO_READ) {
qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
}
qemu_vfree(acb->bounce);
+#endif
acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
qemu_aio_unref(acb);
@@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
RBDAIOCB *acb;
RADOSCB *rcb = NULL;
rbd_completion_t c;
- char *buf;
int r;
+#ifndef LIBRBD_SUPPORTS_IOVEC
+ char *buf = NULL;
+#endif
BDRVRBDState *s = bs->opaque;
@@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
acb->cmd = cmd;
acb->qiov = qiov;
assert(!qiov || qiov->size == size);
+#ifndef LIBRBD_SUPPORTS_IOVEC
+
if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
acb->bounce = NULL;
} else {
@@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
goto failed;
}
}
- acb->ret = 0;
- acb->error = 0;
- acb->s = s;
-
if (cmd == RBD_AIO_WRITE) {
qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
}
-
buf = acb->bounce;
+#endif
+ acb->ret = 0;
+ acb->error = 0;
+ acb->s = s;
rcb = g_new(RADOSCB, 1);
+
rcb->acb = acb;
+#ifndef LIBRBD_SUPPORTS_IOVEC
rcb->buf = buf;
+#endif
rcb->s = acb->s;
rcb->size = size;
r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
@@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
switch (cmd) {
case RBD_AIO_WRITE:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_write(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_READ:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_read(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_DISCARD:
r = rbd_aio_discard_wrapper(s->image, off, size, c);
@@ -719,7 +752,9 @@ failed_completion:
rbd_aio_release(c);
failed:
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
qemu_vfree(acb->bounce);
+#endif
qemu_aio_unref(acb);
return NULL;
}
--
2.10.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [RFC v5] RBD: Add support readv,writev for rbd
2017-02-16 8:43 ` [Qemu-devel] " jazeltq
@ 2017-02-16 9:00 ` jazeltq
-1 siblings, 0 replies; 25+ messages in thread
From: jazeltq @ 2017-02-16 9:00 UTC (permalink / raw)
To: jdurgin, jcody, dillaman, kwolf, mreitz, qemu-block
Cc: qemu-devel, ceph-devel, jazeltq, tianqing
From: tianqing <tianqing@unitedstack.com>
Rbd can do readv and writev directly, so wo do not need to transform
iov to buf or vice versa any more.
Signed-off-by: tianqing <tianqing@unitedstack.com>
---
block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 42 insertions(+), 7 deletions(-)
diff --git a/block/rbd.c b/block/rbd.c
index a57b3e3..75ae1d6 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -47,7 +47,7 @@
*/
/* rbd_aio_discard added in 0.1.2 */
-#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
+#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
#define LIBRBD_SUPPORTS_DISCARD
#else
#undef LIBRBD_SUPPORTS_DISCARD
@@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
BlockAIOCB common;
int64_t ret;
QEMUIOVector *qiov;
+/* Note:
+ * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
+ */
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *bounce;
+#endif
RBDAIOCmd cmd;
int error;
struct BDRVRBDState *s;
@@ -83,7 +88,9 @@ typedef struct RADOSCB {
RBDAIOCB *acb;
struct BDRVRBDState *s;
int64_t size;
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *buf;
+#endif
int64_t ret;
} RADOSCB;
@@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
}
} else {
if (r < 0) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf, 0, rcb->size);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
+#endif
acb->ret = r;
acb->error = 1;
} else if (r < rcb->size) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf + r, 0, rcb->size - r);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov,
+ r, 0, acb->qiov->size - r);
+#endif
+
if (!acb->error) {
acb->ret = rcb->size;
}
@@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
if (acb->cmd == RBD_AIO_READ) {
qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
}
qemu_vfree(acb->bounce);
+#endif
acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
qemu_aio_unref(acb);
@@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
RBDAIOCB *acb;
RADOSCB *rcb = NULL;
rbd_completion_t c;
- char *buf;
int r;
+#ifndef LIBRBD_SUPPORTS_IOVEC
+ char *buf = NULL;
+#endif
BDRVRBDState *s = bs->opaque;
@@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
acb->cmd = cmd;
acb->qiov = qiov;
assert(!qiov || qiov->size == size);
+#ifndef LIBRBD_SUPPORTS_IOVEC
+
if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
acb->bounce = NULL;
} else {
@@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
goto failed;
}
}
- acb->ret = 0;
- acb->error = 0;
- acb->s = s;
-
if (cmd == RBD_AIO_WRITE) {
qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
}
-
buf = acb->bounce;
+#endif
+ acb->ret = 0;
+ acb->error = 0;
+ acb->s = s;
rcb = g_new(RADOSCB, 1);
+
rcb->acb = acb;
+#ifndef LIBRBD_SUPPORTS_IOVEC
rcb->buf = buf;
+#endif
rcb->s = acb->s;
rcb->size = size;
r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
@@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
switch (cmd) {
case RBD_AIO_WRITE:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_write(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_READ:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_read(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_DISCARD:
r = rbd_aio_discard_wrapper(s->image, off, size, c);
@@ -719,7 +752,9 @@ failed_completion:
rbd_aio_release(c);
failed:
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
qemu_vfree(acb->bounce);
+#endif
qemu_aio_unref(acb);
return NULL;
}
--
2.10.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [RFC v5] RBD: Add support readv,writev for rbd
@ 2017-02-16 9:00 ` jazeltq
0 siblings, 0 replies; 25+ messages in thread
From: jazeltq @ 2017-02-16 9:00 UTC (permalink / raw)
To: jdurgin, jcody, dillaman, kwolf, mreitz, qemu-block
Cc: qemu-devel, ceph-devel, jazeltq, tianqing
From: tianqing <tianqing@unitedstack.com>
Rbd can do readv and writev directly, so wo do not need to transform
iov to buf or vice versa any more.
Signed-off-by: tianqing <tianqing@unitedstack.com>
---
block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 42 insertions(+), 7 deletions(-)
diff --git a/block/rbd.c b/block/rbd.c
index a57b3e3..75ae1d6 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -47,7 +47,7 @@
*/
/* rbd_aio_discard added in 0.1.2 */
-#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
+#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
#define LIBRBD_SUPPORTS_DISCARD
#else
#undef LIBRBD_SUPPORTS_DISCARD
@@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
BlockAIOCB common;
int64_t ret;
QEMUIOVector *qiov;
+/* Note:
+ * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
+ */
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *bounce;
+#endif
RBDAIOCmd cmd;
int error;
struct BDRVRBDState *s;
@@ -83,7 +88,9 @@ typedef struct RADOSCB {
RBDAIOCB *acb;
struct BDRVRBDState *s;
int64_t size;
+#ifndef LIBRBD_SUPPORTS_IOVEC
char *buf;
+#endif
int64_t ret;
} RADOSCB;
@@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
}
} else {
if (r < 0) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf, 0, rcb->size);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
+#endif
acb->ret = r;
acb->error = 1;
} else if (r < rcb->size) {
+#ifndef LIBRBD_SUPPORTS_IOVEC
memset(rcb->buf + r, 0, rcb->size - r);
+#else
+ iov_memset(acb->qiov->iov, acb->qiov->niov,
+ r, 0, acb->qiov->size - r);
+#endif
+
if (!acb->error) {
acb->ret = rcb->size;
}
@@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
if (acb->cmd == RBD_AIO_READ) {
qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
}
qemu_vfree(acb->bounce);
+#endif
acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
qemu_aio_unref(acb);
@@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
RBDAIOCB *acb;
RADOSCB *rcb = NULL;
rbd_completion_t c;
- char *buf;
int r;
+#ifndef LIBRBD_SUPPORTS_IOVEC
+ char *buf = NULL;
+#endif
BDRVRBDState *s = bs->opaque;
@@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
acb->cmd = cmd;
acb->qiov = qiov;
assert(!qiov || qiov->size == size);
+#ifndef LIBRBD_SUPPORTS_IOVEC
+
if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
acb->bounce = NULL;
} else {
@@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
goto failed;
}
}
- acb->ret = 0;
- acb->error = 0;
- acb->s = s;
-
if (cmd == RBD_AIO_WRITE) {
qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
}
-
buf = acb->bounce;
+#endif
+ acb->ret = 0;
+ acb->error = 0;
+ acb->s = s;
rcb = g_new(RADOSCB, 1);
+
rcb->acb = acb;
+#ifndef LIBRBD_SUPPORTS_IOVEC
rcb->buf = buf;
+#endif
rcb->s = acb->s;
rcb->size = size;
r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
@@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
switch (cmd) {
case RBD_AIO_WRITE:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_write(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_READ:
+#ifndef LIBRBD_SUPPORTS_IOVEC
r = rbd_aio_read(s->image, off, size, buf, c);
+#else
+ r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
+#endif
break;
case RBD_AIO_DISCARD:
r = rbd_aio_discard_wrapper(s->image, off, size, c);
@@ -719,7 +752,9 @@ failed_completion:
rbd_aio_release(c);
failed:
g_free(rcb);
+#ifndef LIBRBD_SUPPORTS_IOVEC
qemu_vfree(acb->bounce);
+#endif
qemu_aio_unref(acb);
return NULL;
}
--
2.10.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: [RFC v5] RBD: Add support readv,writev for rbd
2017-02-16 9:00 ` [Qemu-devel] " jazeltq
@ 2017-02-16 12:07 ` Tiger Hu
-1 siblings, 0 replies; 25+ messages in thread
From: Tiger Hu @ 2017-02-16 12:07 UTC (permalink / raw)
To: jazeltq
Cc: jdurgin, jcody, dillaman, kwolf, mreitz, qemu-block, qemu-devel,
ceph-devel, tianqing
Tianqing,
Do we have any performance data for this patch? Thanks.
Tiger
> 在 2017年2月16日,下午5:00,jazeltq@gmail.com 写道:
>
> From: tianqing <tianqing@unitedstack.com>
>
> Rbd can do readv and writev directly, so wo do not need to transform
> iov to buf or vice versa any more.
>
> Signed-off-by: tianqing <tianqing@unitedstack.com>
> ---
> block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 42 insertions(+), 7 deletions(-)
>
> diff --git a/block/rbd.c b/block/rbd.c
> index a57b3e3..75ae1d6 100644
> --- a/block/rbd.c
> +++ b/block/rbd.c
> @@ -47,7 +47,7 @@
> */
>
> /* rbd_aio_discard added in 0.1.2 */
> -#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
> +#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
> #define LIBRBD_SUPPORTS_DISCARD
> #else
> #undef LIBRBD_SUPPORTS_DISCARD
> @@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
> BlockAIOCB common;
> int64_t ret;
> QEMUIOVector *qiov;
> +/* Note:
> + * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
> + */
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> char *bounce;
> +#endif
> RBDAIOCmd cmd;
> int error;
> struct BDRVRBDState *s;
> @@ -83,7 +88,9 @@ typedef struct RADOSCB {
> RBDAIOCB *acb;
> struct BDRVRBDState *s;
> int64_t size;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> char *buf;
> +#endif
> int64_t ret;
> } RADOSCB;
>
> @@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
> }
> } else {
> if (r < 0) {
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> memset(rcb->buf, 0, rcb->size);
> +#else
> + iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
> +#endif
> acb->ret = r;
> acb->error = 1;
> } else if (r < rcb->size) {
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> memset(rcb->buf + r, 0, rcb->size - r);
> +#else
> + iov_memset(acb->qiov->iov, acb->qiov->niov,
> + r, 0, acb->qiov->size - r);
> +#endif
> +
> if (!acb->error) {
> acb->ret = rcb->size;
> }
> @@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>
> g_free(rcb);
>
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> if (acb->cmd == RBD_AIO_READ) {
> qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
> }
> qemu_vfree(acb->bounce);
> +#endif
> acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
>
> qemu_aio_unref(acb);
> @@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> RBDAIOCB *acb;
> RADOSCB *rcb = NULL;
> rbd_completion_t c;
> - char *buf;
> int r;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> + char *buf = NULL;
> +#endif
>
> BDRVRBDState *s = bs->opaque;
>
> @@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> acb->cmd = cmd;
> acb->qiov = qiov;
> assert(!qiov || qiov->size == size);
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> +
> if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
> acb->bounce = NULL;
> } else {
> @@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> goto failed;
> }
> }
> - acb->ret = 0;
> - acb->error = 0;
> - acb->s = s;
> -
> if (cmd == RBD_AIO_WRITE) {
> qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
> }
> -
> buf = acb->bounce;
> +#endif
> + acb->ret = 0;
> + acb->error = 0;
> + acb->s = s;
>
> rcb = g_new(RADOSCB, 1);
> +
> rcb->acb = acb;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> rcb->buf = buf;
> +#endif
> rcb->s = acb->s;
> rcb->size = size;
> r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
> @@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>
> switch (cmd) {
> case RBD_AIO_WRITE:
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> r = rbd_aio_write(s->image, off, size, buf, c);
> +#else
> + r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
> +#endif
> break;
> case RBD_AIO_READ:
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> r = rbd_aio_read(s->image, off, size, buf, c);
> +#else
> + r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
> +#endif
> break;
> case RBD_AIO_DISCARD:
> r = rbd_aio_discard_wrapper(s->image, off, size, c);
> @@ -719,7 +752,9 @@ failed_completion:
> rbd_aio_release(c);
> failed:
> g_free(rcb);
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> qemu_vfree(acb->bounce);
> +#endif
> qemu_aio_unref(acb);
> return NULL;
> }
> --
> 2.10.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [RFC v5] RBD: Add support readv,writev for rbd
@ 2017-02-16 12:07 ` Tiger Hu
0 siblings, 0 replies; 25+ messages in thread
From: Tiger Hu @ 2017-02-16 12:07 UTC (permalink / raw)
To: jazeltq
Cc: jdurgin, jcody, dillaman, kwolf, mreitz, qemu-block, qemu-devel,
ceph-devel, tianqing
Tianqing,
Do we have any performance data for this patch? Thanks.
Tiger
> 在 2017年2月16日,下午5:00,jazeltq@gmail.com 写道:
>
> From: tianqing <tianqing@unitedstack.com>
>
> Rbd can do readv and writev directly, so wo do not need to transform
> iov to buf or vice versa any more.
>
> Signed-off-by: tianqing <tianqing@unitedstack.com>
> ---
> block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 42 insertions(+), 7 deletions(-)
>
> diff --git a/block/rbd.c b/block/rbd.c
> index a57b3e3..75ae1d6 100644
> --- a/block/rbd.c
> +++ b/block/rbd.c
> @@ -47,7 +47,7 @@
> */
>
> /* rbd_aio_discard added in 0.1.2 */
> -#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
> +#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
> #define LIBRBD_SUPPORTS_DISCARD
> #else
> #undef LIBRBD_SUPPORTS_DISCARD
> @@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
> BlockAIOCB common;
> int64_t ret;
> QEMUIOVector *qiov;
> +/* Note:
> + * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
> + */
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> char *bounce;
> +#endif
> RBDAIOCmd cmd;
> int error;
> struct BDRVRBDState *s;
> @@ -83,7 +88,9 @@ typedef struct RADOSCB {
> RBDAIOCB *acb;
> struct BDRVRBDState *s;
> int64_t size;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> char *buf;
> +#endif
> int64_t ret;
> } RADOSCB;
>
> @@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
> }
> } else {
> if (r < 0) {
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> memset(rcb->buf, 0, rcb->size);
> +#else
> + iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
> +#endif
> acb->ret = r;
> acb->error = 1;
> } else if (r < rcb->size) {
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> memset(rcb->buf + r, 0, rcb->size - r);
> +#else
> + iov_memset(acb->qiov->iov, acb->qiov->niov,
> + r, 0, acb->qiov->size - r);
> +#endif
> +
> if (!acb->error) {
> acb->ret = rcb->size;
> }
> @@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>
> g_free(rcb);
>
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> if (acb->cmd == RBD_AIO_READ) {
> qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
> }
> qemu_vfree(acb->bounce);
> +#endif
> acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
>
> qemu_aio_unref(acb);
> @@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> RBDAIOCB *acb;
> RADOSCB *rcb = NULL;
> rbd_completion_t c;
> - char *buf;
> int r;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> + char *buf = NULL;
> +#endif
>
> BDRVRBDState *s = bs->opaque;
>
> @@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> acb->cmd = cmd;
> acb->qiov = qiov;
> assert(!qiov || qiov->size == size);
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> +
> if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
> acb->bounce = NULL;
> } else {
> @@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> goto failed;
> }
> }
> - acb->ret = 0;
> - acb->error = 0;
> - acb->s = s;
> -
> if (cmd == RBD_AIO_WRITE) {
> qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
> }
> -
> buf = acb->bounce;
> +#endif
> + acb->ret = 0;
> + acb->error = 0;
> + acb->s = s;
>
> rcb = g_new(RADOSCB, 1);
> +
> rcb->acb = acb;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> rcb->buf = buf;
> +#endif
> rcb->s = acb->s;
> rcb->size = size;
> r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
> @@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>
> switch (cmd) {
> case RBD_AIO_WRITE:
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> r = rbd_aio_write(s->image, off, size, buf, c);
> +#else
> + r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
> +#endif
> break;
> case RBD_AIO_READ:
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> r = rbd_aio_read(s->image, off, size, buf, c);
> +#else
> + r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
> +#endif
> break;
> case RBD_AIO_DISCARD:
> r = rbd_aio_discard_wrapper(s->image, off, size, c);
> @@ -719,7 +752,9 @@ failed_completion:
> rbd_aio_release(c);
> failed:
> g_free(rcb);
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> qemu_vfree(acb->bounce);
> +#endif
> qemu_aio_unref(acb);
> return NULL;
> }
> --
> 2.10.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC v5] RBD: Add support readv,writev for rbd
2017-02-16 12:07 ` [Qemu-devel] " Tiger Hu
@ 2017-02-16 14:03 ` Jaze Lee
-1 siblings, 0 replies; 25+ messages in thread
From: Jaze Lee @ 2017-02-16 14:03 UTC (permalink / raw)
To: Tiger Hu
Cc: Josh Durgin, jcody, Jason Dillaman, kwolf, mreitz, qemu-block,
qemu-devel, ceph-devel, tianqing
No yet. I just test on one qemu-kvm vm. It works fine.
The performance may need more time.
Any one can test on this patch if you do fast....
2017-02-16 20:07 GMT+08:00 Tiger Hu <hufh2004@gmail.com>:
> Tianqing,
>
> Do we have any performance data for this patch? Thanks.
>
> Tiger
>> 在 2017年2月16日,下午5:00,jazeltq@gmail.com 写道:
>>
>> From: tianqing <tianqing@unitedstack.com>
>>
>> Rbd can do readv and writev directly, so wo do not need to transform
>> iov to buf or vice versa any more.
>>
>> Signed-off-by: tianqing <tianqing@unitedstack.com>
>> ---
>> block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
>> 1 file changed, 42 insertions(+), 7 deletions(-)
>>
>> diff --git a/block/rbd.c b/block/rbd.c
>> index a57b3e3..75ae1d6 100644
>> --- a/block/rbd.c
>> +++ b/block/rbd.c
>> @@ -47,7 +47,7 @@
>> */
>>
>> /* rbd_aio_discard added in 0.1.2 */
>> -#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
>> +#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
>> #define LIBRBD_SUPPORTS_DISCARD
>> #else
>> #undef LIBRBD_SUPPORTS_DISCARD
>> @@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
>> BlockAIOCB common;
>> int64_t ret;
>> QEMUIOVector *qiov;
>> +/* Note:
>> + * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
>> + */
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> char *bounce;
>> +#endif
>> RBDAIOCmd cmd;
>> int error;
>> struct BDRVRBDState *s;
>> @@ -83,7 +88,9 @@ typedef struct RADOSCB {
>> RBDAIOCB *acb;
>> struct BDRVRBDState *s;
>> int64_t size;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> char *buf;
>> +#endif
>> int64_t ret;
>> } RADOSCB;
>>
>> @@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>> }
>> } else {
>> if (r < 0) {
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> memset(rcb->buf, 0, rcb->size);
>> +#else
>> + iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
>> +#endif
>> acb->ret = r;
>> acb->error = 1;
>> } else if (r < rcb->size) {
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> memset(rcb->buf + r, 0, rcb->size - r);
>> +#else
>> + iov_memset(acb->qiov->iov, acb->qiov->niov,
>> + r, 0, acb->qiov->size - r);
>> +#endif
>> +
>> if (!acb->error) {
>> acb->ret = rcb->size;
>> }
>> @@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>>
>> g_free(rcb);
>>
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> if (acb->cmd == RBD_AIO_READ) {
>> qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
>> }
>> qemu_vfree(acb->bounce);
>> +#endif
>> acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
>>
>> qemu_aio_unref(acb);
>> @@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> RBDAIOCB *acb;
>> RADOSCB *rcb = NULL;
>> rbd_completion_t c;
>> - char *buf;
>> int r;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> + char *buf = NULL;
>> +#endif
>>
>> BDRVRBDState *s = bs->opaque;
>>
>> @@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> acb->cmd = cmd;
>> acb->qiov = qiov;
>> assert(!qiov || qiov->size == size);
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> +
>> if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
>> acb->bounce = NULL;
>> } else {
>> @@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> goto failed;
>> }
>> }
>> - acb->ret = 0;
>> - acb->error = 0;
>> - acb->s = s;
>> -
>> if (cmd == RBD_AIO_WRITE) {
>> qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
>> }
>> -
>> buf = acb->bounce;
>> +#endif
>> + acb->ret = 0;
>> + acb->error = 0;
>> + acb->s = s;
>>
>> rcb = g_new(RADOSCB, 1);
>> +
>> rcb->acb = acb;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> rcb->buf = buf;
>> +#endif
>> rcb->s = acb->s;
>> rcb->size = size;
>> r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
>> @@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>>
>> switch (cmd) {
>> case RBD_AIO_WRITE:
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> r = rbd_aio_write(s->image, off, size, buf, c);
>> +#else
>> + r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
>> +#endif
>> break;
>> case RBD_AIO_READ:
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> r = rbd_aio_read(s->image, off, size, buf, c);
>> +#else
>> + r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
>> +#endif
>> break;
>> case RBD_AIO_DISCARD:
>> r = rbd_aio_discard_wrapper(s->image, off, size, c);
>> @@ -719,7 +752,9 @@ failed_completion:
>> rbd_aio_release(c);
>> failed:
>> g_free(rcb);
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> qemu_vfree(acb->bounce);
>> +#endif
>> qemu_aio_unref(acb);
>> return NULL;
>> }
>> --
>> 2.10.2
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
谦谦君子
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [RFC v5] RBD: Add support readv,writev for rbd
@ 2017-02-16 14:03 ` Jaze Lee
0 siblings, 0 replies; 25+ messages in thread
From: Jaze Lee @ 2017-02-16 14:03 UTC (permalink / raw)
To: Tiger Hu
Cc: Josh Durgin, jcody, Jason Dillaman, kwolf, mreitz, qemu-block,
qemu-devel, ceph-devel, tianqing
No yet. I just test on one qemu-kvm vm. It works fine.
The performance may need more time.
Any one can test on this patch if you do fast....
2017-02-16 20:07 GMT+08:00 Tiger Hu <hufh2004@gmail.com>:
> Tianqing,
>
> Do we have any performance data for this patch? Thanks.
>
> Tiger
>> 在 2017年2月16日,下午5:00,jazeltq@gmail.com 写道:
>>
>> From: tianqing <tianqing@unitedstack.com>
>>
>> Rbd can do readv and writev directly, so wo do not need to transform
>> iov to buf or vice versa any more.
>>
>> Signed-off-by: tianqing <tianqing@unitedstack.com>
>> ---
>> block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
>> 1 file changed, 42 insertions(+), 7 deletions(-)
>>
>> diff --git a/block/rbd.c b/block/rbd.c
>> index a57b3e3..75ae1d6 100644
>> --- a/block/rbd.c
>> +++ b/block/rbd.c
>> @@ -47,7 +47,7 @@
>> */
>>
>> /* rbd_aio_discard added in 0.1.2 */
>> -#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
>> +#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
>> #define LIBRBD_SUPPORTS_DISCARD
>> #else
>> #undef LIBRBD_SUPPORTS_DISCARD
>> @@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
>> BlockAIOCB common;
>> int64_t ret;
>> QEMUIOVector *qiov;
>> +/* Note:
>> + * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
>> + */
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> char *bounce;
>> +#endif
>> RBDAIOCmd cmd;
>> int error;
>> struct BDRVRBDState *s;
>> @@ -83,7 +88,9 @@ typedef struct RADOSCB {
>> RBDAIOCB *acb;
>> struct BDRVRBDState *s;
>> int64_t size;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> char *buf;
>> +#endif
>> int64_t ret;
>> } RADOSCB;
>>
>> @@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>> }
>> } else {
>> if (r < 0) {
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> memset(rcb->buf, 0, rcb->size);
>> +#else
>> + iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
>> +#endif
>> acb->ret = r;
>> acb->error = 1;
>> } else if (r < rcb->size) {
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> memset(rcb->buf + r, 0, rcb->size - r);
>> +#else
>> + iov_memset(acb->qiov->iov, acb->qiov->niov,
>> + r, 0, acb->qiov->size - r);
>> +#endif
>> +
>> if (!acb->error) {
>> acb->ret = rcb->size;
>> }
>> @@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>>
>> g_free(rcb);
>>
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> if (acb->cmd == RBD_AIO_READ) {
>> qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
>> }
>> qemu_vfree(acb->bounce);
>> +#endif
>> acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
>>
>> qemu_aio_unref(acb);
>> @@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> RBDAIOCB *acb;
>> RADOSCB *rcb = NULL;
>> rbd_completion_t c;
>> - char *buf;
>> int r;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> + char *buf = NULL;
>> +#endif
>>
>> BDRVRBDState *s = bs->opaque;
>>
>> @@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> acb->cmd = cmd;
>> acb->qiov = qiov;
>> assert(!qiov || qiov->size == size);
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> +
>> if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
>> acb->bounce = NULL;
>> } else {
>> @@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> goto failed;
>> }
>> }
>> - acb->ret = 0;
>> - acb->error = 0;
>> - acb->s = s;
>> -
>> if (cmd == RBD_AIO_WRITE) {
>> qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
>> }
>> -
>> buf = acb->bounce;
>> +#endif
>> + acb->ret = 0;
>> + acb->error = 0;
>> + acb->s = s;
>>
>> rcb = g_new(RADOSCB, 1);
>> +
>> rcb->acb = acb;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> rcb->buf = buf;
>> +#endif
>> rcb->s = acb->s;
>> rcb->size = size;
>> r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
>> @@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>>
>> switch (cmd) {
>> case RBD_AIO_WRITE:
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> r = rbd_aio_write(s->image, off, size, buf, c);
>> +#else
>> + r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
>> +#endif
>> break;
>> case RBD_AIO_READ:
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> r = rbd_aio_read(s->image, off, size, buf, c);
>> +#else
>> + r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
>> +#endif
>> break;
>> case RBD_AIO_DISCARD:
>> r = rbd_aio_discard_wrapper(s->image, off, size, c);
>> @@ -719,7 +752,9 @@ failed_completion:
>> rbd_aio_release(c);
>> failed:
>> g_free(rcb);
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> qemu_vfree(acb->bounce);
>> +#endif
>> qemu_aio_unref(acb);
>> return NULL;
>> }
>> --
>> 2.10.2
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
谦谦君子
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC v5] RBD: Add support readv,writev for rbd
2017-02-16 9:00 ` [Qemu-devel] " jazeltq
@ 2017-02-16 14:14 ` Jason Dillaman
-1 siblings, 0 replies; 25+ messages in thread
From: Jason Dillaman @ 2017-02-16 14:14 UTC (permalink / raw)
To: Jaze Lee
Cc: Josh Durgin, Jeff Cody, Kevin Wolf, Max Reitz, qemu-block,
qemu-devel, ceph-devel, tianqing
On Thu, Feb 16, 2017 at 4:00 AM, <jazeltq@gmail.com> wrote:
> From: tianqing <tianqing@unitedstack.com>
>
> Rbd can do readv and writev directly, so wo do not need to transform
> iov to buf or vice versa any more.
>
> Signed-off-by: tianqing <tianqing@unitedstack.com>
> ---
> block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 42 insertions(+), 7 deletions(-)
>
> diff --git a/block/rbd.c b/block/rbd.c
> index a57b3e3..75ae1d6 100644
> --- a/block/rbd.c
> +++ b/block/rbd.c
> @@ -47,7 +47,7 @@
> */
>
> /* rbd_aio_discard added in 0.1.2 */
> -#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
> +#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
> #define LIBRBD_SUPPORTS_DISCARD
> #else
> #undef LIBRBD_SUPPORTS_DISCARD
Do not change this -- discard support is available in very old
versions of librbd not just the future Luminous release.
> @@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
> BlockAIOCB common;
> int64_t ret;
> QEMUIOVector *qiov;
> +/* Note:
> + * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
> + */
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> char *bounce;
> +#endif
> RBDAIOCmd cmd;
> int error;
> struct BDRVRBDState *s;
> @@ -83,7 +88,9 @@ typedef struct RADOSCB {
> RBDAIOCB *acb;
> struct BDRVRBDState *s;
> int64_t size;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> char *buf;
> +#endif
> int64_t ret;
> } RADOSCB;
>
> @@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
> }
> } else {
> if (r < 0) {
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> memset(rcb->buf, 0, rcb->size);
> +#else
> + iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
> +#endif
> acb->ret = r;
> acb->error = 1;
> } else if (r < rcb->size) {
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> memset(rcb->buf + r, 0, rcb->size - r);
> +#else
> + iov_memset(acb->qiov->iov, acb->qiov->niov,
> + r, 0, acb->qiov->size - r);
> +#endif
> +
> if (!acb->error) {
> acb->ret = rcb->size;
> }
> @@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>
> g_free(rcb);
>
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> if (acb->cmd == RBD_AIO_READ) {
> qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
> }
> qemu_vfree(acb->bounce);
> +#endif
> acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
>
> qemu_aio_unref(acb);
> @@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> RBDAIOCB *acb;
> RADOSCB *rcb = NULL;
> rbd_completion_t c;
> - char *buf;
> int r;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> + char *buf = NULL;
> +#endif
>
> BDRVRBDState *s = bs->opaque;
>
> @@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> acb->cmd = cmd;
> acb->qiov = qiov;
> assert(!qiov || qiov->size == size);
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> +
> if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
> acb->bounce = NULL;
> } else {
> @@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> goto failed;
> }
> }
> - acb->ret = 0;
> - acb->error = 0;
> - acb->s = s;
> -
> if (cmd == RBD_AIO_WRITE) {
> qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
> }
> -
> buf = acb->bounce;
> +#endif
> + acb->ret = 0;
> + acb->error = 0;
> + acb->s = s;
>
> rcb = g_new(RADOSCB, 1);
> +
> rcb->acb = acb;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> rcb->buf = buf;
> +#endif
> rcb->s = acb->s;
> rcb->size = size;
> r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
> @@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>
> switch (cmd) {
> case RBD_AIO_WRITE:
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> r = rbd_aio_write(s->image, off, size, buf, c);
> +#else
> + r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
> +#endif
> break;
> case RBD_AIO_READ:
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> r = rbd_aio_read(s->image, off, size, buf, c);
> +#else
> + r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
> +#endif
> break;
> case RBD_AIO_DISCARD:
> r = rbd_aio_discard_wrapper(s->image, off, size, c);
> @@ -719,7 +752,9 @@ failed_completion:
> rbd_aio_release(c);
> failed:
> g_free(rcb);
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> qemu_vfree(acb->bounce);
> +#endif
> qemu_aio_unref(acb);
> return NULL;
> }
> --
> 2.10.2
>
--
Jason
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [RFC v5] RBD: Add support readv,writev for rbd
@ 2017-02-16 14:14 ` Jason Dillaman
0 siblings, 0 replies; 25+ messages in thread
From: Jason Dillaman @ 2017-02-16 14:14 UTC (permalink / raw)
To: Jaze Lee
Cc: Josh Durgin, Jeff Cody, Kevin Wolf, Max Reitz, qemu-block,
qemu-devel, ceph-devel, tianqing
On Thu, Feb 16, 2017 at 4:00 AM, <jazeltq@gmail.com> wrote:
> From: tianqing <tianqing@unitedstack.com>
>
> Rbd can do readv and writev directly, so wo do not need to transform
> iov to buf or vice versa any more.
>
> Signed-off-by: tianqing <tianqing@unitedstack.com>
> ---
> block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 42 insertions(+), 7 deletions(-)
>
> diff --git a/block/rbd.c b/block/rbd.c
> index a57b3e3..75ae1d6 100644
> --- a/block/rbd.c
> +++ b/block/rbd.c
> @@ -47,7 +47,7 @@
> */
>
> /* rbd_aio_discard added in 0.1.2 */
> -#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
> +#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
> #define LIBRBD_SUPPORTS_DISCARD
> #else
> #undef LIBRBD_SUPPORTS_DISCARD
Do not change this -- discard support is available in very old
versions of librbd not just the future Luminous release.
> @@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
> BlockAIOCB common;
> int64_t ret;
> QEMUIOVector *qiov;
> +/* Note:
> + * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
> + */
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> char *bounce;
> +#endif
> RBDAIOCmd cmd;
> int error;
> struct BDRVRBDState *s;
> @@ -83,7 +88,9 @@ typedef struct RADOSCB {
> RBDAIOCB *acb;
> struct BDRVRBDState *s;
> int64_t size;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> char *buf;
> +#endif
> int64_t ret;
> } RADOSCB;
>
> @@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
> }
> } else {
> if (r < 0) {
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> memset(rcb->buf, 0, rcb->size);
> +#else
> + iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
> +#endif
> acb->ret = r;
> acb->error = 1;
> } else if (r < rcb->size) {
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> memset(rcb->buf + r, 0, rcb->size - r);
> +#else
> + iov_memset(acb->qiov->iov, acb->qiov->niov,
> + r, 0, acb->qiov->size - r);
> +#endif
> +
> if (!acb->error) {
> acb->ret = rcb->size;
> }
> @@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>
> g_free(rcb);
>
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> if (acb->cmd == RBD_AIO_READ) {
> qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
> }
> qemu_vfree(acb->bounce);
> +#endif
> acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
>
> qemu_aio_unref(acb);
> @@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> RBDAIOCB *acb;
> RADOSCB *rcb = NULL;
> rbd_completion_t c;
> - char *buf;
> int r;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> + char *buf = NULL;
> +#endif
>
> BDRVRBDState *s = bs->opaque;
>
> @@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> acb->cmd = cmd;
> acb->qiov = qiov;
> assert(!qiov || qiov->size == size);
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> +
> if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
> acb->bounce = NULL;
> } else {
> @@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> goto failed;
> }
> }
> - acb->ret = 0;
> - acb->error = 0;
> - acb->s = s;
> -
> if (cmd == RBD_AIO_WRITE) {
> qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
> }
> -
> buf = acb->bounce;
> +#endif
> + acb->ret = 0;
> + acb->error = 0;
> + acb->s = s;
>
> rcb = g_new(RADOSCB, 1);
> +
> rcb->acb = acb;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> rcb->buf = buf;
> +#endif
> rcb->s = acb->s;
> rcb->size = size;
> r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
> @@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>
> switch (cmd) {
> case RBD_AIO_WRITE:
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> r = rbd_aio_write(s->image, off, size, buf, c);
> +#else
> + r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
> +#endif
> break;
> case RBD_AIO_READ:
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> r = rbd_aio_read(s->image, off, size, buf, c);
> +#else
> + r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
> +#endif
> break;
> case RBD_AIO_DISCARD:
> r = rbd_aio_discard_wrapper(s->image, off, size, c);
> @@ -719,7 +752,9 @@ failed_completion:
> rbd_aio_release(c);
> failed:
> g_free(rcb);
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> qemu_vfree(acb->bounce);
> +#endif
> qemu_aio_unref(acb);
> return NULL;
> }
> --
> 2.10.2
>
--
Jason
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC v5] RBD: Add support readv,writev for rbd
2017-02-16 14:14 ` [Qemu-devel] " Jason Dillaman
@ 2017-02-16 14:22 ` Jaze Lee
-1 siblings, 0 replies; 25+ messages in thread
From: Jaze Lee @ 2017-02-16 14:22 UTC (permalink / raw)
To: Jason Dillaman
Cc: Josh Durgin, Jeff Cody, Kevin Wolf, Max Reitz, qemu-block,
qemu-devel, ceph-devel, tianqing
2017-02-16 22:14 GMT+08:00 Jason Dillaman <jdillama@redhat.com>:
> On Thu, Feb 16, 2017 at 4:00 AM, <jazeltq@gmail.com> wrote:
>> From: tianqing <tianqing@unitedstack.com>
>>
>> Rbd can do readv and writev directly, so wo do not need to transform
>> iov to buf or vice versa any more.
>>
>> Signed-off-by: tianqing <tianqing@unitedstack.com>
>> ---
>> block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
>> 1 file changed, 42 insertions(+), 7 deletions(-)
>>
>> diff --git a/block/rbd.c b/block/rbd.c
>> index a57b3e3..75ae1d6 100644
>> --- a/block/rbd.c
>> +++ b/block/rbd.c
>> @@ -47,7 +47,7 @@
>> */
>>
>> /* rbd_aio_discard added in 0.1.2 */
>> -#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
>> +#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
>> #define LIBRBD_SUPPORTS_DISCARD
>> #else
>> #undef LIBRBD_SUPPORTS_DISCARD
>
> Do not change this -- discard support is available in very old
> versions of librbd not just the future Luminous release.
Ok. Thanks a lot.
>
>> @@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
>> BlockAIOCB common;
>> int64_t ret;
>> QEMUIOVector *qiov;
>> +/* Note:
>> + * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
>> + */
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> char *bounce;
>> +#endif
>> RBDAIOCmd cmd;
>> int error;
>> struct BDRVRBDState *s;
>> @@ -83,7 +88,9 @@ typedef struct RADOSCB {
>> RBDAIOCB *acb;
>> struct BDRVRBDState *s;
>> int64_t size;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> char *buf;
>> +#endif
>> int64_t ret;
>> } RADOSCB;
>>
>> @@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>> }
>> } else {
>> if (r < 0) {
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> memset(rcb->buf, 0, rcb->size);
>> +#else
>> + iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
>> +#endif
>> acb->ret = r;
>> acb->error = 1;
>> } else if (r < rcb->size) {
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> memset(rcb->buf + r, 0, rcb->size - r);
>> +#else
>> + iov_memset(acb->qiov->iov, acb->qiov->niov,
>> + r, 0, acb->qiov->size - r);
>> +#endif
>> +
>> if (!acb->error) {
>> acb->ret = rcb->size;
>> }
>> @@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>>
>> g_free(rcb);
>>
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> if (acb->cmd == RBD_AIO_READ) {
>> qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
>> }
>> qemu_vfree(acb->bounce);
>> +#endif
>> acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
>>
>> qemu_aio_unref(acb);
>> @@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> RBDAIOCB *acb;
>> RADOSCB *rcb = NULL;
>> rbd_completion_t c;
>> - char *buf;
>> int r;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> + char *buf = NULL;
>> +#endif
>>
>> BDRVRBDState *s = bs->opaque;
>>
>> @@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> acb->cmd = cmd;
>> acb->qiov = qiov;
>> assert(!qiov || qiov->size == size);
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> +
>> if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
>> acb->bounce = NULL;
>> } else {
>> @@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> goto failed;
>> }
>> }
>> - acb->ret = 0;
>> - acb->error = 0;
>> - acb->s = s;
>> -
>> if (cmd == RBD_AIO_WRITE) {
>> qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
>> }
>> -
>> buf = acb->bounce;
>> +#endif
>> + acb->ret = 0;
>> + acb->error = 0;
>> + acb->s = s;
>>
>> rcb = g_new(RADOSCB, 1);
>> +
>> rcb->acb = acb;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> rcb->buf = buf;
>> +#endif
>> rcb->s = acb->s;
>> rcb->size = size;
>> r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
>> @@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>>
>> switch (cmd) {
>> case RBD_AIO_WRITE:
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> r = rbd_aio_write(s->image, off, size, buf, c);
>> +#else
>> + r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
>> +#endif
>> break;
>> case RBD_AIO_READ:
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> r = rbd_aio_read(s->image, off, size, buf, c);
>> +#else
>> + r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
>> +#endif
>> break;
>> case RBD_AIO_DISCARD:
>> r = rbd_aio_discard_wrapper(s->image, off, size, c);
>> @@ -719,7 +752,9 @@ failed_completion:
>> rbd_aio_release(c);
>> failed:
>> g_free(rcb);
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> qemu_vfree(acb->bounce);
>> +#endif
>> qemu_aio_unref(acb);
>> return NULL;
>> }
>> --
>> 2.10.2
>>
>
>
>
> --
> Jason
--
谦谦君子
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [RFC v5] RBD: Add support readv,writev for rbd
@ 2017-02-16 14:22 ` Jaze Lee
0 siblings, 0 replies; 25+ messages in thread
From: Jaze Lee @ 2017-02-16 14:22 UTC (permalink / raw)
To: Jason Dillaman
Cc: Josh Durgin, Jeff Cody, Kevin Wolf, Max Reitz, qemu-block,
qemu-devel, ceph-devel, tianqing
2017-02-16 22:14 GMT+08:00 Jason Dillaman <jdillama@redhat.com>:
> On Thu, Feb 16, 2017 at 4:00 AM, <jazeltq@gmail.com> wrote:
>> From: tianqing <tianqing@unitedstack.com>
>>
>> Rbd can do readv and writev directly, so wo do not need to transform
>> iov to buf or vice versa any more.
>>
>> Signed-off-by: tianqing <tianqing@unitedstack.com>
>> ---
>> block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
>> 1 file changed, 42 insertions(+), 7 deletions(-)
>>
>> diff --git a/block/rbd.c b/block/rbd.c
>> index a57b3e3..75ae1d6 100644
>> --- a/block/rbd.c
>> +++ b/block/rbd.c
>> @@ -47,7 +47,7 @@
>> */
>>
>> /* rbd_aio_discard added in 0.1.2 */
>> -#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
>> +#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
>> #define LIBRBD_SUPPORTS_DISCARD
>> #else
>> #undef LIBRBD_SUPPORTS_DISCARD
>
> Do not change this -- discard support is available in very old
> versions of librbd not just the future Luminous release.
Ok. Thanks a lot.
>
>> @@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
>> BlockAIOCB common;
>> int64_t ret;
>> QEMUIOVector *qiov;
>> +/* Note:
>> + * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
>> + */
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> char *bounce;
>> +#endif
>> RBDAIOCmd cmd;
>> int error;
>> struct BDRVRBDState *s;
>> @@ -83,7 +88,9 @@ typedef struct RADOSCB {
>> RBDAIOCB *acb;
>> struct BDRVRBDState *s;
>> int64_t size;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> char *buf;
>> +#endif
>> int64_t ret;
>> } RADOSCB;
>>
>> @@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>> }
>> } else {
>> if (r < 0) {
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> memset(rcb->buf, 0, rcb->size);
>> +#else
>> + iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
>> +#endif
>> acb->ret = r;
>> acb->error = 1;
>> } else if (r < rcb->size) {
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> memset(rcb->buf + r, 0, rcb->size - r);
>> +#else
>> + iov_memset(acb->qiov->iov, acb->qiov->niov,
>> + r, 0, acb->qiov->size - r);
>> +#endif
>> +
>> if (!acb->error) {
>> acb->ret = rcb->size;
>> }
>> @@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>>
>> g_free(rcb);
>>
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> if (acb->cmd == RBD_AIO_READ) {
>> qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
>> }
>> qemu_vfree(acb->bounce);
>> +#endif
>> acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
>>
>> qemu_aio_unref(acb);
>> @@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> RBDAIOCB *acb;
>> RADOSCB *rcb = NULL;
>> rbd_completion_t c;
>> - char *buf;
>> int r;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> + char *buf = NULL;
>> +#endif
>>
>> BDRVRBDState *s = bs->opaque;
>>
>> @@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> acb->cmd = cmd;
>> acb->qiov = qiov;
>> assert(!qiov || qiov->size == size);
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> +
>> if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
>> acb->bounce = NULL;
>> } else {
>> @@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> goto failed;
>> }
>> }
>> - acb->ret = 0;
>> - acb->error = 0;
>> - acb->s = s;
>> -
>> if (cmd == RBD_AIO_WRITE) {
>> qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
>> }
>> -
>> buf = acb->bounce;
>> +#endif
>> + acb->ret = 0;
>> + acb->error = 0;
>> + acb->s = s;
>>
>> rcb = g_new(RADOSCB, 1);
>> +
>> rcb->acb = acb;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> rcb->buf = buf;
>> +#endif
>> rcb->s = acb->s;
>> rcb->size = size;
>> r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
>> @@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>>
>> switch (cmd) {
>> case RBD_AIO_WRITE:
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> r = rbd_aio_write(s->image, off, size, buf, c);
>> +#else
>> + r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
>> +#endif
>> break;
>> case RBD_AIO_READ:
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> r = rbd_aio_read(s->image, off, size, buf, c);
>> +#else
>> + r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
>> +#endif
>> break;
>> case RBD_AIO_DISCARD:
>> r = rbd_aio_discard_wrapper(s->image, off, size, c);
>> @@ -719,7 +752,9 @@ failed_completion:
>> rbd_aio_release(c);
>> failed:
>> g_free(rcb);
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> qemu_vfree(acb->bounce);
>> +#endif
>> qemu_aio_unref(acb);
>> return NULL;
>> }
>> --
>> 2.10.2
>>
>
>
>
> --
> Jason
--
谦谦君子
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC v5] RBD: Add support readv,writev for rbd
2017-02-16 14:03 ` [Qemu-devel] " Jaze Lee
@ 2017-02-16 15:13 ` Alexandre DERUMIER
-1 siblings, 0 replies; 25+ messages in thread
From: Alexandre DERUMIER @ 2017-02-16 15:13 UTC (permalink / raw)
To: jazeltq
Cc: Tiger Hu, Josh Durgin, Jeff Cody, dillaman, Kevin Wolf, mreitz,
qemu-block, qemu-devel, ceph-devel, tianqing
>>No yet. I just test on one qemu-kvm vm. It works fine.
>>The performance may need more time.
>>Any one can test on this patch if you do fast....
Hi, I would like to bench it with small 4k read/write.
On the ceph side,do we need this PR ? :
https://github.com/ceph/ceph/pull/13447
----- Mail original -----
De: "jazeltq" <jazeltq@gmail.com>
À: "Tiger Hu" <hufh2004@gmail.com>
Cc: "Josh Durgin" <jdurgin@redhat.com>, "Jeff Cody" <jcody@redhat.com>, "dillaman" <dillaman@redhat.com>, "Kevin Wolf" <kwolf@redhat.com>, mreitz@redhat.com, qemu-block@nongnu.org, "qemu-devel" <qemu-devel@nongnu.org>, "ceph-devel" <ceph-devel@vger.kernel.org>, "tianqing" <tianqing@unitedstack.com>
Envoyé: Jeudi 16 Février 2017 15:03:52
Objet: Re: [RFC v5] RBD: Add support readv,writev for rbd
No yet. I just test on one qemu-kvm vm. It works fine.
The performance may need more time.
Any one can test on this patch if you do fast....
2017-02-16 20:07 GMT+08:00 Tiger Hu <hufh2004@gmail.com>:
> Tianqing,
>
> Do we have any performance data for this patch? Thanks.
>
> Tiger
>> 在 2017年2月16日,下午5:00,jazeltq@gmail.com 写道:
>>
>> From: tianqing <tianqing@unitedstack.com>
>>
>> Rbd can do readv and writev directly, so wo do not need to transform
>> iov to buf or vice versa any more.
>>
>> Signed-off-by: tianqing <tianqing@unitedstack.com>
>> ---
>> block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
>> 1 file changed, 42 insertions(+), 7 deletions(-)
>>
>> diff --git a/block/rbd.c b/block/rbd.c
>> index a57b3e3..75ae1d6 100644
>> --- a/block/rbd.c
>> +++ b/block/rbd.c
>> @@ -47,7 +47,7 @@
>> */
>>
>> /* rbd_aio_discard added in 0.1.2 */
>> -#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
>> +#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
>> #define LIBRBD_SUPPORTS_DISCARD
>> #else
>> #undef LIBRBD_SUPPORTS_DISCARD
>> @@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
>> BlockAIOCB common;
>> int64_t ret;
>> QEMUIOVector *qiov;
>> +/* Note:
>> + * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
>> + */
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> char *bounce;
>> +#endif
>> RBDAIOCmd cmd;
>> int error;
>> struct BDRVRBDState *s;
>> @@ -83,7 +88,9 @@ typedef struct RADOSCB {
>> RBDAIOCB *acb;
>> struct BDRVRBDState *s;
>> int64_t size;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> char *buf;
>> +#endif
>> int64_t ret;
>> } RADOSCB;
>>
>> @@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>> }
>> } else {
>> if (r < 0) {
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> memset(rcb->buf, 0, rcb->size);
>> +#else
>> + iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
>> +#endif
>> acb->ret = r;
>> acb->error = 1;
>> } else if (r < rcb->size) {
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> memset(rcb->buf + r, 0, rcb->size - r);
>> +#else
>> + iov_memset(acb->qiov->iov, acb->qiov->niov,
>> + r, 0, acb->qiov->size - r);
>> +#endif
>> +
>> if (!acb->error) {
>> acb->ret = rcb->size;
>> }
>> @@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>>
>> g_free(rcb);
>>
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> if (acb->cmd == RBD_AIO_READ) {
>> qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
>> }
>> qemu_vfree(acb->bounce);
>> +#endif
>> acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
>>
>> qemu_aio_unref(acb);
>> @@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> RBDAIOCB *acb;
>> RADOSCB *rcb = NULL;
>> rbd_completion_t c;
>> - char *buf;
>> int r;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> + char *buf = NULL;
>> +#endif
>>
>> BDRVRBDState *s = bs->opaque;
>>
>> @@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> acb->cmd = cmd;
>> acb->qiov = qiov;
>> assert(!qiov || qiov->size == size);
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> +
>> if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
>> acb->bounce = NULL;
>> } else {
>> @@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> goto failed;
>> }
>> }
>> - acb->ret = 0;
>> - acb->error = 0;
>> - acb->s = s;
>> -
>> if (cmd == RBD_AIO_WRITE) {
>> qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
>> }
>> -
>> buf = acb->bounce;
>> +#endif
>> + acb->ret = 0;
>> + acb->error = 0;
>> + acb->s = s;
>>
>> rcb = g_new(RADOSCB, 1);
>> +
>> rcb->acb = acb;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> rcb->buf = buf;
>> +#endif
>> rcb->s = acb->s;
>> rcb->size = size;
>> r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
>> @@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>>
>> switch (cmd) {
>> case RBD_AIO_WRITE:
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> r = rbd_aio_write(s->image, off, size, buf, c);
>> +#else
>> + r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
>> +#endif
>> break;
>> case RBD_AIO_READ:
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> r = rbd_aio_read(s->image, off, size, buf, c);
>> +#else
>> + r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
>> +#endif
>> break;
>> case RBD_AIO_DISCARD:
>> r = rbd_aio_discard_wrapper(s->image, off, size, c);
>> @@ -719,7 +752,9 @@ failed_completion:
>> rbd_aio_release(c);
>> failed:
>> g_free(rcb);
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> qemu_vfree(acb->bounce);
>> +#endif
>> qemu_aio_unref(acb);
>> return NULL;
>> }
>> --
>> 2.10.2
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
谦谦君子
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [RFC v5] RBD: Add support readv,writev for rbd
@ 2017-02-16 15:13 ` Alexandre DERUMIER
0 siblings, 0 replies; 25+ messages in thread
From: Alexandre DERUMIER @ 2017-02-16 15:13 UTC (permalink / raw)
To: jazeltq
Cc: Tiger Hu, Josh Durgin, Jeff Cody, dillaman, Kevin Wolf, mreitz,
qemu-block, qemu-devel, ceph-devel, tianqing
>>No yet. I just test on one qemu-kvm vm. It works fine.
>>The performance may need more time.
>>Any one can test on this patch if you do fast....
Hi, I would like to bench it with small 4k read/write.
On the ceph side,do we need this PR ? :
https://github.com/ceph/ceph/pull/13447
----- Mail original -----
De: "jazeltq" <jazeltq@gmail.com>
À: "Tiger Hu" <hufh2004@gmail.com>
Cc: "Josh Durgin" <jdurgin@redhat.com>, "Jeff Cody" <jcody@redhat.com>, "dillaman" <dillaman@redhat.com>, "Kevin Wolf" <kwolf@redhat.com>, mreitz@redhat.com, qemu-block@nongnu.org, "qemu-devel" <qemu-devel@nongnu.org>, "ceph-devel" <ceph-devel@vger.kernel.org>, "tianqing" <tianqing@unitedstack.com>
Envoyé: Jeudi 16 Février 2017 15:03:52
Objet: Re: [RFC v5] RBD: Add support readv,writev for rbd
No yet. I just test on one qemu-kvm vm. It works fine.
The performance may need more time.
Any one can test on this patch if you do fast....
2017-02-16 20:07 GMT+08:00 Tiger Hu <hufh2004@gmail.com>:
> Tianqing,
>
> Do we have any performance data for this patch? Thanks.
>
> Tiger
>> 在 2017年2月16日,下午5:00,jazeltq@gmail.com 写道:
>>
>> From: tianqing <tianqing@unitedstack.com>
>>
>> Rbd can do readv and writev directly, so wo do not need to transform
>> iov to buf or vice versa any more.
>>
>> Signed-off-by: tianqing <tianqing@unitedstack.com>
>> ---
>> block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
>> 1 file changed, 42 insertions(+), 7 deletions(-)
>>
>> diff --git a/block/rbd.c b/block/rbd.c
>> index a57b3e3..75ae1d6 100644
>> --- a/block/rbd.c
>> +++ b/block/rbd.c
>> @@ -47,7 +47,7 @@
>> */
>>
>> /* rbd_aio_discard added in 0.1.2 */
>> -#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
>> +#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
>> #define LIBRBD_SUPPORTS_DISCARD
>> #else
>> #undef LIBRBD_SUPPORTS_DISCARD
>> @@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
>> BlockAIOCB common;
>> int64_t ret;
>> QEMUIOVector *qiov;
>> +/* Note:
>> + * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
>> + */
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> char *bounce;
>> +#endif
>> RBDAIOCmd cmd;
>> int error;
>> struct BDRVRBDState *s;
>> @@ -83,7 +88,9 @@ typedef struct RADOSCB {
>> RBDAIOCB *acb;
>> struct BDRVRBDState *s;
>> int64_t size;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> char *buf;
>> +#endif
>> int64_t ret;
>> } RADOSCB;
>>
>> @@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>> }
>> } else {
>> if (r < 0) {
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> memset(rcb->buf, 0, rcb->size);
>> +#else
>> + iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
>> +#endif
>> acb->ret = r;
>> acb->error = 1;
>> } else if (r < rcb->size) {
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> memset(rcb->buf + r, 0, rcb->size - r);
>> +#else
>> + iov_memset(acb->qiov->iov, acb->qiov->niov,
>> + r, 0, acb->qiov->size - r);
>> +#endif
>> +
>> if (!acb->error) {
>> acb->ret = rcb->size;
>> }
>> @@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>>
>> g_free(rcb);
>>
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> if (acb->cmd == RBD_AIO_READ) {
>> qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
>> }
>> qemu_vfree(acb->bounce);
>> +#endif
>> acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
>>
>> qemu_aio_unref(acb);
>> @@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> RBDAIOCB *acb;
>> RADOSCB *rcb = NULL;
>> rbd_completion_t c;
>> - char *buf;
>> int r;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> + char *buf = NULL;
>> +#endif
>>
>> BDRVRBDState *s = bs->opaque;
>>
>> @@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> acb->cmd = cmd;
>> acb->qiov = qiov;
>> assert(!qiov || qiov->size == size);
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> +
>> if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
>> acb->bounce = NULL;
>> } else {
>> @@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> goto failed;
>> }
>> }
>> - acb->ret = 0;
>> - acb->error = 0;
>> - acb->s = s;
>> -
>> if (cmd == RBD_AIO_WRITE) {
>> qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
>> }
>> -
>> buf = acb->bounce;
>> +#endif
>> + acb->ret = 0;
>> + acb->error = 0;
>> + acb->s = s;
>>
>> rcb = g_new(RADOSCB, 1);
>> +
>> rcb->acb = acb;
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> rcb->buf = buf;
>> +#endif
>> rcb->s = acb->s;
>> rcb->size = size;
>> r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
>> @@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>>
>> switch (cmd) {
>> case RBD_AIO_WRITE:
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> r = rbd_aio_write(s->image, off, size, buf, c);
>> +#else
>> + r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
>> +#endif
>> break;
>> case RBD_AIO_READ:
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> r = rbd_aio_read(s->image, off, size, buf, c);
>> +#else
>> + r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
>> +#endif
>> break;
>> case RBD_AIO_DISCARD:
>> r = rbd_aio_discard_wrapper(s->image, off, size, c);
>> @@ -719,7 +752,9 @@ failed_completion:
>> rbd_aio_release(c);
>> failed:
>> g_free(rcb);
>> +#ifndef LIBRBD_SUPPORTS_IOVEC
>> qemu_vfree(acb->bounce);
>> +#endif
>> qemu_aio_unref(acb);
>> return NULL;
>> }
>> --
>> 2.10.2
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
谦谦君子
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC v5] RBD: Add support readv,writev for rbd
2017-02-16 15:13 ` [Qemu-devel] " Alexandre DERUMIER
@ 2017-02-16 15:26 ` Jason Dillaman
-1 siblings, 0 replies; 25+ messages in thread
From: Jason Dillaman @ 2017-02-16 15:26 UTC (permalink / raw)
To: Alexandre DERUMIER
Cc: jazeltq, Tiger Hu, Josh Durgin, Jeff Cody, Kevin Wolf, Max Reitz,
qemu-block, qemu-devel, ceph-devel, tianqing
On Thu, Feb 16, 2017 at 10:13 AM, Alexandre DERUMIER
<aderumier@odiso.com> wrote:
> Hi, I would like to bench it with small 4k read/write.
>
> On the ceph side,do we need this PR ? :
> https://github.com/ceph/ceph/pull/13447
Yes, that is the correct PR for the client-side librbd changes. You
should be able to test it against Hammer/Jewel-release clusters.
--
Jason
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [RFC v5] RBD: Add support readv,writev for rbd
@ 2017-02-16 15:26 ` Jason Dillaman
0 siblings, 0 replies; 25+ messages in thread
From: Jason Dillaman @ 2017-02-16 15:26 UTC (permalink / raw)
To: Alexandre DERUMIER
Cc: jazeltq, Tiger Hu, Josh Durgin, Jeff Cody, Kevin Wolf, Max Reitz,
qemu-block, qemu-devel, ceph-devel, tianqing
On Thu, Feb 16, 2017 at 10:13 AM, Alexandre DERUMIER
<aderumier@odiso.com> wrote:
> Hi, I would like to bench it with small 4k read/write.
>
> On the ceph side,do we need this PR ? :
> https://github.com/ceph/ceph/pull/13447
Yes, that is the correct PR for the client-side librbd changes. You
should be able to test it against Hammer/Jewel-release clusters.
--
Jason
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [RFC v5] RBD: Add support readv,writev for rbd
2017-02-16 9:00 ` [Qemu-devel] " jazeltq
@ 2017-02-16 15:45 ` Eric Blake
-1 siblings, 0 replies; 25+ messages in thread
From: Eric Blake @ 2017-02-16 15:45 UTC (permalink / raw)
To: jazeltq, jdurgin, jcody, dillaman, kwolf, mreitz, qemu-block
Cc: tianqing, ceph-devel, qemu-devel
[-- Attachment #1.1: Type: text/plain, Size: 1114 bytes --]
On 02/16/2017 03:00 AM, jazeltq@gmail.com wrote:
> From: tianqing <tianqing@unitedstack.com>
>
> Rbd can do readv and writev directly, so wo do not need to transform
> iov to buf or vice versa any more.
In general, we prefer new revisions of a patch series to be sent as a
new top-level thread, rather than buried in-reply-to the earlier
revision, as nesting can mess up some of the automated tooling that
tests whether a patch will introduce problems.
>
> Signed-off-by: tianqing <tianqing@unitedstack.com>
> ---
> block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 42 insertions(+), 7 deletions(-)
>
> diff --git a/block/rbd.c b/block/rbd.c
> index a57b3e3..75ae1d6 100644
> --- a/block/rbd.c
> +++ b/block/rbd.c
> @@ -47,7 +47,7 @@
> */
>
> /* rbd_aio_discard added in 0.1.2 */
> -#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
> +#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
Does the comment need updating, too?
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [RFC v5] RBD: Add support readv,writev for rbd
@ 2017-02-16 15:45 ` Eric Blake
0 siblings, 0 replies; 25+ messages in thread
From: Eric Blake @ 2017-02-16 15:45 UTC (permalink / raw)
To: jazeltq, jdurgin, jcody, dillaman, kwolf, mreitz, qemu-block
Cc: tianqing, ceph-devel, qemu-devel
[-- Attachment #1: Type: text/plain, Size: 1114 bytes --]
On 02/16/2017 03:00 AM, jazeltq@gmail.com wrote:
> From: tianqing <tianqing@unitedstack.com>
>
> Rbd can do readv and writev directly, so wo do not need to transform
> iov to buf or vice versa any more.
In general, we prefer new revisions of a patch series to be sent as a
new top-level thread, rather than buried in-reply-to the earlier
revision, as nesting can mess up some of the automated tooling that
tests whether a patch will introduce problems.
>
> Signed-off-by: tianqing <tianqing@unitedstack.com>
> ---
> block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 42 insertions(+), 7 deletions(-)
>
> diff --git a/block/rbd.c b/block/rbd.c
> index a57b3e3..75ae1d6 100644
> --- a/block/rbd.c
> +++ b/block/rbd.c
> @@ -47,7 +47,7 @@
> */
>
> /* rbd_aio_discard added in 0.1.2 */
> -#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
> +#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
Does the comment need updating, too?
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [RFC v5] RBD: Add support readv,writev for rbd
2017-02-16 9:00 ` [Qemu-devel] " jazeltq
@ 2017-02-16 15:51 ` Jeff Cody
-1 siblings, 0 replies; 25+ messages in thread
From: Jeff Cody @ 2017-02-16 15:51 UTC (permalink / raw)
To: jazeltq
Cc: jdurgin, dillaman, kwolf, mreitz, qemu-block, qemu-devel,
ceph-devel, eblake, tianqing
On Thu, Feb 16, 2017 at 05:00:02PM +0800, jazeltq@gmail.com wrote:
> From: tianqing <tianqing@unitedstack.com>
>
> Rbd can do readv and writev directly, so wo do not need to transform
> iov to buf or vice versa any more.
>
> Signed-off-by: tianqing <tianqing@unitedstack.com>
> ---
> block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 42 insertions(+), 7 deletions(-)
>
> diff --git a/block/rbd.c b/block/rbd.c
> index a57b3e3..75ae1d6 100644
> --- a/block/rbd.c
> +++ b/block/rbd.c
> @@ -47,7 +47,7 @@
> */
>
> /* rbd_aio_discard added in 0.1.2 */
> -#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
> +#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
> #define LIBRBD_SUPPORTS_DISCARD
> #else
> #undef LIBRBD_SUPPORTS_DISCARD
> @@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
> BlockAIOCB common;
> int64_t ret;
> QEMUIOVector *qiov;
> +/* Note:
> + * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
> + */
I understand that since this feature relies on new symbols in the library,
the ifdef can't be entirely avoided. However, there are a few changes that
can make the code much more readable, and greatly reduce the use of ifdefs
through the code.
For instance, you could have helper constants:
#ifdef LIBRBD_SUPPORTS_IOVEC
#define LIBRBD_USE_IOVEC 1
#else
#define LIBRBD_USE_IOVEC 0
#endif
Now that can be used for a more natural code, with minimal ifdefs. The
compiler optimizations should still remove the code, as well.
A helper function for memset will also keep things simpler:
static void qemu_rbd_memset(RADOSCB *rcb, int64_t offs)
{
if (LIBRBD_USE_IOVEC) {
RBDAIOCB *acb = rcb->acb;
iov_memset(acb->qiov->iov, acb->qiov->niov, offs, 0,
acb->qiov->size - offs);
} else {
memset(rcb->buf + offs, 0, rcb->size - offs);
}
}
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> char *bounce;
> +#endif
This conditional can go away (see [1]).
> RBDAIOCmd cmd;
> int error;
> struct BDRVRBDState *s;
> @@ -83,7 +88,9 @@ typedef struct RADOSCB {
> RBDAIOCB *acb;
> struct BDRVRBDState *s;
> int64_t size;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> char *buf;
> +#endif
As can this.
> int64_t ret;
> } RADOSCB;
>
> @@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
> }
> } else {
> if (r < 0) {
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> memset(rcb->buf, 0, rcb->size);
> +#else
> + iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
> +#endif
This just becomes:
qemu_rbd_memset(rcb, 0);
> acb->ret = r;
> acb->error = 1;
> } else if (r < rcb->size) {
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> memset(rcb->buf + r, 0, rcb->size - r);
> +#else
> + iov_memset(acb->qiov->iov, acb->qiov->niov,
> + r, 0, acb->qiov->size - r);
> +#endif
> +
Same here:
qemu_rbd_memset(rcb, r);
> if (!acb->error) {
> acb->ret = rcb->size;
> }
> @@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>
> g_free(rcb);
>
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> if (acb->cmd == RBD_AIO_READ) {
> qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
> }
> qemu_vfree(acb->bounce);
> +#endif
[1]
Instead of a conditional, you can now use the constant with an if statement:
if (!LIBRBD_USE_IOVEC) {
if (acb->cmd == RBD_AIO_READ) {
qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
}
qemu_vfree(acb->bounce);
}
> acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
>
> qemu_aio_unref(acb);
> @@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> RBDAIOCB *acb;
> RADOSCB *rcb = NULL;
> rbd_completion_t c;
> - char *buf;
> int r;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> + char *buf = NULL;
> +#endif
This variable can completely go away with some code re-arrangement (below)
>
> BDRVRBDState *s = bs->opaque;
>
> @@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> acb->cmd = cmd;
> acb->qiov = qiov;
> assert(!qiov || qiov->size == size);
[2]
Allocate rcb here
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> +
You can use if(!LIBRBD_USE_IOVEC) here then.
> if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
> acb->bounce = NULL;
> } else {
> @@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> goto failed;
> }
> }
> - acb->ret = 0;
> - acb->error = 0;
> - acb->s = s;
> -
> if (cmd == RBD_AIO_WRITE) {
> qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
> }
> -
> buf = acb->bounce;
This can just become rcb->buf = acb->bounce
> +#endif
> + acb->ret = 0;
> + acb->error = 0;
> + acb->s = s;
>
> rcb = g_new(RADOSCB, 1);
Move this to [2]
> +
> rcb->acb = acb;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> rcb->buf = buf;
> +#endif
These 3 lines can then go away
> rcb->s = acb->s;
> rcb->size = size;
> r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
> @@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>
> switch (cmd) {
> case RBD_AIO_WRITE:
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> r = rbd_aio_write(s->image, off, size, buf, c);
If you use rcb->buf here, that allows buf to go away completely.
> +#else
> + r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
> +#endif
> break;
> case RBD_AIO_READ:
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> r = rbd_aio_read(s->image, off, size, buf, c);
Same
> +#else
> + r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
> +#endif
> break;
> case RBD_AIO_DISCARD:
> r = rbd_aio_discard_wrapper(s->image, off, size, c);
> @@ -719,7 +752,9 @@ failed_completion:
> rbd_aio_release(c);
> failed:
> g_free(rcb);
> +#ifndef LIBRBD_SUPPORTS_IOVEC
And use the if(!LIBRBD_USE_IOVEC) here too.
> qemu_vfree(acb->bounce);
> +#endif
> qemu_aio_unref(acb);
> return NULL;
> }
> --
> 2.10.2
>
-Jeff
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [RFC v5] RBD: Add support readv,writev for rbd
@ 2017-02-16 15:51 ` Jeff Cody
0 siblings, 0 replies; 25+ messages in thread
From: Jeff Cody @ 2017-02-16 15:51 UTC (permalink / raw)
To: jazeltq
Cc: jdurgin, dillaman, kwolf, mreitz, qemu-block, qemu-devel,
ceph-devel, eblake, tianqing
On Thu, Feb 16, 2017 at 05:00:02PM +0800, jazeltq@gmail.com wrote:
> From: tianqing <tianqing@unitedstack.com>
>
> Rbd can do readv and writev directly, so wo do not need to transform
> iov to buf or vice versa any more.
>
> Signed-off-by: tianqing <tianqing@unitedstack.com>
> ---
> block/rbd.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 42 insertions(+), 7 deletions(-)
>
> diff --git a/block/rbd.c b/block/rbd.c
> index a57b3e3..75ae1d6 100644
> --- a/block/rbd.c
> +++ b/block/rbd.c
> @@ -47,7 +47,7 @@
> */
>
> /* rbd_aio_discard added in 0.1.2 */
> -#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
> +#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(12, 0, 0)
> #define LIBRBD_SUPPORTS_DISCARD
> #else
> #undef LIBRBD_SUPPORTS_DISCARD
> @@ -73,7 +73,12 @@ typedef struct RBDAIOCB {
> BlockAIOCB common;
> int64_t ret;
> QEMUIOVector *qiov;
> +/* Note:
> + * The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h.
> + */
I understand that since this feature relies on new symbols in the library,
the ifdef can't be entirely avoided. However, there are a few changes that
can make the code much more readable, and greatly reduce the use of ifdefs
through the code.
For instance, you could have helper constants:
#ifdef LIBRBD_SUPPORTS_IOVEC
#define LIBRBD_USE_IOVEC 1
#else
#define LIBRBD_USE_IOVEC 0
#endif
Now that can be used for a more natural code, with minimal ifdefs. The
compiler optimizations should still remove the code, as well.
A helper function for memset will also keep things simpler:
static void qemu_rbd_memset(RADOSCB *rcb, int64_t offs)
{
if (LIBRBD_USE_IOVEC) {
RBDAIOCB *acb = rcb->acb;
iov_memset(acb->qiov->iov, acb->qiov->niov, offs, 0,
acb->qiov->size - offs);
} else {
memset(rcb->buf + offs, 0, rcb->size - offs);
}
}
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> char *bounce;
> +#endif
This conditional can go away (see [1]).
> RBDAIOCmd cmd;
> int error;
> struct BDRVRBDState *s;
> @@ -83,7 +88,9 @@ typedef struct RADOSCB {
> RBDAIOCB *acb;
> struct BDRVRBDState *s;
> int64_t size;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> char *buf;
> +#endif
As can this.
> int64_t ret;
> } RADOSCB;
>
> @@ -426,11 +433,21 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
> }
> } else {
> if (r < 0) {
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> memset(rcb->buf, 0, rcb->size);
> +#else
> + iov_memset(acb->qiov->iov, acb->qiov->niov, 0, 0, acb->qiov->size);
> +#endif
This just becomes:
qemu_rbd_memset(rcb, 0);
> acb->ret = r;
> acb->error = 1;
> } else if (r < rcb->size) {
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> memset(rcb->buf + r, 0, rcb->size - r);
> +#else
> + iov_memset(acb->qiov->iov, acb->qiov->niov,
> + r, 0, acb->qiov->size - r);
> +#endif
> +
Same here:
qemu_rbd_memset(rcb, r);
> if (!acb->error) {
> acb->ret = rcb->size;
> }
> @@ -441,10 +458,12 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
>
> g_free(rcb);
>
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> if (acb->cmd == RBD_AIO_READ) {
> qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
> }
> qemu_vfree(acb->bounce);
> +#endif
[1]
Instead of a conditional, you can now use the constant with an if statement:
if (!LIBRBD_USE_IOVEC) {
if (acb->cmd == RBD_AIO_READ) {
qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
}
qemu_vfree(acb->bounce);
}
> acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
>
> qemu_aio_unref(acb);
> @@ -655,8 +674,10 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> RBDAIOCB *acb;
> RADOSCB *rcb = NULL;
> rbd_completion_t c;
> - char *buf;
> int r;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> + char *buf = NULL;
> +#endif
This variable can completely go away with some code re-arrangement (below)
>
> BDRVRBDState *s = bs->opaque;
>
> @@ -664,6 +685,8 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> acb->cmd = cmd;
> acb->qiov = qiov;
> assert(!qiov || qiov->size == size);
[2]
Allocate rcb here
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> +
You can use if(!LIBRBD_USE_IOVEC) here then.
> if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
> acb->bounce = NULL;
> } else {
> @@ -672,19 +695,21 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> goto failed;
> }
> }
> - acb->ret = 0;
> - acb->error = 0;
> - acb->s = s;
> -
> if (cmd == RBD_AIO_WRITE) {
> qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
> }
> -
> buf = acb->bounce;
This can just become rcb->buf = acb->bounce
> +#endif
> + acb->ret = 0;
> + acb->error = 0;
> + acb->s = s;
>
> rcb = g_new(RADOSCB, 1);
Move this to [2]
> +
> rcb->acb = acb;
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> rcb->buf = buf;
> +#endif
These 3 lines can then go away
> rcb->s = acb->s;
> rcb->size = size;
> r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
> @@ -694,10 +719,18 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>
> switch (cmd) {
> case RBD_AIO_WRITE:
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> r = rbd_aio_write(s->image, off, size, buf, c);
If you use rcb->buf here, that allows buf to go away completely.
> +#else
> + r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
> +#endif
> break;
> case RBD_AIO_READ:
> +#ifndef LIBRBD_SUPPORTS_IOVEC
> r = rbd_aio_read(s->image, off, size, buf, c);
Same
> +#else
> + r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
> +#endif
> break;
> case RBD_AIO_DISCARD:
> r = rbd_aio_discard_wrapper(s->image, off, size, c);
> @@ -719,7 +752,9 @@ failed_completion:
> rbd_aio_release(c);
> failed:
> g_free(rcb);
> +#ifndef LIBRBD_SUPPORTS_IOVEC
And use the if(!LIBRBD_USE_IOVEC) here too.
> qemu_vfree(acb->bounce);
> +#endif
> qemu_aio_unref(acb);
> return NULL;
> }
> --
> 2.10.2
>
-Jeff
^ permalink raw reply [flat|nested] 25+ messages in thread
end of thread, other threads:[~2017-02-16 15:52 UTC | newest]
Thread overview: 25+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-21 10:59 [RFC v3] RBD: Add support readv,writev for rbd jazeltq
2017-01-21 10:59 ` [Qemu-devel] " jazeltq
2017-01-21 11:13 ` no-reply
2017-01-21 13:19 ` [RFC v4] " jazeltq
2017-01-21 13:19 ` [Qemu-devel] " jazeltq
2017-02-16 8:43 ` jazeltq
2017-02-16 8:43 ` [Qemu-devel] " jazeltq
2017-02-16 9:00 ` [RFC v5] " jazeltq
2017-02-16 9:00 ` [Qemu-devel] " jazeltq
2017-02-16 12:07 ` Tiger Hu
2017-02-16 12:07 ` [Qemu-devel] " Tiger Hu
2017-02-16 14:03 ` Jaze Lee
2017-02-16 14:03 ` [Qemu-devel] " Jaze Lee
2017-02-16 15:13 ` Alexandre DERUMIER
2017-02-16 15:13 ` [Qemu-devel] " Alexandre DERUMIER
2017-02-16 15:26 ` Jason Dillaman
2017-02-16 15:26 ` [Qemu-devel] " Jason Dillaman
2017-02-16 14:14 ` Jason Dillaman
2017-02-16 14:14 ` [Qemu-devel] " Jason Dillaman
2017-02-16 14:22 ` Jaze Lee
2017-02-16 14:22 ` [Qemu-devel] " Jaze Lee
2017-02-16 15:45 ` Eric Blake
2017-02-16 15:45 ` Eric Blake
2017-02-16 15:51 ` Jeff Cody
2017-02-16 15:51 ` [Qemu-devel] " Jeff Cody
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.