[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v9 04/12] migration: Start of multiple fd work
From: |
Juan Quintela |
Subject: |
Re: [Qemu-devel] [PATCH v9 04/12] migration: Start of multiple fd work |
Date: |
Mon, 09 Oct 2017 14:32:05 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) |
"Daniel P. Berrange" <address@hidden> wrote:
> On Wed, Oct 04, 2017 at 12:46:28PM +0200, Juan Quintela wrote:
>> We create new channels for each new thread created. We send through
>> them a string containing <uuid> multifd <channel number> so we are
>> sure that we connect the right channels in both sides.
>
> This message needs updating now that we send a struct.
>
>
>> diff --git a/migration/ram.c b/migration/ram.c
>> index b83f8977c5..b57006594b 100644
>> --- a/migration/ram.c
>> +++ b/migration/ram.c
>> @@ -414,9 +425,27 @@ int multifd_save_cleanup(Error **errp)
>> return ret;
>> }
>>
>> +typedef struct {
>> + uint32_t version;
>> + uint8_t id;
>> + char uuid[UUID_FMT_LEN];
>> +} MigrateMultiFDInit_t;
>
> We add an __attribute__((packed)) here since we send it directly
> on the wire. Perhaps put 'uuid' field before 'id' when doing that
> so 'uuid' gets a more natural alignment.
ok.
> If we use 'unsigned char uuid[16]' then you don't need to convert
> from string format either...
I was looking at the "exported" commands in uuid.h, but I can use the
memcopy without problem. Just feel like using a "detail" of the
implementation.
>
>> static void *multifd_send_thread(void *opaque)
>> {
>> MultiFDSendParams *p = opaque;
>> + MigrateMultiFDInit_t msg;
>> + Error *local_err = NULL;
>> + size_t ret;
>> +
>> + msg.version = 1;
>> + msg.id = p->id;
>> + qemu_uuid_unparse(&qemu_uuid, (char *)&msg.uuid);
>
> eg this could be memcpy(msg.uuid, qemu_uuid.data, sizeof(msg.uuid))
>
>> + ret = qio_channel_write_all(p->c, (char *)&msg, sizeof(msg),
>> &local_err);
>> + if (ret != 0) {
>> + terminate_multifd_send_threads(local_err);
>> + return NULL;
>> + }
>>
>> while (true) {
>> qemu_mutex_lock(&p->mutex);
>> @@ -431,6 +460,27 @@ static void *multifd_send_thread(void *opaque)
>> return NULL;
>> }
>
>> +void multifd_new_channel(QIOChannel *ioc)
>> +{
>> + MultiFDRecvParams *p;
>> + MigrateMultiFDInit_t msg;
>> + Error *local_err = NULL;
>> + char *uuid;
>> + size_t ret;
>> +
>> + ret = qio_channel_read_all(ioc, (char *)&msg, sizeof(msg), &local_err);
>> + if (ret != 0) {
>> + terminate_multifd_recv_threads(local_err);
>> + return;
>> + }
>> +
>> + uuid = qemu_uuid_unparse_strdup(&qemu_uuid);
>
> ...and here we would avoid need to unparse, instead..
>
>> +
>> + if (strcmp(msg.uuid, uuid)) {
>
> memcmp(msg.uuid, qemu_uuid.data, sizeof(msg.uuid) != 0
>
>> + g_free(uuid);
>> + error_setg(&local_err, "multifd: received uuid '%s' and expected "
>> + "uuid '%s' for channel %hhd", msg.uuid, uuid, msg.id);
>> + terminate_multifd_recv_threads(local_err);
>> + return;
>> + }
>> + g_free(uuid);
Thanks, Juan.
- Re: [Qemu-devel] [PATCH v9 01/12] qapi: Fix grammar in x-multifd-page-count descriptions, (continued)
- [Qemu-devel] [PATCH v9 02/12] migration: Improve migration thread error handling, Juan Quintela, 2017/10/04
- [Qemu-devel] [PATCH v9 03/12] migration: Make migrate_fd_error() the owner of the Error, Juan Quintela, 2017/10/04
- [Qemu-devel] [PATCH v9 04/12] migration: Start of multiple fd work, Juan Quintela, 2017/10/04
- [Qemu-devel] [PATCH v9 06/12] migration: Send the fd number which we are going to use for this page, Juan Quintela, 2017/10/04
- [Qemu-devel] [PATCH v9 07/12] migration: Create thread infrastructure for multifd recv side, Juan Quintela, 2017/10/04
- [Qemu-devel] [PATCH v9 08/12] migration: Test new fd infrastructure, Juan Quintela, 2017/10/04
- [Qemu-devel] [PATCH v9 05/12] migration: Create ram_multifd_page, Juan Quintela, 2017/10/04