xref: /qemu/migration/dirtyrate.c (revision 7df3aa30838c010ce9b2f587afdcd6609386f630)
14240dceeSChuan Zheng /*
24240dceeSChuan Zheng  * Dirtyrate implement code
34240dceeSChuan Zheng  *
44240dceeSChuan Zheng  * Copyright (c) 2020 HUAWEI TECHNOLOGIES CO.,LTD.
54240dceeSChuan Zheng  *
64240dceeSChuan Zheng  * Authors:
74240dceeSChuan Zheng  *  Chuan Zheng <zhengchuan@huawei.com>
84240dceeSChuan Zheng  *
94240dceeSChuan Zheng  * This work is licensed under the terms of the GNU GPL, version 2 or later.
104240dceeSChuan Zheng  * See the COPYING file in the top-level directory.
114240dceeSChuan Zheng  */
124240dceeSChuan Zheng 
134240dceeSChuan Zheng #include "qemu/osdep.h"
144240dceeSChuan Zheng #include "qapi/error.h"
154240dceeSChuan Zheng #include "cpu.h"
164240dceeSChuan Zheng #include "qemu/config-file.h"
174240dceeSChuan Zheng #include "exec/memory.h"
184240dceeSChuan Zheng #include "exec/ramblock.h"
194240dceeSChuan Zheng #include "exec/target_page.h"
204240dceeSChuan Zheng #include "qemu/rcu_queue.h"
214240dceeSChuan Zheng #include "qapi/qapi-commands-migration.h"
224240dceeSChuan Zheng #include "migration.h"
234240dceeSChuan Zheng #include "dirtyrate.h"
244240dceeSChuan Zheng 
25*7df3aa30SChuan Zheng static int CalculatingState = DIRTY_RATE_STATUS_UNSTARTED;
26*7df3aa30SChuan Zheng 
27*7df3aa30SChuan Zheng static int dirtyrate_set_state(int *state, int old_state, int new_state)
28*7df3aa30SChuan Zheng {
29*7df3aa30SChuan Zheng     assert(new_state < DIRTY_RATE_STATUS__MAX);
30*7df3aa30SChuan Zheng     if (qatomic_cmpxchg(state, old_state, new_state) == old_state) {
31*7df3aa30SChuan Zheng         return 0;
32*7df3aa30SChuan Zheng     } else {
33*7df3aa30SChuan Zheng         return -1;
34*7df3aa30SChuan Zheng     }
35*7df3aa30SChuan Zheng }
36*7df3aa30SChuan Zheng 
37*7df3aa30SChuan Zheng 
384240dceeSChuan Zheng static void calculate_dirtyrate(struct DirtyRateConfig config)
394240dceeSChuan Zheng {
404240dceeSChuan Zheng     /* todo */
414240dceeSChuan Zheng     return;
424240dceeSChuan Zheng }
434240dceeSChuan Zheng 
444240dceeSChuan Zheng void *get_dirtyrate_thread(void *arg)
454240dceeSChuan Zheng {
464240dceeSChuan Zheng     struct DirtyRateConfig config = *(struct DirtyRateConfig *)arg;
47*7df3aa30SChuan Zheng     int ret;
48*7df3aa30SChuan Zheng 
49*7df3aa30SChuan Zheng     ret = dirtyrate_set_state(&CalculatingState, DIRTY_RATE_STATUS_UNSTARTED,
50*7df3aa30SChuan Zheng                               DIRTY_RATE_STATUS_MEASURING);
51*7df3aa30SChuan Zheng     if (ret == -1) {
52*7df3aa30SChuan Zheng         error_report("change dirtyrate state failed.");
53*7df3aa30SChuan Zheng         return NULL;
54*7df3aa30SChuan Zheng     }
554240dceeSChuan Zheng 
564240dceeSChuan Zheng     calculate_dirtyrate(config);
574240dceeSChuan Zheng 
58*7df3aa30SChuan Zheng     ret = dirtyrate_set_state(&CalculatingState, DIRTY_RATE_STATUS_MEASURING,
59*7df3aa30SChuan Zheng                               DIRTY_RATE_STATUS_MEASURED);
60*7df3aa30SChuan Zheng     if (ret == -1) {
61*7df3aa30SChuan Zheng         error_report("change dirtyrate state failed.");
62*7df3aa30SChuan Zheng     }
634240dceeSChuan Zheng     return NULL;
644240dceeSChuan Zheng }
65