• Yang Shi's avatar
    debugobjects: Add global free list and the counter · 36c4ead6
    Yang Shi authored
    free_object() adds objects to the pool list and schedules work when the
    pool list is larger than the pool size.  The worker handles the actual
    kfree() of the object by iterating the pool list until the pool size is
    below the maximum pool size again.
    
    To iterate the pool list, pool_lock has to be held and the objects which
    should be freed() need to be put into temporary storage so pool_lock can be
    dropped for the actual kmem_cache_free() invocation. That's a pointless and
    expensive exercise if there is a large number of objects to free.
    
    In such a case its better to evaulate the fill level of the pool in
    free_objects() and queue the object to free either in the pool list or if
    it's full on a separate global free list.
    
    The worker can then do the following simpler operation:
    
      - Move objects back from the global free list to the pool list if the
        pool list is not longer full.
    
      - Remove the remaining objects in a single list move operation from the
        global free list and do the kmem_cache_free() operation lockless from
        the temporary list head.
    
    In fill_pool() the global free list is checked as well to avoid real
    allocations from the kmem cache.
    
    Add the necessary list head and a counter for the number of objects on the
    global free list and export that counter via sysfs:
    
    max_chain     :79
    max_loops     :8147
    warnings      :0
    fixups        :0
    pool_free     :1697
    pool_min_free :346
    pool_used     :15356
    pool_max_used :23933
    on_free_list  :39
    objs_allocated:32617
    objs_freed    :16588
    
    Nothing queues objects on the global free list yet. This happens in a
    follow up change.
    
    [ tglx: Simplified implementation and massaged changelog ]
    Suggested-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarYang Shi <yang.shi@linux.alibaba.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: longman@redhat.com
    Link: https://lkml.kernel.org/r/1517872708-24207-3-git-send-email-yang.shi@linux.alibaba.com
    36c4ead6
debugobjects.c 30.1 KB