Re: [PATCH] media: Add type field to struct media_entity

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Em Fri, 26 Feb 2016 15:00:06 +0100
Hans Verkuil <hverkuil@xxxxxxxxx> escreveu:

> On 02/26/2016 02:21 PM, Mauro Carvalho Chehab wrote:
> > Em Fri, 26 Feb 2016 13:18:30 +0200
> > Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> escreveu:
> >   
> >> Hello,
> >>
> >> On Monday 22 February 2016 23:20:58 Sakari Ailus wrote:  
> >>> On Mon, Feb 22, 2016 at 06:46:01AM -0300, Mauro Carvalho Chehab wrote:    
> >>>> Em Mon, 22 Feb 2016 03:53:16 +0200 Laurent Pinchart escreveu:    
> >>>>> Code that processes media entities can require knowledge of the
> >>>>> structure type that embeds a particular media entity instance in order
> >>>>> to use the API provided by that structure. This needs is shown by the
> >>>>> presence of the is_media_entity_v4l2_io and is_media_entity_v4l2_subdev
> >>>>> functions.
> >>>>>
> >>>>> The implementation of those two functions relies on the entity function
> >>>>> field, which is both a wrong and an inefficient design, without even    
> >>>
> >>> I wouldn't necessarily say "wrong", but it is risky. A device's function not
> >>> only defines the interface it offers but also which struct is considered to
> >>> contain the media entity. Having a wrong value in the function field may
> >>> thus lead memory corruption and / or system crash.
> >>>     
> >>>>> mentioning the maintenance issue involved in updating the functions
> >>>>> every time a new entity function is added. Fix this by adding add a type
> >>>>> field to the media entity structure to carry the information.
> >>>>>
> >>>>> Signed-off-by: Laurent Pinchart
> >>>>> <laurent.pinchart+renesas@xxxxxxxxxxxxxxxx>
> >>>>> ---
> >>>>>
> >>>>>  drivers/media/v4l2-core/v4l2-dev.c    |  1 +
> >>>>>  drivers/media/v4l2-core/v4l2-subdev.c |  1 +
> >>>>>  include/media/media-entity.h          | 65 +++++++++++------------------
> >>>>>  3 files changed, 30 insertions(+), 37 deletions(-)    
> >>
> >> [snip]
> >>  
> >>>>> diff --git a/include/media/media-entity.h b/include/media/media-entity.h
> >>>>> index fe485d367985..2be38483f3a4 100644
> >>>>> --- a/include/media/media-entity.h
> >>>>> +++ b/include/media/media-entity.h
> >>>>> @@ -187,10 +187,27 @@ struct media_entity_operations {
> >>>>>  };
> >>>>>  
> >>>>>  /**
> >>>>> + * enum MEDIA_ENTITY_TYPE_NONE - Media entity type
> >>>>> + *    
> >>>>
> >>>> s/MEDIA_ENTITY_TYPE_NONE/media_entity_type/
> >>>>
> >>>> (it seems you didn't test producing the docbook, otherwise you would
> >>>> have seen this error - Please always generate the docbook when the
> >>>> patch contains kernel-doc markups)    
> >>
> >> Oops, sorry. I'll fix that.
> >>  
> >>>> I don't like the idea of calling it as "type", as this is confusing,
> >>>> specially since we used to call entity.type for what we now call function.    
> >>>
> >>> What that field essentially defines is which struct embeds the media entity.
> >>> (Well, there's some cleanups to be done there, as we have extra entity for
> >>> V4L2 subdevices, but that's another story.)
> >>>
> >>> The old type field had that information, plus the "function" of the entity.
> >>>
> >>> I think "type" isn't a bad name for this field, as what we would really need
> >>> is inheritance. It refers to the object type. What would you think of
> >>> "class"?    
> >>
> >> I'd prefer type as class has other meanings in the kernel, but I can live with 
> >> it. Mauro, I agree with Sakari here, what the field contains is really the 
> >> object type in an object-oriented programming context.  
> > 
> > Well, as we could have entities not embedded on some other object, this
> > is actually not an object type, even on OO programming. What we're actually
> > representing here is a graph object class.
> > 
> > The problem is that "type" is a very generic term, and, as we used it before
> > with some other meaning, so I prefer to call it as something else.
> > 
> > I'm ok with any other name, although I agree that Kernel uses "class" for
> > other things. Maybe gr_class or obj_class?  
> 
> I had to think about this a bit, but IMHO it is an entity classification that
> a subsystem sets when creating the entity.
> 
> So v4l2 has the classifications V4L2_SUBDEV and V4L2_IO. And while all entities of the
> V4L2_SUBDEV classification are indeed embedded in a struct v4l2_subdev, that is not
> true for V4L2_IO (radio interface entities are embedded in struct video_device, but
> are not of the V4L2_IO class).
> 
> Other subsystems may need other classifications.
> 
> So what about this:
> 
> enum media_entity_class {
> 	MEDIA_ENTITY_CLASS_UNDEFINED, // Actually, CLASS_NONE would work here too
> 	MEDIA_ENTITY_CLASS_V4L2_IO,
> 	MEDIA_ENTITY_CLASS_V4L2_SUBDEV,
> };
> 
> and the field enum media_entity_class class; in struct media_entity with documentation:
> 
> @class:	Classification of the media_entity, subsystems can set this to quickly classify
> 	what sort of media_entity this is.

Works for me.

> 
> Regards,
> 
> 	Hans


-- 
Thanks,
Mauro
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux