From f078f20388cb90fdea3531ec37805c4fe901b83f Mon Sep 17 00:00:00 2001 From: panhengchang Date: Tue, 25 Nov 2025 09:46:06 +0800 Subject: [PATCH] add migration src memory check --- tmm_driver/src/tmm_driver.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tmm_driver/src/tmm_driver.c b/tmm_driver/src/tmm_driver.c index 1fbb1b8..5503448 100644 --- a/tmm_driver/src/tmm_driver.c +++ b/tmm_driver/src/tmm_driver.c @@ -452,6 +452,35 @@ static ssize_t buddy_info_show(struct kobject *kobj, return buddy_info_size; } +static int mig_src_mem_check(uint64_t *mig_mem) +{ + unsigned long dirty_bytes; + unsigned long dirty_bitmap_size; + int first_node = -1; + uint64_t total_memory = 0; + uint64_t page_num; + uint64_t *bitmap = NULL; + for (int numa_index = 0; numa_index < TMM_MAX_NODE_NUM; numa_index++) { + if (first_node == -1 && mig_mem[numa_index] != 0) + first_node = numa_index; + total_memory += mig_mem[numa_index]; + } + + if (total_memory < MBS_PER_GB) + return EINVAL; + + page_num = total_memory / _4K_PER_M; + dirty_bytes = ALIGN(page_num, BITS_PER_LONG) / BITS_PER_BYTE; + dirty_bitmap_size = ALIGN(dirty_bytes, SZ_2M); + bitmap = __vmalloc_node_range(dirty_bitmap_size * 2, SZ_2M, VMALLOC_START, VMALLOC_END, + GFP_KERNEL | __GFP_ZERO, PAGE_KERNEL, VM_ALLOW_HUGE_VMAP, first_node, __builtin_return_address(0)); + if (!bitmap) + return -ENOMEM; + + kvfree(bitmap); + return 0; +} + static int mig_src_meta_data_check(tmm_memory_info_s *memory_info, uint64_t *mig_mem) { int numa_index; @@ -702,10 +731,17 @@ static ssize_t mig_check_src_store(struct kobject *kobj, return ret; } + ret = mig_src_mem_check(mig_mem); + if (ret != 0) { + pr_err("tmm_driver: migration check failed\n"); + goto out; + } + ret = mig_src_meta_data_check(memory_info, mig_mem); if (ret != 0) pr_err("tmm_driver: migration check failed\n"); +out: kfree(memory_info); if (ret == 0) { pr_info("tmm_driver: src migration check pass\n"); -- Gitee