Re: [PATCH v2] percpu: Fix hint invariant breakage

From: Kuan-Wei Chiu

Date: Thu Apr 09 2026 - 13:03:39 EST


Hi Joonwon,

On Wed, Apr 08, 2026 at 10:06:42AM +0000, Joonwon Kang wrote:
> The invariant "scan_hint_start > contig_hint_start if and only if
> scan_hint == contig_hint" should be kept for hint management. However,
> it could be broken in some cases:
>
> - if (new contig == contig_hint == scan_hint) && (contig_hint_start <
> scan_hint_start < new contig start) && the new contig is to become a
> new contig_hint due to its better alignment, then scan_hint should
> be invalidated instead of keeping the old value.
>
> - if (new contig == contig_hint > scan_hint) && (new contig start <
> contig_hint_start) && the new contig is not to become a new
> contig_hint, then scan_hint should be not updated to the new contig.
>
> This commit refactors the percpu block update code to make it more
> visible on what to consider, e.g. when the new contig overlaps with the
> old contig_hint or scan_hint, fixes the invariant breakage and also
> optimizes scan_hint further. Some of the optimization cases when no
> overlap occurs are:
>
> - if (new contig > contig_hint > scan_hint) && (scan_hint_start < new
> contig start < contig_hint_start), then keep scan_hint instead of
> invalidating it.
>
> - if (new contig > contig_hint == scan_hint) && (contig_hint_start <
> new contig start < scan_hint_start), then update scan_hint to the
> old contig_hint instead of invalidating it.
>
> - if (new contig == contig_hint > scan_hint) && (new contig start <
> contig_hint_start) && the new contig is to become a new contig_hint
> due to its better alignment, then update scan_hint to the old
> contig_hint instead of invalidating or keeping it.
>
> Signed-off-by: Joonwon Kang <joonwonkang@xxxxxxxxxx>
> ---
> v1 -> v2: Consider cases where the new contig overlaps with the existing
> contig_hint or scan_hint.
>
> mm/percpu.c | 124 +++++++++++++++++++++++++++++++++++-----------------
> 1 file changed, 85 insertions(+), 39 deletions(-)
>

Just a few minor style nits; checkpatch.pl reported the following:

CHECK: Lines should not end with a '('
#173: FILE: mm/percpu.c:653:
+ overlap_with_contig_hint = pcpu_region_overlap(

CHECK: Unnecessary parentheses around 'scan_hint_cand_2 > scan_hint_cand_1'
#258: FILE: mm/percpu.c:699:
+ if ((scan_hint_cand_2 > scan_hint_cand_1) ||
+ (scan_hint_cand_2 == scan_hint_cand_1 &&
+ scan_hint_cand_2_start > scan_hint_cand_1_start)) {

Since this patch will need a respin anyway, I think it would be better
to address these together in the next version.

Regards,
Kuan-Wei