On 2024/10/8 0:50, Thomas Gleixner wrote:
> Move the debug_obj::object pointer into a union and add a pointer to the
> last node in a batch. That allows to implement batch processing efficiently
> by utilizing the stack property of hlist:
>
> When the first object of a batch is added to the list, then the batch
> pointer is set to the hlist node of the object itself. Any subsequent add
> retrieves the pointer to the last node from the first object in the list
> and uses that for storing the last node pointer in the newly added object.
>
> Add the pointer to the data structure and ensure that all relevant pool
> sizes are strictly batch sized. The actual batching implementation follows
> in subsequent changes.
Reviewed-by: Zhen Lei <thunder.leizhen@huawei.com>
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> include/linux/debugobjects.h | 12 ++++++++----
> lib/debugobjects.c | 10 +++++++---
> 2 files changed, 15 insertions(+), 7 deletions(-)
>
> --- a/include/linux/debugobjects.h
> +++ b/include/linux/debugobjects.h
> @@ -23,13 +23,17 @@ struct debug_obj_descr;
> * @state: tracked object state
> * @astate: current active state
> * @object: pointer to the real object
> + * @batch_last: pointer to the last hlist node in a batch
> * @descr: pointer to an object type specific debug description structure
> */
> struct debug_obj {
> - struct hlist_node node;
> - enum debug_obj_state state;
> - unsigned int astate;
> - void *object;
> + struct hlist_node node;
> + enum debug_obj_state state;
> + unsigned int astate;
> + union {
> + void *object;
> + struct hlist_node *batch_last;
> + };
> const struct debug_obj_descr *descr;
> };
>
> --- a/lib/debugobjects.c
> +++ b/lib/debugobjects.c
> @@ -21,11 +21,15 @@
> #define ODEBUG_HASH_BITS 14
> #define ODEBUG_HASH_SIZE (1 << ODEBUG_HASH_BITS)
>
> -#define ODEBUG_POOL_SIZE 1024
> -#define ODEBUG_POOL_MIN_LEVEL 256
> -#define ODEBUG_POOL_PERCPU_SIZE 64
> +/* Must be power of two */
> #define ODEBUG_BATCH_SIZE 16
>
> +/* Initial values. Must all be a multiple of batch size */
> +#define ODEBUG_POOL_SIZE (64 * ODEBUG_BATCH_SIZE)
> +#define ODEBUG_POOL_MIN_LEVEL (ODEBUG_POOL_SIZE / 4)
> +
> +#define ODEBUG_POOL_PERCPU_SIZE (4 * ODEBUG_BATCH_SIZE)
> +
> #define ODEBUG_CHUNK_SHIFT PAGE_SHIFT
> #define ODEBUG_CHUNK_SIZE (1 << ODEBUG_CHUNK_SHIFT)
> #define ODEBUG_CHUNK_MASK (~(ODEBUG_CHUNK_SIZE - 1))
>
> .
>
--
Regards,
Zhen Lei