[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v7 01/13] multifd: Document the locking of MultiFD{Send/Recv}Para
From: |
Juan Quintela |
Subject: |
[PATCH v7 01/13] multifd: Document the locking of MultiFD{Send/Recv}Params |
Date: |
Tue, 31 May 2022 12:43:06 +0200 |
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 | 90 ++++++++++++++++++++++++++-------------------
1 file changed, 53 insertions(+), 37 deletions(-)
diff --git a/migration/multifd.h b/migration/multifd.h
index 4d8d89e5e5..345cfdb50c 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,39 +76,47 @@ 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;
+ /* multifd flags for sending ram */
+ int write_flags;
+
+ /* 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;
/* 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 sending ram */
- int write_flags;
- /* 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 */
@@ -120,7 +130,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 */
@@ -129,31 +141,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.3
- [PATCH v7 00/13] Migration: Transmit and detect zero pages in the multifd threads, Juan Quintela, 2022/05/31
- [PATCH v7 02/13] multifd: Create page_size fields into both MultiFD{Recv, Send}Params, Juan Quintela, 2022/05/31
- [PATCH v7 01/13] multifd: Document the locking of MultiFD{Send/Recv}Params,
Juan Quintela <=
- [PATCH v7 03/13] multifd: Create page_count fields into both MultiFD{Recv, Send}Params, Juan Quintela, 2022/05/31
- [PATCH v7 04/13] migration: Export ram_transferred_ram(), Juan Quintela, 2022/05/31
- [PATCH v7 05/13] multifd: Count the number of bytes sent correctly, Juan Quintela, 2022/05/31
- [PATCH v7 06/13] migration: Make ram_save_target_page() a pointer, Juan Quintela, 2022/05/31
- [PATCH v7 07/13] multifd: Make flags field thread local, Juan Quintela, 2022/05/31
- [PATCH v7 08/13] multifd: Prepare to send a packet without the mutex held, Juan Quintela, 2022/05/31
- [PATCH v7 09/13] multifd: Add property to enable/disable zero_page, Juan Quintela, 2022/05/31
- [PATCH v7 10/13] migration: Export ram_release_page(), Juan Quintela, 2022/05/31
- [PATCH v7 12/13] multifd: Zero pages transmission, Juan Quintela, 2022/05/31
- [PATCH v7 11/13] multifd: Support for zero pages transmission, Juan Quintela, 2022/05/31