[PATCH v2 11/59] dyndbg: macrofy a 2-index for-loop pattern

Louis Chauvet louis.chauvet at bootlin.com
Mon Mar 24 15:10:27 UTC 2025



Le 20/03/2025 à 19:51, Jim Cromie a écrit :
> dynamic-debug has several __sections, each with <vecname>,
> num_<vecname>, and it iterates over these with a 2-index for-loop.
> These loops are fiddly with the 2 names.
> 
> We have only 2 such loops now, but are getting more soon; lets
> embed/abstract the fiddlyness in the for_subvec() macro, and avoid
> repeating it going forward.
> 
> Signed-off-by: Jim Cromie <jim.cromie at gmail.com>
> ---
>   lib/dynamic_debug.c | 20 +++++++++++++++++---
>   1 file changed, 17 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
> index d5572712ce55..94f6c8fd787b 100644
> --- a/lib/dynamic_debug.c
> +++ b/lib/dynamic_debug.c
> @@ -128,6 +128,21 @@ do {								\
>   #define v3pr_info(fmt, ...)	vnpr_info(3, fmt, ##__VA_ARGS__)
>   #define v4pr_info(fmt, ...)	vnpr_info(4, fmt, ##__VA_ARGS__)
>   
> +
> +/*
> + * simplify a repeated for-loop pattern walking N steps in a T _vec
> + * member inside a struct _box.  It expects int i and T *_sp to be
> + * declared in the caller.
> + * @_i:  caller provided counter.
> + * @_sp: cursor into _vec, to examine each item.
> + * @_box: ptr to a struct containing @_vec member
> + * @_vec: name of a sub-struct member in _box, with array-ref and length
> + */

Nice macro to make the code easier to read!

Reviewed-by: Louis Chauvet <louis.chauvet at bootlin.com>

> +#define for_subvec(_i, _sp, _box, _vec)				       \
> +	for ((_i) = 0, (_sp) = (_box)->_vec;			       \
> +	     (_i) < (_box)->num_##_vec;				       \
> +	     (_i)++, (_sp)++)
> +
>   static void vpr_info_dq(const struct ddebug_query *query, const char *msg)
>   {
>   	/* trim any trailing newlines */
> @@ -156,7 +171,7 @@ static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_table cons
>   	struct ddebug_class_map *map;
>   	int i, idx;
>   
> -	for (map = dt->classes, i = 0; i < dt->num_classes; i++, map++) {
> +	for_subvec(i, map, dt, classes) {
>   		idx = match_string(map->class_names, map->length, class_string);
>   		if (idx >= 0) {
>   			*class_id = idx + map->base;
> @@ -1221,8 +1236,7 @@ static void ddebug_attach_module_classes(struct ddebug_table *dt, struct _ddebug
>   	 * the builtin/modular classmap vector/section.  Save the start
>   	 * and length of the subrange at its edges.
>   	 */
> -	for (cm = di->classes, i = 0; i < di->num_classes; i++, cm++) {
> -
> +	for_subvec(i, cm, di, classes) {
>   		if (!strcmp(cm->mod_name, dt->mod_name)) {
>   			if (!nc) {
>   				v2pr_info("start subrange, class[%d]: module:%s base:%d len:%d ty:%d\n",

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com




More information about the Intel-gfx-trybot mailing list