Re: [RFC PATCH v4 4/6] mm/migrate: add copy offload registration infrastructure
From: Huang, Ying
Date: Tue Apr 07 2026 - 03:40:36 EST
"Garg, Shivank" <shivankg@xxxxxxx> writes:
> On 3/24/2026 4:24 PM, Huang, Ying wrote:
>> Shivank Garg <shivankg@xxxxxxx> writes:
>>
>>> Introduce CONFIG_MIGRATION_COPY_OFFLOAD, which lets offload driver
>>
>> Do we really need a new kconfig option? IMHO, we have too many now.
>> Because we have a jump label already, the performance difference should
>> be trivial. Can you measure the size difference?
>
> BASELINE (offload=n)
> text data bss dec filename
> 23577 1632 32 25241 mm/migrate.o
> 39202900 14159750 6502152 59864802 vmlinux
>
> WITH OFFLOAD (offload=y)
> text data bss dec filename
> 24444 2568 32 27044 mm/migrate.o
> 676 64 8 748 mm/migrate_copy_offload.o
> 39208218 14163942 6498120 59870280 vmlinux
>
> WITHOUT CONFIG (always-on)
> text data bss dec filename
> 24444 2568 32 27044 mm/migrate.o
> 676 64 8 748 mm/migrate_copy_offload.o
> 39208405 14163942 6498120 59870467 vmlinux
>
> It saves around 5.5KB of size, when offload support is disabled.
> Is it meaningful savings? What do you think?
The size difference of "vmlinux" is 5.5KB. While that of *.o is 2.55k.
Not too big for me.
>From another point of view, if we will add kconfig for "migrator"
implementations, we can make this general kconfig option invisible and
be selected automatically?
>>
>>> +#ifdef CONFIG_MIGRATION_COPY_OFFLOAD
>>> +extern struct static_key_false migrate_offload_enabled;
>>> +extern struct srcu_struct migrate_offload_srcu;
>>> +bool migrate_should_batch_default(int reason);
>>> +int migrate_offload_start(struct migrator *m);
>>> +int migrate_offload_stop(struct migrator *m);
>>
>> Why not naming the function migrate_offload_register/unregister()?
>> IMHO, that sounds more natural.
>
> Ack. I'll rename to migrate_offload_register/unregister().
>
>>
>>>
>>> +#ifdef CONFIG_MIGRATION_COPY_OFFLOAD
>>> + /* Check if the offload driver wants to batch for this reason */
>>> + if (static_branch_unlikely(&migrate_offload_enabled))
>>> + do_batch = static_call(migrate_should_batch)(reason);
>>
>> Should batching based on "reason" be determined by the general migrate
>> code instead of the migrator implementation? For example, if we only
>> batch copying for ASYNC migration, we should determine that in
>> migrate_pages_batch() instead of the migreation implementation. Or am I
>> missed something? If so, can you provide an example?
>>
>
> My idea was that different drivers may have different cost/benefit
> profiles(e.g. setup cost, migrate batch-size, etc..)
>
> For instance, a DMA driver may want to target only bulk migration usecase.
> And a CPU-thread based driver can be used more broadly, without worrying
> about setup-costs.
>
> But I agree it's premature with only one-driver.
> I'll move the reason check with target usecases into migrate_pages_batch()
> and drop the should_batch() callback. If a future driver needs different
> filtering, we can add it back then.
In general, I think that "reason" based policy should be in the general
migrate_pages function. While "batch size" based policy can be in the
migrator implementations.
>>>
>>> +#ifdef CONFIG_MIGRATION_COPY_OFFLOAD
>>> /* Batch-copy eligible folios before the move phase */
>>> if (!list_empty(&src_batch)) {
>>
>> Guard with "static_branch_unlikely(&migrate_offload_enabled)" first?
>> Better to define a inline function to shorten the expression.
>>
>
> Sure, will add the static_branch_unlikely guard and wrap in a helper
> function. Thanks.
---
Best Regards,
Huang, Ying