* [Qemu-devel] [PATCH 1/2] migration: implement io_set_aio_fd_handler function for RDMA QIOChannel
@ 2018-05-07 13:52 Lidong Chen
2018-05-07 13:52 ` [Qemu-devel] [PATCH 2/2] migration: invoke qio_channel_yield only when qemu_in_coroutine() Lidong Chen
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Lidong Chen @ 2018-05-07 13:52 UTC (permalink / raw)
To: quintela, dgilbert, berrange
Cc: qemu-devel, galsha, aviadye, adido, Lidong Chen
if qio_channel_rdma_readv return QIO_CHANNEL_ERR_BLOCK, the destination qemu
crash.
The backtrace is:
(gdb) bt
#0 0x0000000000000000 in ?? ()
#1 0x00000000008db50e in qio_channel_set_aio_fd_handler (ioc=0x38111e0, ctx=0x3726080,
io_read=0x8db841 <qio_channel_restart_read>, io_write=0x0, opaque=0x38111e0) at io/channel.c:
#2 0x00000000008db952 in qio_channel_set_aio_fd_handlers (ioc=0x38111e0) at io/channel.c:438
#3 0x00000000008dbab4 in qio_channel_yield (ioc=0x38111e0, condition=G_IO_IN) at io/channel.c:47
#4 0x00000000007a870b in channel_get_buffer (opaque=0x38111e0, buf=0x440c038 "", pos=0, size=327
at migration/qemu-file-channel.c:83
#5 0x00000000007a70f6 in qemu_fill_buffer (f=0x440c000) at migration/qemu-file.c:299
#6 0x00000000007a79d0 in qemu_peek_byte (f=0x440c000, offset=0) at migration/qemu-file.c:562
#7 0x00000000007a7a22 in qemu_get_byte (f=0x440c000) at migration/qemu-file.c:575
#8 0x00000000007a7c78 in qemu_get_be32 (f=0x440c000) at migration/qemu-file.c:655
#9 0x00000000007a0508 in qemu_loadvm_state (f=0x440c000) at migration/savevm.c:2126
#10 0x0000000000794141 in process_incoming_migration_co (opaque=0x0) at migration/migration.c:366
#11 0x000000000095c598 in coroutine_trampoline (i0=84033984, i1=0) at util/coroutine-ucontext.c:1
#12 0x00007f9c0db56d40 in ?? () from /lib64/libc.so.6
#13 0x00007f96fe858760 in ?? ()
#14 0x0000000000000000 in ?? ()
RDMA QIOChannel not implement io_set_aio_fd_handler. so
qio_channel_set_aio_fd_handler will access NULL pointer.
Signed-off-by: Lidong Chen <lidongchen@tencent.com>
---
migration/rdma.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/migration/rdma.c b/migration/rdma.c
index 92e4d30..dfa4f77 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -2963,6 +2963,21 @@ static GSource *qio_channel_rdma_create_watch(QIOChannel *ioc,
return source;
}
+static void qio_channel_rdma_set_aio_fd_handler(QIOChannel *ioc,
+ AioContext *ctx,
+ IOHandler *io_read,
+ IOHandler *io_write,
+ void *opaque)
+{
+ QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(ioc);
+ if (io_read) {
+ aio_set_fd_handler(ctx, rioc->rdmain->comp_channel->fd,
+ false, io_read, io_write, NULL, opaque);
+ } else {
+ aio_set_fd_handler(ctx, rioc->rdmaout->comp_channel->fd,
+ false, io_read, io_write, NULL, opaque);
+ }
+}
static int qio_channel_rdma_close(QIOChannel *ioc,
Error **errp)
@@ -3822,6 +3837,7 @@ static void qio_channel_rdma_class_init(ObjectClass *klass,
ioc_klass->io_set_blocking = qio_channel_rdma_set_blocking;
ioc_klass->io_close = qio_channel_rdma_close;
ioc_klass->io_create_watch = qio_channel_rdma_create_watch;
+ ioc_klass->io_set_aio_fd_handler = qio_channel_rdma_set_aio_fd_handler;
}
static const TypeInfo qio_channel_rdma_info = {
--
1.8.3.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH 2/2] migration: invoke qio_channel_yield only when qemu_in_coroutine()
2018-05-07 13:52 [Qemu-devel] [PATCH 1/2] migration: implement io_set_aio_fd_handler function for RDMA QIOChannel Lidong Chen
@ 2018-05-07 13:52 ` Lidong Chen
2018-05-08 12:36 ` Juan Quintela
2018-05-08 12:34 ` [Qemu-devel] [PATCH 1/2] migration: implement io_set_aio_fd_handler function for RDMA QIOChannel Juan Quintela
2018-05-08 17:09 ` Juan Quintela
2 siblings, 1 reply; 7+ messages in thread
From: Lidong Chen @ 2018-05-07 13:52 UTC (permalink / raw)
To: quintela, dgilbert, berrange
Cc: qemu-devel, galsha, aviadye, adido, Lidong Chen
when qio_channel_read return QIO_CHANNEL_ERR_BLOCK, the source qemu crash.
The backtrace is:
(gdb) bt
#0 0x00007fb20aba91d7 in raise () from /lib64/libc.so.6
#1 0x00007fb20abaa8c8 in abort () from /lib64/libc.so.6
#2 0x00007fb20aba2146 in __assert_fail_base () from /lib64/libc.so.6
#3 0x00007fb20aba21f2 in __assert_fail () from /lib64/libc.so.6
#4 0x00000000008dba2d in qio_channel_yield (ioc=0x22f9e20, condition=G_IO_IN) at io/channel.c:460
#5 0x00000000007a870b in channel_get_buffer (opaque=0x22f9e20, buf=0x3d54038 "", pos=0, size=32768)
at migration/qemu-file-channel.c:83
#6 0x00000000007a70f6 in qemu_fill_buffer (f=0x3d54000) at migration/qemu-file.c:299
#7 0x00000000007a79d0 in qemu_peek_byte (f=0x3d54000, offset=0) at migration/qemu-file.c:562
#8 0x00000000007a7a22 in qemu_get_byte (f=0x3d54000) at migration/qemu-file.c:575
#9 0x00000000007a7c46 in qemu_get_be16 (f=0x3d54000) at migration/qemu-file.c:647
#10 0x0000000000796db7 in source_return_path_thread (opaque=0x2242280) at migration/migration.c:1794
#11 0x00000000009428fa in qemu_thread_start (args=0x3e58420) at util/qemu-thread-posix.c:504
#12 0x00007fb20af3ddc5 in start_thread () from /lib64/libpthread.so.0
#13 0x00007fb20ac6b74d in clone () from /lib64/libc.so.6
This patch fixed by invoke qio_channel_yield only when qemu_in_coroutine().
Signed-off-by: Lidong Chen <lidongchen@tencent.com>
---
migration/qemu-file-channel.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/migration/qemu-file-channel.c b/migration/qemu-file-channel.c
index e202d73..8e639eb 100644
--- a/migration/qemu-file-channel.c
+++ b/migration/qemu-file-channel.c
@@ -49,7 +49,11 @@ static ssize_t channel_writev_buffer(void *opaque,
ssize_t len;
len = qio_channel_writev(ioc, local_iov, nlocal_iov, NULL);
if (len == QIO_CHANNEL_ERR_BLOCK) {
- qio_channel_wait(ioc, G_IO_OUT);
+ if (qemu_in_coroutine()) {
+ qio_channel_yield(ioc, G_IO_OUT);
+ } else {
+ qio_channel_wait(ioc, G_IO_OUT);
+ }
continue;
}
if (len < 0) {
@@ -80,7 +84,11 @@ static ssize_t channel_get_buffer(void *opaque,
ret = qio_channel_read(ioc, (char *)buf, size, NULL);
if (ret < 0) {
if (ret == QIO_CHANNEL_ERR_BLOCK) {
- qio_channel_yield(ioc, G_IO_IN);
+ if (qemu_in_coroutine()) {
+ qio_channel_yield(ioc, G_IO_IN);
+ } else {
+ qio_channel_wait(ioc, G_IO_IN);
+ }
} else {
/* XXX handle Error * object */
return -EIO;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] migration: implement io_set_aio_fd_handler function for RDMA QIOChannel
2018-05-07 13:52 [Qemu-devel] [PATCH 1/2] migration: implement io_set_aio_fd_handler function for RDMA QIOChannel Lidong Chen
2018-05-07 13:52 ` [Qemu-devel] [PATCH 2/2] migration: invoke qio_channel_yield only when qemu_in_coroutine() Lidong Chen
@ 2018-05-08 12:34 ` Juan Quintela
2018-05-08 17:09 ` Juan Quintela
2 siblings, 0 replies; 7+ messages in thread
From: Juan Quintela @ 2018-05-08 12:34 UTC (permalink / raw)
To: Lidong Chen
Cc: dgilbert, berrange, qemu-devel, galsha, aviadye, adido, Lidong Chen
Lidong Chen <jemmy858585@gmail.com> wrote:
> if qio_channel_rdma_readv return QIO_CHANNEL_ERR_BLOCK, the destination qemu
> crash.
>
> The backtrace is:
> (gdb) bt
> #0 0x0000000000000000 in ?? ()
> #1 0x00000000008db50e in qio_channel_set_aio_fd_handler (ioc=0x38111e0, ctx=0x3726080,
> io_read=0x8db841 <qio_channel_restart_read>, io_write=0x0, opaque=0x38111e0) at io/channel.c:
> #2 0x00000000008db952 in qio_channel_set_aio_fd_handlers (ioc=0x38111e0) at io/channel.c:438
> #3 0x00000000008dbab4 in qio_channel_yield (ioc=0x38111e0, condition=G_IO_IN) at io/channel.c:47
> #4 0x00000000007a870b in channel_get_buffer (opaque=0x38111e0, buf=0x440c038 "", pos=0, size=327
> at migration/qemu-file-channel.c:83
> #5 0x00000000007a70f6 in qemu_fill_buffer (f=0x440c000) at migration/qemu-file.c:299
> #6 0x00000000007a79d0 in qemu_peek_byte (f=0x440c000, offset=0) at migration/qemu-file.c:562
> #7 0x00000000007a7a22 in qemu_get_byte (f=0x440c000) at migration/qemu-file.c:575
> #8 0x00000000007a7c78 in qemu_get_be32 (f=0x440c000) at migration/qemu-file.c:655
> #9 0x00000000007a0508 in qemu_loadvm_state (f=0x440c000) at migration/savevm.c:2126
> #10 0x0000000000794141 in process_incoming_migration_co (opaque=0x0) at migration/migration.c:366
> #11 0x000000000095c598 in coroutine_trampoline (i0=84033984, i1=0) at util/coroutine-ucontext.c:1
> #12 0x00007f9c0db56d40 in ?? () from /lib64/libc.so.6
> #13 0x00007f96fe858760 in ?? ()
> #14 0x0000000000000000 in ?? ()
>
> RDMA QIOChannel not implement io_set_aio_fd_handler. so
> qio_channel_set_aio_fd_handler will access NULL pointer.
>
> Signed-off-by: Lidong Chen <lidongchen@tencent.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
queued
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] migration: invoke qio_channel_yield only when qemu_in_coroutine()
2018-05-07 13:52 ` [Qemu-devel] [PATCH 2/2] migration: invoke qio_channel_yield only when qemu_in_coroutine() Lidong Chen
@ 2018-05-08 12:36 ` Juan Quintela
0 siblings, 0 replies; 7+ messages in thread
From: Juan Quintela @ 2018-05-08 12:36 UTC (permalink / raw)
To: Lidong Chen
Cc: dgilbert, berrange, qemu-devel, galsha, aviadye, adido, Lidong Chen
Lidong Chen <jemmy858585@gmail.com> wrote:
> when qio_channel_read return QIO_CHANNEL_ERR_BLOCK, the source qemu crash.
>
> The backtrace is:
> (gdb) bt
> #0 0x00007fb20aba91d7 in raise () from /lib64/libc.so.6
> #1 0x00007fb20abaa8c8 in abort () from /lib64/libc.so.6
> #2 0x00007fb20aba2146 in __assert_fail_base () from /lib64/libc.so.6
> #3 0x00007fb20aba21f2 in __assert_fail () from /lib64/libc.so.6
> #4 0x00000000008dba2d in qio_channel_yield (ioc=0x22f9e20, condition=G_IO_IN) at io/channel.c:460
> #5 0x00000000007a870b in channel_get_buffer (opaque=0x22f9e20, buf=0x3d54038 "", pos=0, size=32768)
> at migration/qemu-file-channel.c:83
> #6 0x00000000007a70f6 in qemu_fill_buffer (f=0x3d54000) at migration/qemu-file.c:299
> #7 0x00000000007a79d0 in qemu_peek_byte (f=0x3d54000, offset=0) at migration/qemu-file.c:562
> #8 0x00000000007a7a22 in qemu_get_byte (f=0x3d54000) at migration/qemu-file.c:575
> #9 0x00000000007a7c46 in qemu_get_be16 (f=0x3d54000) at migration/qemu-file.c:647
> #10 0x0000000000796db7 in source_return_path_thread (opaque=0x2242280) at migration/migration.c:1794
> #11 0x00000000009428fa in qemu_thread_start (args=0x3e58420) at util/qemu-thread-posix.c:504
> #12 0x00007fb20af3ddc5 in start_thread () from /lib64/libpthread.so.0
> #13 0x00007fb20ac6b74d in clone () from /lib64/libc.so.6
>
> This patch fixed by invoke qio_channel_yield only when qemu_in_coroutine().
>
> Signed-off-by: Lidong Chen <lidongchen@tencent.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
queued
> - qio_channel_wait(ioc, G_IO_OUT);
> + if (qemu_in_coroutine()) {
> + qio_channel_yield(ioc, G_IO_OUT);
> + } else {
> + qio_channel_wait(ioc, G_IO_OUT);
> + }
Dan, once that I am here, shouldn't this code be inside
qio_channel_wait()? Or have a function that does it?
qio_channel_readv_all_eof() and qio_channel_writev_all() already have to use it.
Just wondering.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] migration: implement io_set_aio_fd_handler function for RDMA QIOChannel
2018-05-07 13:52 [Qemu-devel] [PATCH 1/2] migration: implement io_set_aio_fd_handler function for RDMA QIOChannel Lidong Chen
2018-05-07 13:52 ` [Qemu-devel] [PATCH 2/2] migration: invoke qio_channel_yield only when qemu_in_coroutine() Lidong Chen
2018-05-08 12:34 ` [Qemu-devel] [PATCH 1/2] migration: implement io_set_aio_fd_handler function for RDMA QIOChannel Juan Quintela
@ 2018-05-08 17:09 ` Juan Quintela
2018-05-08 17:10 ` Dr. David Alan Gilbert
2 siblings, 1 reply; 7+ messages in thread
From: Juan Quintela @ 2018-05-08 17:09 UTC (permalink / raw)
To: Lidong Chen
Cc: dgilbert, berrange, qemu-devel, galsha, aviadye, adido, Lidong Chen
Lidong Chen <jemmy858585@gmail.com> wrote:
> if qio_channel_rdma_readv return QIO_CHANNEL_ERR_BLOCK, the destination qemu
> crash.
>
> The backtrace is:
> (gdb) bt
> #0 0x0000000000000000 in ?? ()
> #1 0x00000000008db50e in qio_channel_set_aio_fd_handler (ioc=0x38111e0, ctx=0x3726080,
> io_read=0x8db841 <qio_channel_restart_read>, io_write=0x0, opaque=0x38111e0) at io/channel.c:
> #2 0x00000000008db952 in qio_channel_set_aio_fd_handlers (ioc=0x38111e0) at io/channel.c:438
> #3 0x00000000008dbab4 in qio_channel_yield (ioc=0x38111e0, condition=G_IO_IN) at io/channel.c:47
> #4 0x00000000007a870b in channel_get_buffer (opaque=0x38111e0, buf=0x440c038 "", pos=0, size=327
> at migration/qemu-file-channel.c:83
> #5 0x00000000007a70f6 in qemu_fill_buffer (f=0x440c000) at migration/qemu-file.c:299
> #6 0x00000000007a79d0 in qemu_peek_byte (f=0x440c000, offset=0) at migration/qemu-file.c:562
> #7 0x00000000007a7a22 in qemu_get_byte (f=0x440c000) at migration/qemu-file.c:575
> #8 0x00000000007a7c78 in qemu_get_be32 (f=0x440c000) at migration/qemu-file.c:655
> #9 0x00000000007a0508 in qemu_loadvm_state (f=0x440c000) at migration/savevm.c:2126
> #10 0x0000000000794141 in process_incoming_migration_co (opaque=0x0) at migration/migration.c:366
> #11 0x000000000095c598 in coroutine_trampoline (i0=84033984, i1=0) at util/coroutine-ucontext.c:1
> #12 0x00007f9c0db56d40 in ?? () from /lib64/libc.so.6
> #13 0x00007f96fe858760 in ?? ()
> #14 0x0000000000000000 in ?? ()
>
> RDMA QIOChannel not implement io_set_aio_fd_handler. so
> qio_channel_set_aio_fd_handler will access NULL pointer.
>
> Signed-off-by: Lidong Chen <lidongchen@tencent.com>
> ---
Hi
could you resend, it don't compile for me :-(
/mnt/kvm/qemu/cleanup/migration/rdma.c: In function ‘qio_channel_rdma_set_aio_fd_handler’:
/mnt/kvm/qemu/cleanup/migration/rdma.c:2877:39: error: ‘QIOChannelRDMA’ {aka ‘struct QIOChannelRDMA’} has no member named ‘rdmain’; did you mean ‘rdma’?
aio_set_fd_handler(ctx, rioc->rdmain->comp_channel->fd,
^~~~~~
rdma
/mnt/kvm/qemu/cleanup/migration/rdma.c:2880:39: error: ‘QIOChannelRDMA’ {aka ‘struct QIOChannelRDMA’} has no member named ‘rdmaout’; did you mean ‘rdma’?
aio_set_fd_handler(ctx, rioc->rdmaout->comp_channel->fd,
^~~~~~~
rdma
make: *** [/mnt/kvm/qemu/cleanup/rules.mak:66: migration/rdma.o] Error 1
CC migration/block.o
CC ui/vnc.o
It seems like
> diff --git a/migration/rdma.c b/migration/rdma.c
> index 92e4d30..dfa4f77 100644
> --- a/migration/rdma.c
> +++ b/migration/rdma.c
> @@ -2963,6 +2963,21 @@ static GSource *qio_channel_rdma_create_watch(QIOChannel *ioc,
> return source;
> }
>
> +static void qio_channel_rdma_set_aio_fd_handler(QIOChannel *ioc,
> + AioContext *ctx,
> + IOHandler *io_read,
> + IOHandler *io_write,
> + void *opaque)
> +{
> + QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(ioc);
> + if (io_read) {
> + aio_set_fd_handler(ctx, rioc->rdmain->comp_channel->fd,
this should be rioc->rdam->comp_channel
> + false, io_read, io_write, NULL, opaque);
> + } else {
> + aio_set_fd_handler(ctx, rioc->rdmaout->comp_channel->fd,
and this rioc-rdma->comp_channel
But will preffer if you confirm.
Thanks.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] migration: implement io_set_aio_fd_handler function for RDMA QIOChannel
2018-05-08 17:09 ` Juan Quintela
@ 2018-05-08 17:10 ` Dr. David Alan Gilbert
2018-05-09 4:11 ` 858585 jemmy
0 siblings, 1 reply; 7+ messages in thread
From: Dr. David Alan Gilbert @ 2018-05-08 17:10 UTC (permalink / raw)
To: Juan Quintela
Cc: Lidong Chen, berrange, qemu-devel, galsha, aviadye, adido, Lidong Chen
* Juan Quintela (quintela@redhat.com) wrote:
> Lidong Chen <jemmy858585@gmail.com> wrote:
> > if qio_channel_rdma_readv return QIO_CHANNEL_ERR_BLOCK, the destination qemu
> > crash.
> >
> > The backtrace is:
> > (gdb) bt
> > #0 0x0000000000000000 in ?? ()
> > #1 0x00000000008db50e in qio_channel_set_aio_fd_handler (ioc=0x38111e0, ctx=0x3726080,
> > io_read=0x8db841 <qio_channel_restart_read>, io_write=0x0, opaque=0x38111e0) at io/channel.c:
> > #2 0x00000000008db952 in qio_channel_set_aio_fd_handlers (ioc=0x38111e0) at io/channel.c:438
> > #3 0x00000000008dbab4 in qio_channel_yield (ioc=0x38111e0, condition=G_IO_IN) at io/channel.c:47
> > #4 0x00000000007a870b in channel_get_buffer (opaque=0x38111e0, buf=0x440c038 "", pos=0, size=327
> > at migration/qemu-file-channel.c:83
> > #5 0x00000000007a70f6 in qemu_fill_buffer (f=0x440c000) at migration/qemu-file.c:299
> > #6 0x00000000007a79d0 in qemu_peek_byte (f=0x440c000, offset=0) at migration/qemu-file.c:562
> > #7 0x00000000007a7a22 in qemu_get_byte (f=0x440c000) at migration/qemu-file.c:575
> > #8 0x00000000007a7c78 in qemu_get_be32 (f=0x440c000) at migration/qemu-file.c:655
> > #9 0x00000000007a0508 in qemu_loadvm_state (f=0x440c000) at migration/savevm.c:2126
> > #10 0x0000000000794141 in process_incoming_migration_co (opaque=0x0) at migration/migration.c:366
> > #11 0x000000000095c598 in coroutine_trampoline (i0=84033984, i1=0) at util/coroutine-ucontext.c:1
> > #12 0x00007f9c0db56d40 in ?? () from /lib64/libc.so.6
> > #13 0x00007f96fe858760 in ?? ()
> > #14 0x0000000000000000 in ?? ()
> >
> > RDMA QIOChannel not implement io_set_aio_fd_handler. so
> > qio_channel_set_aio_fd_handler will access NULL pointer.
> >
> > Signed-off-by: Lidong Chen <lidongchen@tencent.com>
> > ---
>
>
> Hi
>
> could you resend, it don't compile for me :-(
This really sits after the other set of rdma changes.
I doubt this path is reachable without the previous set.
Dave
>
> /mnt/kvm/qemu/cleanup/migration/rdma.c: In function ‘qio_channel_rdma_set_aio_fd_handler’:
> /mnt/kvm/qemu/cleanup/migration/rdma.c:2877:39: error: ‘QIOChannelRDMA’ {aka ‘struct QIOChannelRDMA’} has no member named ‘rdmain’; did you mean ‘rdma’?
> aio_set_fd_handler(ctx, rioc->rdmain->comp_channel->fd,
> ^~~~~~
> rdma
> /mnt/kvm/qemu/cleanup/migration/rdma.c:2880:39: error: ‘QIOChannelRDMA’ {aka ‘struct QIOChannelRDMA’} has no member named ‘rdmaout’; did you mean ‘rdma’?
> aio_set_fd_handler(ctx, rioc->rdmaout->comp_channel->fd,
> ^~~~~~~
> rdma
> make: *** [/mnt/kvm/qemu/cleanup/rules.mak:66: migration/rdma.o] Error 1
> CC migration/block.o
> CC ui/vnc.o
>
> It seems like
>
> > diff --git a/migration/rdma.c b/migration/rdma.c
> > index 92e4d30..dfa4f77 100644
> > --- a/migration/rdma.c
> > +++ b/migration/rdma.c
> > @@ -2963,6 +2963,21 @@ static GSource *qio_channel_rdma_create_watch(QIOChannel *ioc,
> > return source;
> > }
> >
> > +static void qio_channel_rdma_set_aio_fd_handler(QIOChannel *ioc,
> > + AioContext *ctx,
> > + IOHandler *io_read,
> > + IOHandler *io_write,
> > + void *opaque)
> > +{
> > + QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(ioc);
> > + if (io_read) {
> > + aio_set_fd_handler(ctx, rioc->rdmain->comp_channel->fd,
>
> this should be rioc->rdam->comp_channel
>
> > + false, io_read, io_write, NULL, opaque);
> > + } else {
> > + aio_set_fd_handler(ctx, rioc->rdmaout->comp_channel->fd,
>
> and this rioc-rdma->comp_channel
>
> But will preffer if you confirm.
>
> Thanks.
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] migration: implement io_set_aio_fd_handler function for RDMA QIOChannel
2018-05-08 17:10 ` Dr. David Alan Gilbert
@ 2018-05-09 4:11 ` 858585 jemmy
0 siblings, 0 replies; 7+ messages in thread
From: 858585 jemmy @ 2018-05-09 4:11 UTC (permalink / raw)
To: Dr. David Alan Gilbert, Juan Quintela
Cc: Daniel P. Berrange, qemu-devel, Gal Shachaf, Aviad Yehezkel,
adido, Lidong Chen
On Wed, May 9, 2018 at 1:10 AM, Dr. David Alan Gilbert
<dgilbert@redhat.com> wrote:
> * Juan Quintela (quintela@redhat.com) wrote:
>> Lidong Chen <jemmy858585@gmail.com> wrote:
>> > if qio_channel_rdma_readv return QIO_CHANNEL_ERR_BLOCK, the destination qemu
>> > crash.
>> >
>> > The backtrace is:
>> > (gdb) bt
>> > #0 0x0000000000000000 in ?? ()
>> > #1 0x00000000008db50e in qio_channel_set_aio_fd_handler (ioc=0x38111e0, ctx=0x3726080,
>> > io_read=0x8db841 <qio_channel_restart_read>, io_write=0x0, opaque=0x38111e0) at io/channel.c:
>> > #2 0x00000000008db952 in qio_channel_set_aio_fd_handlers (ioc=0x38111e0) at io/channel.c:438
>> > #3 0x00000000008dbab4 in qio_channel_yield (ioc=0x38111e0, condition=G_IO_IN) at io/channel.c:47
>> > #4 0x00000000007a870b in channel_get_buffer (opaque=0x38111e0, buf=0x440c038 "", pos=0, size=327
>> > at migration/qemu-file-channel.c:83
>> > #5 0x00000000007a70f6 in qemu_fill_buffer (f=0x440c000) at migration/qemu-file.c:299
>> > #6 0x00000000007a79d0 in qemu_peek_byte (f=0x440c000, offset=0) at migration/qemu-file.c:562
>> > #7 0x00000000007a7a22 in qemu_get_byte (f=0x440c000) at migration/qemu-file.c:575
>> > #8 0x00000000007a7c78 in qemu_get_be32 (f=0x440c000) at migration/qemu-file.c:655
>> > #9 0x00000000007a0508 in qemu_loadvm_state (f=0x440c000) at migration/savevm.c:2126
>> > #10 0x0000000000794141 in process_incoming_migration_co (opaque=0x0) at migration/migration.c:366
>> > #11 0x000000000095c598 in coroutine_trampoline (i0=84033984, i1=0) at util/coroutine-ucontext.c:1
>> > #12 0x00007f9c0db56d40 in ?? () from /lib64/libc.so.6
>> > #13 0x00007f96fe858760 in ?? ()
>> > #14 0x0000000000000000 in ?? ()
>> >
>> > RDMA QIOChannel not implement io_set_aio_fd_handler. so
>> > qio_channel_set_aio_fd_handler will access NULL pointer.
>> >
>> > Signed-off-by: Lidong Chen <lidongchen@tencent.com>
>> > ---
>>
>>
>> Hi
>>
>> could you resend, it don't compile for me :-(
>
> This really sits after the other set of rdma changes.
> I doubt this path is reachable without the previous set.
>
> Dave
Hi Juan:
I should not separate the patchset. Sorry for this mistake. This
patch is base on another patch.
http://patchwork.ozlabs.org/patch/909156/
After Daniel have reviewed this patch, I will send the v4 version
which will include all patch for RDMA live migration.
Thanks.
>>
>> /mnt/kvm/qemu/cleanup/migration/rdma.c: In function ‘qio_channel_rdma_set_aio_fd_handler’:
>> /mnt/kvm/qemu/cleanup/migration/rdma.c:2877:39: error: ‘QIOChannelRDMA’ {aka ‘struct QIOChannelRDMA’} has no member named ‘rdmain’; did you mean ‘rdma’?
>> aio_set_fd_handler(ctx, rioc->rdmain->comp_channel->fd,
>> ^~~~~~
>> rdma
>> /mnt/kvm/qemu/cleanup/migration/rdma.c:2880:39: error: ‘QIOChannelRDMA’ {aka ‘struct QIOChannelRDMA’} has no member named ‘rdmaout’; did you mean ‘rdma’?
>> aio_set_fd_handler(ctx, rioc->rdmaout->comp_channel->fd,
>> ^~~~~~~
>> rdma
>> make: *** [/mnt/kvm/qemu/cleanup/rules.mak:66: migration/rdma.o] Error 1
>> CC migration/block.o
>> CC ui/vnc.o
>>
>> It seems like
>>
>> > diff --git a/migration/rdma.c b/migration/rdma.c
>> > index 92e4d30..dfa4f77 100644
>> > --- a/migration/rdma.c
>> > +++ b/migration/rdma.c
>> > @@ -2963,6 +2963,21 @@ static GSource *qio_channel_rdma_create_watch(QIOChannel *ioc,
>> > return source;
>> > }
>> >
>> > +static void qio_channel_rdma_set_aio_fd_handler(QIOChannel *ioc,
>> > + AioContext *ctx,
>> > + IOHandler *io_read,
>> > + IOHandler *io_write,
>> > + void *opaque)
>> > +{
>> > + QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(ioc);
>> > + if (io_read) {
>> > + aio_set_fd_handler(ctx, rioc->rdmain->comp_channel->fd,
>>
>> this should be rioc->rdam->comp_channel
>>
>> > + false, io_read, io_write, NULL, opaque);
>> > + } else {
>> > + aio_set_fd_handler(ctx, rioc->rdmaout->comp_channel->fd,
>>
>> and this rioc-rdma->comp_channel
>>
>> But will preffer if you confirm.
>>
>> Thanks.
> --
> Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2018-05-09 4:11 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-07 13:52 [Qemu-devel] [PATCH 1/2] migration: implement io_set_aio_fd_handler function for RDMA QIOChannel Lidong Chen
2018-05-07 13:52 ` [Qemu-devel] [PATCH 2/2] migration: invoke qio_channel_yield only when qemu_in_coroutine() Lidong Chen
2018-05-08 12:36 ` Juan Quintela
2018-05-08 12:34 ` [Qemu-devel] [PATCH 1/2] migration: implement io_set_aio_fd_handler function for RDMA QIOChannel Juan Quintela
2018-05-08 17:09 ` Juan Quintela
2018-05-08 17:10 ` Dr. David Alan Gilbert
2018-05-09 4:11 ` 858585 jemmy
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.