Hi Laurent, On Wed, Jan 16, 2019 at 01:24:05AM +0200, Laurent Pinchart wrote: > Hi Niklas, > > Thank you for the patch. > > On Fri, Nov 02, 2018 at 12:31:26AM +0100, Niklas Söderlund wrote: > > From: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx> > > > > Add a helper macro for iterating over pads that are connected through > > enabled routes. This can be used to find all the connected pads within an > > entity, for instance starting from the pad which has been obtained during > > the graph walk. > > > > Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx> > > Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@xxxxxxxxxxxx> > > --- > > include/media/media-entity.h | 27 +++++++++++++++++++++++++++ > > 1 file changed, 27 insertions(+) > > > > diff --git a/include/media/media-entity.h b/include/media/media-entity.h > > index 9540d2af80f19805..4bb1b568e1ac4795 100644 > > --- a/include/media/media-entity.h > > +++ b/include/media/media-entity.h > > @@ -936,6 +936,33 @@ __must_check int media_graph_walk_init( > > bool media_entity_has_route(struct media_entity *entity, unsigned int pad0, > > unsigned int pad1); > > > > +static inline struct media_pad *__media_entity_for_routed_pads_next( > > + struct media_pad *start, struct media_pad *iter) > > +{ > > + struct media_entity *entity = start->entity; > > + > > + while (iter < &entity->pads[entity->num_pads] && > > + !media_entity_has_route(entity, start->index, iter->index)) > > + iter++; > > + > > + return iter; > > Returning a pointer past the end of the array is asking for trouble. I > think we should return NULL in that case, and adapt the check in > media_entity_for_routed_pads() accordingly. Well, that pointer never gets used, in a similar manner than simply looping over an array. I wouldn't change that --- this function is also integrally a part of media_entity_for_each_routed_pad() implementation below. > > > +} > > + > > +/** > > + * media_entity_for_routed_pads - Iterate over entity pads connected by routes > > + * > > + * @start: The stating pad > > s/stating/starting/ > > > + * @iter: The iterator pad > > + * > > + * Iterate over all pads connected through routes from a given pad > > + * within an entity. The iteration will include the starting pad itself. > > + */ > > +#define media_entity_for_routed_pads(start, iter) \ > > Maybe media_entity_for_each_routed_pad() ? Or just I'd prefer this one: we have media_entity_ prefix for pretty much everything that handles entities. > for_each_entity_routed_pad() ? > > > + for (iter = __media_entity_for_routed_pads_next( \ > > And how about __media_entity_next_routed_pad() ? Yes. > > > + start, (start)->entity->pads); \ > > + iter < &(start)->entity->pads[(start)->entity->num_pads]; \ > > + iter = __media_entity_for_routed_pads_next(start, iter + 1)) > > + > > /** > > * media_graph_walk_cleanup - Release resources used by graph walk. > > * > -- Sakari Ailus sakari.ailus@xxxxxxxxxxxxxxx