Re: [PATCH v2] zram: fix idle age_sec underflow in idle_store()

From: Sergey Senozhatsky

Date: Fri Aug 28 2026 - 05:30:11 EST


On (26/08/28 16:31), Hao Jia wrote:
> After commit 2e8ff2f51dde ("zram: use u32 for entry ac_time tracking"),
> idle_store() computes the idle cutoff as:
>
> cutoff = ktime_sub((u32)ktime_get_boottime_seconds(), age_sec);
>
> Because the left operand is cast to u32, when age_sec exceeds the current
> uptime the subtraction wraps modulo 2^32 and the huge result is
> zero-extended into the s64 cutoff. mark_idle() then marks every entry as
> idle instead of matching nothing. For instance, running
>
> echo 86400 > /sys/block/zramX/idle
>
> on a machine up for only two minutes marks all newly written pages idle
> and hands them to idle writeback and recompression.
>
> No slot can have been accessed before the system booted, so an age_sec
> that reaches back past uptime cannot match any slot. Return early in that
> case, without walking the table or taking any slot locks.
>
> Track the cutoff as time64_t rather than ktime_t. Both cutoff and
> ac_time are boot-time values in seconds, so a plain arithmetic
> comparison against ac_time in mark_idle() is correct and no ktime
> helpers are needed.
>
> Fixes: 2e8ff2f51dde ("zram: use u32 for entry ac_time tracking")
> Cc: stable@xxxxxxxxxxxxxxx
> Suggested-by: Sergey Senozhatsky <senozhatsky@xxxxxxxxxxxx>
> Signed-off-by: Hao Jia <jiahao1@xxxxxxxxxxx>

Reviewed-by: Sergey Senozhatsky <senozhatsky@xxxxxxxxxxxx>