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