diff mbox series

[18/63] dyndbg: add/use for_subvec() to reduce boilerplate

Message ID 20250125064619.8305-19-jim.cromie@gmail.com (mailing list archive)
State New, archived
Headers show
Series Fix CONFIG_DRM_USE_DYNAMIC_DEBUG=y | expand

Commit Message

Jim Cromie Jan. 25, 2025, 6:45 a.m. UTC
add for_subvec() macro to encapsulate a for-loop pattern thats used
repeatedly to iterate over a boxed.vector of N elements.

Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 lib/dynamic_debug.c | 30 ++++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 8 deletions(-)

Comments

Louis Chauvet Feb. 25, 2025, 2:18 p.m. UTC | #1
Le 25/01/2025 à 07:45, Jim Cromie a écrit :
> add for_subvec() macro to encapsulate a for-loop pattern thats used
> repeatedly to iterate over a boxed.vector of N elements.
> 
> Signed-off-by: Jim Cromie <jim.cromie@gmail.com>

Hi Jim,

Do you think it is possible to move this patch earlier in the series, so 
you can use it when introducing class_users.

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

Thanks,
Louis Chauvet

> ---
>   lib/dynamic_debug.c | 30 ++++++++++++++++++++++--------
>   1 file changed, 22 insertions(+), 8 deletions(-)
> 
> diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
> index 6bca0c6727d4..08b6e4e7489f 100644
> --- a/lib/dynamic_debug.c
> +++ b/lib/dynamic_debug.c
> @@ -158,20 +158,34 @@ static void vpr_info_dq(const struct ddebug_query *query, const char *msg)
>   		  _dt->num_class_users);				\
>   	})
>   
> +/*
> + * 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
> + */
> +#define for_subvec(_i, _sp, _box, _vec)				       \
> +	for ((_i) = 0, (_sp) = (_box)->_vec;			       \
> +	     (_i) < (_box)->num_##_vec;				       \
> +	     (_i)++, (_sp)++)
> +
>   static int ddebug_find_valid_class(struct ddebug_table const *dt, const char *class_string)
>   {
>   	struct ddebug_class_map *map;
>   	struct ddebug_class_user *cli;
>   	int i, idx;
>   
> -	for (i = 0, map = dt->classes; 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) {
>   			vpr_dt_info(dt, "good-class: %s.%s ", map->mod_name, class_string);
>   			return idx + map->base;
>   		}
>   	}
> -	for (i = 0, cli = dt->class_users; i < dt->num_class_users; i++, cli++) {
> +	for_subvec(i, cli, dt, class_users) {
>   		idx = match_string(cli->map->class_names, cli->map->length, class_string);
>   		if (idx >= 0) {
>   			vpr_dt_info(dt, "class-ref: %s -> %s.%s ",
> @@ -1190,7 +1204,7 @@ static void ddebug_apply_params(const struct ddebug_class_map *cm, const char *m
>   	if (cm->mod) {
>   		vpr_cm_info(cm, "loaded classmap: %s", modnm);
>   		/* ifdef protects the cm->mod->kp deref */
> -		for (i = 0, kp = cm->mod->kp; i < cm->mod->num_kp; i++, kp++)
> +		for_subvec(i, kp, cm->mod, kp)
>   			ddebug_match_apply_kparam(kp, cm, modnm);
>   	}
>   #endif
> @@ -1212,7 +1226,7 @@ static void ddebug_attach_module_classes(struct ddebug_table *dt,
>   	struct ddebug_class_map *cm;
>   	int i, nc = 0;
>   
> -	for (i = 0, cm = di->classes; i < di->num_classes; i++, cm++) {
> +	for_subvec(i, cm, di, classes) {
>   		if (!strcmp(cm->mod_name, dt->mod_name)) {
>   			vpr_cm_info(cm, "classes[%d]:", i);
>   			if (!nc++)
> @@ -1225,7 +1239,7 @@ static void ddebug_attach_module_classes(struct ddebug_table *dt,
>   	vpr_info("module:%s attached %d classes\n", dt->mod_name, nc);
>   	dt->num_classes = nc;
>   
> -	for (i = 0, cm = dt->classes; i < dt->num_classes; i++, cm++)
> +	for_subvec(i, cm, dt, classes)
>   		ddebug_apply_params(cm, cm->mod_name);
>   }
>   
> @@ -1245,7 +1259,7 @@ static void ddebug_attach_user_module_classes(struct ddebug_table *dt,
>   	 * module's refs, save to dt.  For loadables, this is the
>   	 * whole array.
>   	 */
> -	for (i = 0, cli = di->class_users; i < di->num_class_users; i++, cli++) {
> +	for_subvec(i, cli, di, class_users) {
>   		if (WARN_ON_ONCE(!cli || !cli->map || !cli->mod_name))
>   			continue;
>   		if (!strcmp(cli->mod_name, dt->mod_name)) {
> @@ -1261,7 +1275,7 @@ static void ddebug_attach_user_module_classes(struct ddebug_table *dt,
>   	dt->num_class_users = nc;
>   
>   	/* now iterate dt */
> -	for (i = 0, cli = dt->class_users; i < dt->num_class_users; i++, cli++)
> +	for_subvec(i, cli, di, class_users)
>   		ddebug_apply_params(cli->map, cli->mod_name);
>   
>   	vpr_dt_info(dt, "attach-client-module: ");
> @@ -1299,7 +1313,7 @@ static int ddebug_add_module(struct _ddebug_info *di, const char *modname)
>   
>   	INIT_LIST_HEAD(&dt->link);
>   
> -	for (i = 0, iter = di->descs; i < di->num_descs; i++, iter++)
> +	for_subvec(i, iter, di, descs)
>   		if (iter->class_id != _DPRINTK_CLASS_DFLT)
>   			class_ct++;
>
Jim Cromie March 16, 2025, 8:50 p.m. UTC | #2
On Tue, Feb 25, 2025 at 7:18 AM Louis Chauvet <louis.chauvet@bootlin.com> wrote:
>
>
>
> Le 25/01/2025 à 07:45, Jim Cromie a écrit :
> > add for_subvec() macro to encapsulate a for-loop pattern thats used
> > repeatedly to iterate over a boxed.vector of N elements.
> >
> > Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
>
> Hi Jim,
>
> Do you think it is possible to move this patch earlier in the series, so
> you can use it when introducing class_users.
>

Yup. :-)

> Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
>
> Thanks,
> Louis Chauvet
>
> > ---
> >   lib/dynamic_debug.c | 30 ++++++++++++++++++++++--------
> >   1 file changed, 22 insertions(+), 8 deletions(-)
> >
> > diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
> > index 6bca0c6727d4..08b6e4e7489f 100644
> > --- a/lib/dynamic_debug.c
> > +++ b/lib/dynamic_debug.c
> > @@ -158,20 +158,34 @@ static void vpr_info_dq(const struct ddebug_query *query, const char *msg)
> >                 _dt->num_class_users);                                \
> >       })
> >
> > +/*
> > + * 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
> > + */
> > +#define for_subvec(_i, _sp, _box, _vec)                                     \
> > +     for ((_i) = 0, (_sp) = (_box)->_vec;                           \
> > +          (_i) < (_box)->num_##_vec;                                \
> > +          (_i)++, (_sp)++)
> > +
> >   static int ddebug_find_valid_class(struct ddebug_table const *dt, const char *class_string)
> >   {
> >       struct ddebug_class_map *map;
> >       struct ddebug_class_user *cli;
> >       int i, idx;
> >
> > -     for (i = 0, map = dt->classes; 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) {
> >                       vpr_dt_info(dt, "good-class: %s.%s ", map->mod_name, class_string);
> >                       return idx + map->base;
> >               }
> >       }
> > -     for (i = 0, cli = dt->class_users; i < dt->num_class_users; i++, cli++) {
> > +     for_subvec(i, cli, dt, class_users) {
> >               idx = match_string(cli->map->class_names, cli->map->length, class_string);
> >               if (idx >= 0) {
> >                       vpr_dt_info(dt, "class-ref: %s -> %s.%s ",
> > @@ -1190,7 +1204,7 @@ static void ddebug_apply_params(const struct ddebug_class_map *cm, const char *m
> >       if (cm->mod) {
> >               vpr_cm_info(cm, "loaded classmap: %s", modnm);
> >               /* ifdef protects the cm->mod->kp deref */
> > -             for (i = 0, kp = cm->mod->kp; i < cm->mod->num_kp; i++, kp++)
> > +             for_subvec(i, kp, cm->mod, kp)
> >                       ddebug_match_apply_kparam(kp, cm, modnm);
> >       }
> >   #endif
> > @@ -1212,7 +1226,7 @@ static void ddebug_attach_module_classes(struct ddebug_table *dt,
> >       struct ddebug_class_map *cm;
> >       int i, nc = 0;
> >
> > -     for (i = 0, cm = di->classes; i < di->num_classes; i++, cm++) {
> > +     for_subvec(i, cm, di, classes) {
> >               if (!strcmp(cm->mod_name, dt->mod_name)) {
> >                       vpr_cm_info(cm, "classes[%d]:", i);
> >                       if (!nc++)
> > @@ -1225,7 +1239,7 @@ static void ddebug_attach_module_classes(struct ddebug_table *dt,
> >       vpr_info("module:%s attached %d classes\n", dt->mod_name, nc);
> >       dt->num_classes = nc;
> >
> > -     for (i = 0, cm = dt->classes; i < dt->num_classes; i++, cm++)
> > +     for_subvec(i, cm, dt, classes)
> >               ddebug_apply_params(cm, cm->mod_name);
> >   }
> >
> > @@ -1245,7 +1259,7 @@ static void ddebug_attach_user_module_classes(struct ddebug_table *dt,
> >        * module's refs, save to dt.  For loadables, this is the
> >        * whole array.
> >        */
> > -     for (i = 0, cli = di->class_users; i < di->num_class_users; i++, cli++) {
> > +     for_subvec(i, cli, di, class_users) {
> >               if (WARN_ON_ONCE(!cli || !cli->map || !cli->mod_name))
> >                       continue;
> >               if (!strcmp(cli->mod_name, dt->mod_name)) {
> > @@ -1261,7 +1275,7 @@ static void ddebug_attach_user_module_classes(struct ddebug_table *dt,
> >       dt->num_class_users = nc;
> >
> >       /* now iterate dt */
> > -     for (i = 0, cli = dt->class_users; i < dt->num_class_users; i++, cli++)
> > +     for_subvec(i, cli, di, class_users)
> >               ddebug_apply_params(cli->map, cli->mod_name);
> >
> >       vpr_dt_info(dt, "attach-client-module: ");
> > @@ -1299,7 +1313,7 @@ static int ddebug_add_module(struct _ddebug_info *di, const char *modname)
> >
> >       INIT_LIST_HEAD(&dt->link);
> >
> > -     for (i = 0, iter = di->descs; i < di->num_descs; i++, iter++)
> > +     for_subvec(i, iter, di, descs)
> >               if (iter->class_id != _DPRINTK_CLASS_DFLT)
> >                       class_ct++;
> >
>
> --
> Louis Chauvet, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
>
diff mbox series

Patch

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 6bca0c6727d4..08b6e4e7489f 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -158,20 +158,34 @@  static void vpr_info_dq(const struct ddebug_query *query, const char *msg)
 		  _dt->num_class_users);				\
 	})
 
+/*
+ * 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
+ */
+#define for_subvec(_i, _sp, _box, _vec)				       \
+	for ((_i) = 0, (_sp) = (_box)->_vec;			       \
+	     (_i) < (_box)->num_##_vec;				       \
+	     (_i)++, (_sp)++)
+
 static int ddebug_find_valid_class(struct ddebug_table const *dt, const char *class_string)
 {
 	struct ddebug_class_map *map;
 	struct ddebug_class_user *cli;
 	int i, idx;
 
-	for (i = 0, map = dt->classes; 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) {
 			vpr_dt_info(dt, "good-class: %s.%s ", map->mod_name, class_string);
 			return idx + map->base;
 		}
 	}
-	for (i = 0, cli = dt->class_users; i < dt->num_class_users; i++, cli++) {
+	for_subvec(i, cli, dt, class_users) {
 		idx = match_string(cli->map->class_names, cli->map->length, class_string);
 		if (idx >= 0) {
 			vpr_dt_info(dt, "class-ref: %s -> %s.%s ",
@@ -1190,7 +1204,7 @@  static void ddebug_apply_params(const struct ddebug_class_map *cm, const char *m
 	if (cm->mod) {
 		vpr_cm_info(cm, "loaded classmap: %s", modnm);
 		/* ifdef protects the cm->mod->kp deref */
-		for (i = 0, kp = cm->mod->kp; i < cm->mod->num_kp; i++, kp++)
+		for_subvec(i, kp, cm->mod, kp)
 			ddebug_match_apply_kparam(kp, cm, modnm);
 	}
 #endif
@@ -1212,7 +1226,7 @@  static void ddebug_attach_module_classes(struct ddebug_table *dt,
 	struct ddebug_class_map *cm;
 	int i, nc = 0;
 
-	for (i = 0, cm = di->classes; i < di->num_classes; i++, cm++) {
+	for_subvec(i, cm, di, classes) {
 		if (!strcmp(cm->mod_name, dt->mod_name)) {
 			vpr_cm_info(cm, "classes[%d]:", i);
 			if (!nc++)
@@ -1225,7 +1239,7 @@  static void ddebug_attach_module_classes(struct ddebug_table *dt,
 	vpr_info("module:%s attached %d classes\n", dt->mod_name, nc);
 	dt->num_classes = nc;
 
-	for (i = 0, cm = dt->classes; i < dt->num_classes; i++, cm++)
+	for_subvec(i, cm, dt, classes)
 		ddebug_apply_params(cm, cm->mod_name);
 }
 
@@ -1245,7 +1259,7 @@  static void ddebug_attach_user_module_classes(struct ddebug_table *dt,
 	 * module's refs, save to dt.  For loadables, this is the
 	 * whole array.
 	 */
-	for (i = 0, cli = di->class_users; i < di->num_class_users; i++, cli++) {
+	for_subvec(i, cli, di, class_users) {
 		if (WARN_ON_ONCE(!cli || !cli->map || !cli->mod_name))
 			continue;
 		if (!strcmp(cli->mod_name, dt->mod_name)) {
@@ -1261,7 +1275,7 @@  static void ddebug_attach_user_module_classes(struct ddebug_table *dt,
 	dt->num_class_users = nc;
 
 	/* now iterate dt */
-	for (i = 0, cli = dt->class_users; i < dt->num_class_users; i++, cli++)
+	for_subvec(i, cli, di, class_users)
 		ddebug_apply_params(cli->map, cli->mod_name);
 
 	vpr_dt_info(dt, "attach-client-module: ");
@@ -1299,7 +1313,7 @@  static int ddebug_add_module(struct _ddebug_info *di, const char *modname)
 
 	INIT_LIST_HEAD(&dt->link);
 
-	for (i = 0, iter = di->descs; i < di->num_descs; i++, iter++)
+	for_subvec(i, iter, di, descs)
 		if (iter->class_id != _DPRINTK_CLASS_DFLT)
 			class_ct++;