On 5/7/25 11:15, Harry Yoo wrote: > On Fri, Apr 25, 2025 at 10:27:23AM +0200, Vlastimil Babka wrote: >> Add functions for efficient guaranteed allocations e.g. in a critical >> section that cannot sleep, when the exact number of allocations is not >> known beforehand, but an upper limit can be calculated. >> >> kmem_cache_prefill_sheaf() returns a sheaf containing at least given >> number of objects. >> >> kmem_cache_alloc_from_sheaf() will allocate an object from the sheaf >> and is guaranteed not to fail until depleted. >> >> kmem_cache_return_sheaf() is for giving the sheaf back to the slab >> allocator after the critical section. This will also attempt to refill >> it to cache's sheaf capacity for better efficiency of sheaves handling, >> but it's not stricly necessary to succeed. >> >> kmem_cache_refill_sheaf() can be used to refill a previously obtained >> sheaf to requested size. If the current size is sufficient, it does >> nothing. If the requested size exceeds cache's sheaf_capacity and the >> sheaf's current capacity, the sheaf will be replaced with a new one, >> hence the indirect pointer parameter. >> >> kmem_cache_sheaf_size() can be used to query the current size. >> >> The implementation supports requesting sizes that exceed cache's >> sheaf_capacity, but it is not efficient - such "oversize" sheaves are >> allocated fresh in kmem_cache_prefill_sheaf() and flushed and freed >> immediately by kmem_cache_return_sheaf(). kmem_cache_refill_sheaf() >> might be especially ineffective when replacing a sheaf with a new one of >> a larger capacity. It is therefore better to size cache's >> sheaf_capacity accordingly to make oversize sheaves exceptional. >> >> CONFIG_SLUB_STATS counters are added for sheaf prefill and return >> operations. A prefill or return is considered _fast when it is able to >> grab or return a percpu spare sheaf (even if the sheaf needs a refill to >> satisfy the request, as those should amortize over time), and _slow >> otherwise (when the barn or even sheaf allocation/freeing has to be >> involved). sheaf_prefill_oversize is provided to determine how many >> prefills were oversize (counter for oversize returns is not necessary as >> all oversize refills result in oversize returns). >> >> When slub_debug is enabled for a cache with sheaves, no percpu sheaves >> exist for it, but the prefill functionality is still provided simply by >> all prefilled sheaves becoming oversize. If percpu sheaves are not >> created for a cache due to not passing the sheaf_capacity argument on >> cache creation, the prefills also work through oversize sheaves, but >> there's a WARN_ON_ONCE() to indicate the omission. >> >> Signed-off-by: Vlastimil Babka <vba...@suse.cz> >> Reviewed-by: Suren Baghdasaryan <sur...@google.com> >> --- > > Looks good to me, > Reviewed-by: Harry Yoo <harry....@oracle.com> > > with a nit below.
Thanks, incorporated the suggestion!