>> + int cpu_id_list[32] = {0}; >> + int cpu; >> + int max_items_per_thread; >> + int item_idx; >> + struct folio *src, *src2, *dst, *dst2; >> + >> + total_mt_num = min_t(unsigned int, total_mt_num, >> + cpumask_weight(per_node_cpumask)); >> + >> + if (total_mt_num > 32) >> + total_mt_num = 32; >> + >> + /* Each threads get part of each page, if nr_items < totla_mt_num */ >> + if (nr_items < total_mt_num) >> + max_items_per_thread = nr_items; >> + else >> + max_items_per_thread = (nr_items / total_mt_num) + >> + ((nr_items % total_mt_num) ? 1 : 0); >> + >> + >> + for (cpu = 0; cpu < total_mt_num; ++cpu) { >> + work_items[cpu] = kzalloc(sizeof(struct copy_page_info) + >> + sizeof(struct copy_item) * max_items_per_thread, >> + GFP_NOWAIT); >> + >> + if (!work_items[cpu]) { >> + err = -ENOMEM; >> + goto free_work_items; >> + } >> + } > > [...snip...] > >> + >> + /* Wait until it finishes */ >> + for (i = 0; i < total_mt_num; ++i) >> + flush_work((struct work_struct *)work_items[i]); >> + >> +free_work_items: >> + for (cpu = 0; cpu < total_mt_num; ++cpu) >> + kfree(work_items[cpu]); >> + >> + return err; > > Should the kernel re-try migration without multi-threading if it failed > to allocate memory? Sure. Will add it in the next version. Thank you for the reviews. -- Best Regards, Yan, Zi