Message ID | 20250320185238.447458-12-jim.cromie@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Fix CONFIG_DRM_USE_DYNAMIC_DEBUG=y | expand |
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@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@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",
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 + */ +#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",
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@gmail.com> --- lib/dynamic_debug.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-)