[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20251112021217.GA45963@system.software.com>
Date: Wed, 12 Nov 2025 11:12:17 +0900
From: Byungchul Park <byungchul@...com>
To: "Garg, Shivank" <shivankg@....com>
Cc: akpm@...ux-foundation.org, david@...hat.com, ziy@...dia.com,
willy@...radead.org, matthew.brost@...el.com,
joshua.hahnjy@...il.com, rakie.kim@...com, gourry@...rry.net,
ying.huang@...ux.alibaba.com, apopple@...dia.com,
lorenzo.stoakes@...cle.com, Liam.Howlett@...cle.com, vbabka@...e.cz,
rppt@...nel.org, surenb@...gle.com, mhocko@...e.com,
vkoul@...nel.org, lucas.demarchi@...el.com, rdunlap@...radead.org,
jgg@...pe.ca, kuba@...nel.org, justonli@...omium.org,
ivecera@...hat.com, dave.jiang@...el.com,
Jonathan.Cameron@...wei.com, dan.j.williams@...el.com,
rientjes@...gle.com, Raghavendra.KodsaraThimmappa@....com,
bharata@....com, alirad.malek@...corp.com, yiannis@...corp.com,
weixugc@...gle.com, linux-kernel@...r.kernel.org,
linux-mm@...ck.org, kernel_team@...ynix.com
Subject: Re: [RFC V3 6/9] mtcopy: introduce multi-threaded page copy routine
On Thu, Nov 06, 2025 at 11:57:54AM +0530, Garg, Shivank wrote:
> On 10/20/2025 1:58 PM, Byungchul Park wrote:
> > Thanks for the great work.
> >
> > By the way, is it okay to use work queue? When the system is idle, this
> > patch will improve the migration performance, but when there are a lot
> > of other runnable tasks in the system, it might be worse than the
> > current one. That's gonna be even worse if there are some other tasks
> > that wait for the migration to end. It's worth noting that
> > padata_do_multithreaded() also uses work queue internally.
> >
> > I think, at worst, the performance should be same as is. Or am I
> > missing something?
> >
> > Byungchul
>
> Hi Byungchul,
>
> This was addressed by Zi in the mail:
> https://lore.kernel.org/linux-mm/61F6152C-A91E-453B-9521-34B7497AE532@nvidia.com
>
> So, there are some specific use cases that can benefit significantly when CPU cores are idle
Sure. I think so. I meant the mechanism using multi-threads would
better be performed for faster migration when a system is idle, but it'd
better avoid the aggressiveness when the system is busy.
Or we might observe a performance degradation due to this work.
Byungchul
> while GPUs or accelerators handle most of the workload.
> In such scenarios, migrating pages to and from device memory (GPU or AI accelerator) quickly
> is critical and ensure hot data is always available for accelerators.
>
> Thanks,
> Shivank
>
> >
> >> + per_cpu_item_idx = 0;
> >> + cpu++;
> >> + }
> >> + }
> >> + if (item_idx != nr_items)
> >> + pr_warn("%s: only %d out of %d pages are transferred\n",
> >> + __func__, item_idx - 1, nr_items);
> >> + }
> >> +
> >> + /* Wait until it finishes */
> >> + for (i = 0; i < total_mt_num; ++i) {
> >> + flush_work((struct work_struct *)work_items[i]);
> >> + /* retry if any copy fails */
> >> + if (work_items[i]->ret)
> >> + err = -EAGAIN;
> >> + }
> >> +
> >> +free_work_items:
> >> + for (cpu = 0; cpu < total_mt_num; ++cpu)
> >> + kfree(work_items[cpu]);
> >> +
> >> + return err;
> >> +}
> >> +
> >> +static struct kobject *mt_kobj_ref;
> >> +static struct kobj_attribute mt_offloading_attribute = __ATTR(offloading, 0664,
> >> + mt_offloading_show, mt_offloading_set);
> >> +static struct kobj_attribute mt_threads_attribute = __ATTR(threads, 0664,
> >> + mt_threads_show, mt_threads_set);
> >> +
> >> +static int __init cpu_mt_module_init(void)
> >> +{
> >> + int ret = 0;
> >> +
> >> + mt_kobj_ref = kobject_create_and_add("cpu_mt", kernel_kobj);
> >> + if (!mt_kobj_ref)
> >> + return -ENOMEM;
> >> +
> >> + ret = sysfs_create_file(mt_kobj_ref, &mt_offloading_attribute.attr);
> >> + if (ret)
> >> + goto out_offloading;
> >> +
> >> + ret = sysfs_create_file(mt_kobj_ref, &mt_threads_attribute.attr);
> >> + if (ret)
> >> + goto out_threads;
> >> +
> >> + is_dispatching = 0;
> >> +
> >> + return 0;
> >> +
> >> +out_threads:
> >> + sysfs_remove_file(mt_kobj_ref, &mt_offloading_attribute.attr);
> >> +out_offloading:
> >> + kobject_put(mt_kobj_ref);
> >> + return ret;
> >> +}
> >> +
> >> +static void __exit cpu_mt_module_exit(void)
> >> +{
> >> + /* Stop the MT offloading to unload the module */
> >> + mutex_lock(&migratecfg_mutex);
> >> + if (is_dispatching == 1) {
> >> + stop_offloading();
> >> + is_dispatching = 0;
> >> + }
> >> + mutex_unlock(&migratecfg_mutex);
> >> +
> >> + sysfs_remove_file(mt_kobj_ref, &mt_threads_attribute.attr);
> >> + sysfs_remove_file(mt_kobj_ref, &mt_offloading_attribute.attr);
> >> + kobject_put(mt_kobj_ref);
> >> +}
> >> +
> >> +module_init(cpu_mt_module_init);
> >> +module_exit(cpu_mt_module_exit);
> >> +
> >> +MODULE_LICENSE("GPL");
> >> +MODULE_AUTHOR("Zi Yan");
> >> +MODULE_DESCRIPTION("CPU_MT_COPY"); /* CPU Multithreaded Batch Migrator */
> >> --
> >> 2.43.0
Powered by blists - more mailing lists