On 4/23/24 06:55, Jianfeng Wang wrote: > This patch fixes a known issue in get_slabinfo() which relies on > count_partial() to get the exact count of free objects in a > kmem_cache_node's partial list. For some slubs, their partial lists > can be extremely long. Currently, count_partial() traverses a partial > list to get the exact count of objects. This process may take a long > time, during which slab allocations are blocked and IRQs are disabled. > In production, even NMI watchdog can be triggered due to this matter. > > The fix is to limit the number of slabs to scan and output an > approximated count for a long partial list. The v1 patch counts N slabs > from the list's head and then uses it to estimate the total object > count in the list. As suggested by Vlastimil, the v2 patch uses an > alternative, i.e., counting N/2 from the list's head and tail, produces > a more accurate approximation after the partial list is sorted by > kmem_cache_shrink(). In the latest version, the implementation is moved > to a new function count_partial_free_approx() under CONFIG_SLUB_DEBUG. > count_partial() is still used in sysfs. > > --- > Changes since v3 [3] > - Place count_partial_free_approx() under CONFIG_SLUB_DEBUG only Thanks, replaced v3 in slab/for-next. > > Changes since v2 [2] > - Introduce count_partial_free_approx() and keep count_partial() > - Use count_partial_free_approx() in get_slabinfo() and slab_out_of_memory() > > Changes since v1 [1] > - Update the approximation method by counting from the list's head and tail > - Cap the approximation by the total object count > - Update the commit message to add benchmark results and explain the choice > > [1] https://lore.kernel.org/linux-mm/20240411164023.99368-1-jianfeng.w.wang@xxxxxxxxxx/ > [2] https://lore.kernel.org/linux-mm/20240417185938.5237-2-jianfeng.w.wang@xxxxxxxxxx/ > [3] https://lore.kernel.org/linux-mm/20240419175611.47413-1-jianfeng.w.wang@xxxxxxxxxx/ > > Thanks, > --Jianfeng > > Jianfeng Wang (2): > slub: introduce count_partial_free_approx() > slub: use count_partial_free_approx() in slab_out_of_memory() > > mm/slub.c | 41 +++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 39 insertions(+), 2 deletions(-) >