From: Juan Quintela <quintela@redhat.com>
To: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
Cc: qemu-devel@nongnu.org, "Eduardo Habkost" <eduardo@habkost.net>,
"Peter Xu" <peterx@redhat.com>,
"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
"Yanan Wang" <wangyanan55@huawei.com>,
"Leonardo Bras" <leobras@redhat.com>,
"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>
Subject: Re: [PATCH v6 01/13] multifd: Document the locking of MultiFD{Send/Recv}Params
Date: Wed, 18 May 2022 10:40:34 +0200 [thread overview]
Message-ID: <878rqzgrnh.fsf@secure.mitica> (raw)
In-Reply-To: <YoJOPlRGJFIDcWoN@work-vm> (David Alan Gilbert's message of "Mon, 16 May 2022 14:14:38 +0100")
"Dr. David Alan Gilbert" <dgilbert@redhat.com> wrote:
> * Juan Quintela (quintela@redhat.com) wrote:
>> Reorder the structures so we can know if the fields are:
>> - Read only
>> - Their own locking (i.e. sems)
>> - Protected by 'mutex'
>> - Only for the multifd channel
>>
>> Signed-off-by: Juan Quintela <quintela@redhat.com>
>> ---
>> migration/multifd.h | 86 +++++++++++++++++++++++++++------------------
>> 1 file changed, 51 insertions(+), 35 deletions(-)
>>
>> diff --git a/migration/multifd.h b/migration/multifd.h
>> index 7d0effcb03..f1f88c6737 100644
>> --- a/migration/multifd.h
>> +++ b/migration/multifd.h
>> @@ -65,7 +65,9 @@ typedef struct {
>> } MultiFDPages_t;
>>
>> typedef struct {
>> - /* this fields are not changed once the thread is created */
>> + /* Fiields are only written at creating/deletion time */
>> + /* No lock required for them, they are read only */
>> +
>> /* channel number */
>> uint8_t id;
>> /* channel thread name */
>> @@ -74,37 +76,45 @@ typedef struct {
>> QemuThread thread;
>> /* communication channel */
>> QIOChannel *c;
>> - /* sem where to wait for more work */
>> - QemuSemaphore sem;
>> - /* this mutex protects the following parameters */
>> - QemuMutex mutex;
>> - /* is this channel thread running */
>> - bool running;
>> - /* should this thread finish */
>> - bool quit;
>> /* is the yank function registered */
>> bool registered_yank;
>> + /* packet allocated len */
>> + uint32_t packet_len;
>> +
>> + /* sem where to wait for more work */
>> + QemuSemaphore sem;
>> + /* syncs main thread and channels */
>> + QemuSemaphore sem_sync;
>> +
>> + /* this mutex protects the following parameters */
>> + QemuMutex mutex;
>> + /* is this channel thread running */
>> + bool running;
>> + /* should this thread finish */
>> + bool quit;
>> + /* multifd flags for each packet */
>> + uint32_t flags;
>> + /* global number of generated multifd packets */
>> + uint64_t packet_num;
>
> Is there a way to explain why packet_num, being global, is inside
> SendParams? I understand why num_packets is - because
> that's per channel; so why is a global isnide the params
> (and having two things with almost the same name is very confusing!)
Ok, I will try to improve the documentation (it was already there).
Each packet that we sent (independently of what channel we sent it
through) has a packet number, that is unique for all channels (i.e. not
only for a single channel). The number is assigned in
multifd_send_pages(), and the "global" value is stored in
multifd_send_state.
This field is _where_ we "transport" it to the real packet.
We have that field in:
- multifd_send_state, where we copy the current value to
- Multifd_send_params, where we copy that value to
- Multifd_packet.
Notice that the only place where we change the value is
multifd_send_state, once that we put a value on the multifd_send_params,
it is a constant until the next packet.
So how about:
/* assigned global packet number for this packet */
??
I am open to better names.
Later, Juan.
> Dave
>
>> /* thread has work to do */
>> int pending_job;
>> - /* array of pages to sent */
>> + /* array of pages to sent.
>> + * The owner of 'pages' depends of 'pending_job' value:
>> + * pending_job == 0 -> migration_thread can use it.
>> + * pending_job != 0 -> multifd_channel can use it.
>> + */
>> MultiFDPages_t *pages;
>> - /* packet allocated len */
>> - uint32_t packet_len;
>> +
>> + /* thread local variables. No locking required */
>> +
>> /* pointer to the packet */
>> MultiFDPacket_t *packet;
>> - /* multifd flags for each packet */
>> - uint32_t flags;
>> /* size of the next packet that contains pages */
>> uint32_t next_packet_size;
>> - /* global number of generated multifd packets */
>> - uint64_t packet_num;
>> - /* thread local variables */
>> /* packets sent through this channel */
>> uint64_t num_packets;
>> /* non zero pages sent through this channel */
>> uint64_t total_normal_pages;
>> - /* syncs main thread and channels */
>> - QemuSemaphore sem_sync;
>> /* buffers to send */
>> struct iovec *iov;
>> /* number of iovs used */
>> @@ -118,7 +128,9 @@ typedef struct {
>> } MultiFDSendParams;
>>
>> typedef struct {
>> - /* this fields are not changed once the thread is created */
>> + /* Fiields are only written at creating/deletion time */
>> + /* No lock required for them, they are read only */
>> +
>> /* channel number */
>> uint8_t id;
>> /* channel thread name */
>> @@ -127,31 +139,35 @@ typedef struct {
>> QemuThread thread;
>> /* communication channel */
>> QIOChannel *c;
>> + /* packet allocated len */
>> + uint32_t packet_len;
>> +
>> + /* syncs main thread and channels */
>> + QemuSemaphore sem_sync;
>> +
>> /* this mutex protects the following parameters */
>> QemuMutex mutex;
>> /* is this channel thread running */
>> bool running;
>> /* should this thread finish */
>> bool quit;
>> + /* multifd flags for each packet */
>> + uint32_t flags;
>> + /* global number of generated multifd packets */
>> + uint64_t packet_num;
>> +
>> + /* thread local variables. No locking required */
>> +
>> + /* pointer to the packet */
>> + MultiFDPacket_t *packet;
>> + /* size of the next packet that contains pages */
>> + uint32_t next_packet_size;
>> + /* packets sent through this channel */
>> + uint64_t num_packets;
>> /* ramblock host address */
>> uint8_t *host;
>> - /* packet allocated len */
>> - uint32_t packet_len;
>> - /* pointer to the packet */
>> - MultiFDPacket_t *packet;
>> - /* multifd flags for each packet */
>> - uint32_t flags;
>> - /* global number of generated multifd packets */
>> - uint64_t packet_num;
>> - /* thread local variables */
>> - /* size of the next packet that contains pages */
>> - uint32_t next_packet_size;
>> - /* packets sent through this channel */
>> - uint64_t num_packets;
>> /* non zero pages recv through this channel */
>> uint64_t total_normal_pages;
>> - /* syncs main thread and channels */
>> - QemuSemaphore sem_sync;
>> /* buffers to recv */
>> struct iovec *iov;
>> /* Pages that are not zero */
>> --
>> 2.35.1
>>
next prev parent reply other threads:[~2022-05-18 8:45 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-10 22:42 [PATCH v6 00/13] Migration: Transmit and detect zero pages in the multifd threads Juan Quintela
2022-05-10 22:42 ` [PATCH v6 01/13] multifd: Document the locking of MultiFD{Send/Recv}Params Juan Quintela
2022-05-16 13:14 ` Dr. David Alan Gilbert
2022-05-18 8:40 ` Juan Quintela [this message]
2022-05-10 22:42 ` [PATCH v6 02/13] multifd: Create page_size fields into both MultiFD{Recv, Send}Params Juan Quintela
2022-05-17 8:44 ` [PATCH v6 02/13] multifd: Create page_size fields into both MultiFD{Recv,Send}Params Dr. David Alan Gilbert
2022-05-18 8:48 ` Juan Quintela
2022-05-10 22:42 ` [PATCH v6 03/13] multifd: Create page_count fields into both MultiFD{Recv, Send}Params Juan Quintela
2022-05-10 22:42 ` [PATCH v6 04/13] migration: Export ram_transferred_ram() Juan Quintela
2022-05-10 22:42 ` [PATCH v6 05/13] multifd: Count the number of bytes sent correctly Juan Quintela
2022-05-10 22:42 ` [PATCH v6 06/13] migration: Make ram_save_target_page() a pointer Juan Quintela
2022-05-10 22:42 ` [PATCH v6 07/13] multifd: Make flags field thread local Juan Quintela
2022-05-10 22:42 ` [PATCH v6 08/13] multifd: Prepare to send a packet without the mutex held Juan Quintela
2022-05-10 22:42 ` [PATCH v6 09/13] multifd: Add property to enable/disable zero_page Juan Quintela
2022-05-10 22:42 ` [PATCH v6 10/13] migration: Export ram_release_page() Juan Quintela
2022-05-10 22:42 ` [PATCH v6 11/13] multifd: Support for zero pages transmission Juan Quintela
2022-05-10 22:42 ` [PATCH v6 12/13] multifd: Zero " Juan Quintela
2022-05-10 22:42 ` [PATCH v6 13/13] migration: Use multifd before we check for the zero page Juan Quintela
2022-05-12 13:40 ` [PATCH v6 00/13] Migration: Transmit and detect zero pages in the multifd threads Dr. David Alan Gilbert
2022-05-16 10:45 ` Juan Quintela
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=878rqzgrnh.fsf@secure.mitica \
--to=quintela@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eduardo@habkost.net \
--cc=f4bug@amsat.org \
--cc=leobras@redhat.com \
--cc=marcel.apfelbaum@gmail.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=wangyanan55@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is 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.