On 6/15/26 13:06, Harry Yoo (Oracle) wrote:
> struct rcu_head is overkill for kfree_rcu() because the callback
> function is always kfree() and thus there is no need for a function
> pointer.
> 
> It is enough to implement a linked list using a single pointer.
> Introduce a new struct called kfree_rcu_head (the name was suggested
> by Vlastimil Babka), which is similar to struct rcu_head but is only
> a single pointer. Use it only in kfree_rcu_nolock() for now.
> 
> It is intended that in most cases, kfree_rcu_nolock() goes through
> sheaves path and the field is not used at all. However, in the worst
> case where trylock fails or no empty sheaves are available, maintain
> a global list of objects that will later be freed after
> synchronize_rcu() in a workqueue. Since the fallback is intended to be
> the last resort, it focuses on minimizing complexity and memory usage.
> 
> To avoid crashing the kernel in a theoretical case where fallback path
> is taken before kmem_cache_init_late(), do not queue the work until
> the workqueue is actually allocated.
> 
> Factor out the logic that calculates object start address into
> object_start_address() from kvfree_rcu_cb() to avoid duplicating it.
> 
> Suggested-by: Alexei Starovoitov <[email protected]>
> Signed-off-by: Harry Yoo (Oracle) <[email protected]>

Looks reasonable, if it works fast enough in practice.
Acked-by: Vlastimil Babka (SUSE) <[email protected]>


Reply via email to