From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Cc: Linux Media Mailing List <linux-media@vger.kernel.org>
Subject: Re: [PATCH v8 31/55] [media] media: add macros to check if subdev or V4L2 DMA
Date: Tue, 16 Feb 2016 02:34 +0200 [thread overview]
Message-ID: <8151381.MYthLnZLUV@avalon> (raw)
In-Reply-To: <20151208134100.11e9def3@recife.lan>
Hi Mauro,
On Tuesday 08 December 2015 13:41:00 Mauro Carvalho Chehab wrote:
> Em Sun, 06 Dec 2015 04:20:38 +0200 Laurent Pinchart escreveu:
> > On Sunday 06 September 2015 09:02:57 Mauro Carvalho Chehab wrote:
> > > As we'll be removing entity subtypes from the Kernel, we need
> > > to provide a way for drivers and core to check if a given
> > > entity is represented by a V4L2 subdev or if it is an V4L2
> > > I/O entity (typically with DMA).
> > >
> > > Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
> > >
> > > diff --git a/include/media/media-entity.h b/include/media/media-entity.h
> > > index 4e36b1f2b2d7..220864319d21 100644
> > > --- a/include/media/media-entity.h
> > > +++ b/include/media/media-entity.h
> > > @@ -220,6 +220,39 @@ static inline u32 media_gobj_gen_id(enum
> > > media_gobj_type type, u32 local_id) return id;
> > >
> > > }
> > >
> > > +static inline bool is_media_entity_v4l2_io(struct media_entity *entity)
> > > +{
> > > + if (!entity)
> > > + return false;
> > > +
> > > + switch (entity->type) {
> > > + case MEDIA_ENT_T_V4L2_VIDEO:
> > > + case MEDIA_ENT_T_V4L2_VBI:
> > > + case MEDIA_ENT_T_V4L2_SWRADIO:
> > > + return true;
> > > + default:
> > > + return false;
> > > + }
> > > +}
> > > +
> > > +static inline bool is_media_entity_v4l2_subdev(struct media_entity
> > > *entity)
> > > +{
> > > + if (!entity)
> > > + return false;
> > > +
> > > + switch (entity->type) {
> > > + case MEDIA_ENT_T_V4L2_SUBDEV_SENSOR:
> > > + case MEDIA_ENT_T_V4L2_SUBDEV_FLASH:
> > > + case MEDIA_ENT_T_V4L2_SUBDEV_LENS:
> > > + case MEDIA_ENT_T_V4L2_SUBDEV_DECODER:
> > > + case MEDIA_ENT_T_V4L2_SUBDEV_TUNER:
> >
> > I'm sorry but this simply won't scale. We need a better way to determine
> > the entity type, and this could be a valid use case to actually retain an
> > entity type field separate from the function, at least inside the kernel.
>
> As we're getting rid of a separate range for V4L2 subdevs, several drivers
> need some logic to identify if an entity is a subdev or not. So, no matter
> how we implement it, we need a is_media_entity_v4l2_subdev() function.
>
> So, I guess you're discussing the actual implementation, not the need of
> such function.
Correct. On a side note, though, the function should probably be moved to a
V4L2-specific header file.
> With that regards, I'm not sure if this won't scale. The gcc compiler
> optimizer usually uses binary search on switches. So, O(log(n)).
> Even if we had 256 subdev types, that would mean 8 ifs. Doesn't seem
> too bad, specially since we have right now only 5 subdev types.
>
> Ok, there's one thing bad on this: we need to update this function every
> time a new V4L2 subdev is added. So, it may be a maintainance nightmare,
> but I don't see any way to avoid the need of adding the subdevs at both
> UAPI and kernelspace.
That's part of my concern, yes. I've tried to add video processing functions
today and received a WARN_ON() as the is_media_entity_v4l2_subdev() function
wasn't updated.
> I'm not opposed to change this to some other method that we would find.
> In any case, this is inside an inlined function. So, it is easy to
> replace the implementation to any other logic we find better. So,
> if you have a better idea, feel free to submit a followup patch
> optimizing it.
I was hoping you would propose a solution, as you've introduced the problem
:-) Any idea ?
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2016-02-16 0:33 UTC|newest]
Thread overview: 247+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-30 3:06 [PATCH v8 00/55] MC next generation patches Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 01/55] [media] media: create a macro to get entity ID Mauro Carvalho Chehab
2015-09-10 13:58 ` Javier Martinez Canillas
2015-12-06 3:20 ` Laurent Pinchart
2015-08-30 3:06 ` [PATCH v8 02/55] [media] staging: omap4iss: get entity ID using media_entity_id() Mauro Carvalho Chehab
2015-12-06 3:18 ` Laurent Pinchart
2015-12-07 15:24 ` Javier Martinez Canillas
2015-08-30 3:06 ` [PATCH v8 03/55] [media] omap3isp: " Mauro Carvalho Chehab
2015-08-31 10:10 ` Hans Verkuil
2015-12-06 3:16 ` Laurent Pinchart
2015-12-07 15:22 ` Javier Martinez Canillas
2015-08-30 3:06 ` [PATCH v8 04/55] [media] media: add a common struct to be embed on media graph objects Mauro Carvalho Chehab
2015-09-09 7:01 ` Sakari Ailus
2015-09-09 11:10 ` Mauro Carvalho Chehab
2015-09-10 14:02 ` Javier Martinez Canillas
2015-08-30 3:06 ` [PATCH v8 05/55] [media] media: use media_gobj inside entities Mauro Carvalho Chehab
2015-09-10 14:04 ` Javier Martinez Canillas
2015-08-30 3:06 ` [PATCH v8 06/55] [media] media: use media_gobj inside pads Mauro Carvalho Chehab
2015-09-09 7:37 ` Sakari Ailus
2015-09-10 14:09 ` Javier Martinez Canillas
2015-08-30 3:06 ` [PATCH v8 07/55] [media] media: use media_gobj inside links Mauro Carvalho Chehab
2015-09-10 14:10 ` Javier Martinez Canillas
2015-08-30 3:06 ` [PATCH v8 08/55] [media] media: add messages when media device gets (un)registered Mauro Carvalho Chehab
2015-09-10 14:12 ` Javier Martinez Canillas
2015-08-30 3:06 ` [PATCH v8 09/55] [media] media: add a debug message to warn about gobj creation/removal Mauro Carvalho Chehab
2015-09-10 14:14 ` Javier Martinez Canillas
2015-08-30 3:06 ` [PATCH v8 10/55] [media] media: rename the function that create pad links Mauro Carvalho Chehab
2015-09-10 14:16 ` Javier Martinez Canillas
2015-08-30 3:06 ` [PATCH v8 11/55] [media] media: use entity.graph_obj.mdev instead of .parent Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 12/55] [media] media: remove media entity .parent field Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 13/55] [media] uapi/media.h: Declare interface types for V4L2 and DVB Mauro Carvalho Chehab
2015-09-10 14:19 ` Javier Martinez Canillas
2015-08-30 3:06 ` [PATCH v8 14/55] [media] media: add functions to allow creating interfaces Mauro Carvalho Chehab
2015-08-31 10:20 ` Hans Verkuil
2015-08-31 10:49 ` Mauro Carvalho Chehab
2015-09-06 12:02 ` Mauro Carvalho Chehab
2015-09-09 7:34 ` Sakari Ailus
2015-09-09 10:00 ` Mauro Carvalho Chehab
2015-09-10 14:22 ` Javier Martinez Canillas
2015-09-11 12:57 ` Hans Verkuil
2015-12-08 14:36 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 15/55] [media] uapi/media.h: Declare interface types for ALSA Mauro Carvalho Chehab
2015-09-06 12:02 ` Mauro Carvalho Chehab
2015-09-10 14:23 ` Javier Martinez Canillas
2015-08-30 3:06 ` [PATCH v8 16/55] [media] media: Don't accept early-created links Mauro Carvalho Chehab
2015-08-31 10:30 ` Hans Verkuil
2015-08-31 10:54 ` Mauro Carvalho Chehab
2015-08-31 11:01 ` Hans Verkuil
2015-08-31 14:39 ` Javier Martinez Canillas
2015-08-31 15:05 ` Mauro Carvalho Chehab
2015-09-06 12:02 ` Mauro Carvalho Chehab
2015-12-06 3:13 ` Laurent Pinchart
2015-08-30 3:06 ` [PATCH v8 17/55] [media] omap3isp: separate links creation from entities init Mauro Carvalho Chehab
2015-11-23 15:55 ` Laurent Pinchart
2015-11-23 16:22 ` Javier Martinez Canillas
2015-08-30 3:06 ` [PATCH v8 18/55] [media] omap3isp: create links after all subdevs have been bound Mauro Carvalho Chehab
2015-09-09 8:03 ` Sakari Ailus
2015-09-09 8:48 ` Javier Martinez Canillas
2015-12-06 3:05 ` Laurent Pinchart
2015-12-07 15:17 ` Javier Martinez Canillas
2015-09-09 10:28 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 19/55] [media] media: convert links from array to list Mauro Carvalho Chehab
2015-09-04 8:41 ` Sakari Ailus
2015-09-04 9:00 ` Hans Verkuil
2015-09-04 11:10 ` Mauro Carvalho Chehab
2015-09-04 11:28 ` [PATCH v8.1 " Mauro Carvalho Chehab
2015-09-04 11:48 ` [PATCH v8.2 " Mauro Carvalho Chehab
2015-09-06 12:02 ` Mauro Carvalho Chehab
2015-11-23 15:37 ` Laurent Pinchart
2015-11-23 15:41 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 20/55] [media] media: make add link more generic Mauro Carvalho Chehab
2015-08-31 10:44 ` Hans Verkuil
2015-09-06 12:02 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 21/55] [media] media: make media_link more generic to handle interace links Mauro Carvalho Chehab
2015-08-31 10:44 ` Hans Verkuil
2015-09-06 12:02 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 22/55] [media] media: make link debug printk more generic Mauro Carvalho Chehab
2015-09-06 12:02 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 23/55] [media] media: add support to link interfaces and entities Mauro Carvalho Chehab
2015-08-31 10:48 ` Hans Verkuil
2015-09-06 12:02 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 24/55] [media] media-entity: add a helper function to create interface Mauro Carvalho Chehab
2015-08-31 10:49 ` Hans Verkuil
2015-09-06 12:02 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 25/55] [media] dvbdev: add support for interfaces Mauro Carvalho Chehab
2015-08-31 10:51 ` Hans Verkuil
2015-08-30 3:06 ` [PATCH v8 26/55] [media] media: add a linked list to track interfaces by mdev Mauro Carvalho Chehab
2015-08-31 10:52 ` Hans Verkuil
2015-09-06 12:02 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 27/55] [media] dvbdev: add support for indirect interface links Mauro Carvalho Chehab
2015-08-31 10:54 ` Hans Verkuil
2015-09-06 12:02 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 28/55] [media] uapi/media.h: Fix entity namespace Mauro Carvalho Chehab
2015-08-31 11:17 ` Hans Verkuil
2015-08-31 12:12 ` Mauro Carvalho Chehab
2015-09-06 12:02 ` Mauro Carvalho Chehab
2015-09-11 13:06 ` Hans Verkuil
2015-08-30 3:06 ` [PATCH v8 29/55] [media] replace all occurrences of MEDIA_ENT_T_DEVNODE_V4L Mauro Carvalho Chehab
2015-08-31 11:22 ` Hans Verkuil
2015-08-30 3:06 ` [PATCH v8 30/55] [media] replace all occurrences of MEDIA_ENT_T_DEVNODE_DVB Mauro Carvalho Chehab
2015-08-31 11:21 ` Hans Verkuil
2015-08-30 3:06 ` [PATCH v8 31/55] [media] media: add macros to check if subdev or V4L2 DMA Mauro Carvalho Chehab
2015-08-31 11:31 ` Hans Verkuil
2015-08-31 11:40 ` Hans Verkuil
2015-08-31 13:08 ` Mauro Carvalho Chehab
2015-08-31 13:46 ` Hans Verkuil
2015-09-06 12:02 ` Mauro Carvalho Chehab
2015-12-06 2:20 ` Laurent Pinchart
2015-12-08 15:41 ` Mauro Carvalho Chehab
2016-02-16 0:34 ` Laurent Pinchart [this message]
2015-08-30 3:06 ` [PATCH v8 32/55] [media] media: use macros to check for V4L2 subdev entities Mauro Carvalho Chehab
2015-10-11 21:07 ` Sakari Ailus
2015-10-12 0:56 ` Mauro Carvalho Chehab
2015-10-12 15:35 ` Sakari Ailus
2015-10-12 16:00 ` Mauro Carvalho Chehab
2015-12-08 15:57 ` Mauro Carvalho Chehab
2015-12-08 17:05 ` Mauro Carvalho Chehab
2015-12-08 17:08 ` Mauro Carvalho Chehab
2015-10-12 15:38 ` [PATCH 1/1] media: Correctly determine whether an entity is a sub-device Sakari Ailus
2015-10-12 15:58 ` Mauro Carvalho Chehab
2015-12-06 2:16 ` [PATCH v8 32/55] [media] media: use macros to check for V4L2 subdev entities Laurent Pinchart
2015-12-08 16:03 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 33/55] [media] omap3/omap4/davinci: get rid of MEDIA_ENT_T_V4L2_SUBDEV abuse Mauro Carvalho Chehab
2015-12-06 2:08 ` Laurent Pinchart
2015-12-08 16:52 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 34/55] [media] s5c73m3: fix subdev type Mauro Carvalho Chehab
2015-12-06 1:57 ` Laurent Pinchart
2015-12-08 17:11 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 35/55] [media] s5k5baf: " Mauro Carvalho Chehab
2015-12-06 1:55 ` Laurent Pinchart
2015-12-08 17:17 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 36/55] [media] davinci_vbpe: stop MEDIA_ENT_T_V4L2_SUBDEV abuse Mauro Carvalho Chehab
2015-12-06 1:52 ` Laurent Pinchart
2015-12-08 17:22 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 37/55] [media] omap4iss: " Mauro Carvalho Chehab
2015-12-06 1:46 ` Laurent Pinchart
2015-12-08 17:47 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 38/55] [media] v4l2-subdev: use MEDIA_ENT_T_UNKNOWN for new subdevs Mauro Carvalho Chehab
2015-08-31 11:43 ` Hans Verkuil
2015-09-06 12:02 ` Mauro Carvalho Chehab
2015-12-06 1:37 ` Laurent Pinchart
2015-12-08 17:38 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 39/55] [media] media controller: get rid of entity subtype on Kernel Mauro Carvalho Chehab
2015-08-31 11:44 ` Hans Verkuil
2015-09-06 12:02 ` Mauro Carvalho Chehab
2015-09-11 13:08 ` Hans Verkuil
2015-12-06 1:03 ` Laurent Pinchart
2015-08-30 3:06 ` [PATCH v8 40/55] [media] media.h: don't use legacy entity macros at Kernel Mauro Carvalho Chehab
2015-08-31 11:44 ` Hans Verkuil
2015-09-06 12:03 ` Mauro Carvalho Chehab
2015-12-06 1:02 ` Laurent Pinchart
2015-08-30 3:06 ` [PATCH v8 41/55] [media] DocBook: update descriptions for the media controller entities Mauro Carvalho Chehab
2015-08-31 11:22 ` Hans Verkuil
2015-09-06 12:03 ` Mauro Carvalho Chehab
2015-09-11 13:13 ` Hans Verkuil
2015-12-06 1:00 ` Laurent Pinchart
2015-12-08 18:04 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 42/55] [media] dvb: modify core to implement interfaces/entities at MC new gen Mauro Carvalho Chehab
2015-08-31 11:49 ` Hans Verkuil
2015-09-06 12:03 ` Mauro Carvalho Chehab
2015-09-11 13:51 ` Hans Verkuil
2015-08-30 3:06 ` [PATCH v8 43/55] [media] media: report if a pad is sink or source at debug msg Mauro Carvalho Chehab
2015-08-31 11:51 ` Hans Verkuil
2015-09-06 12:03 ` Mauro Carvalho Chehab
2015-09-11 13:52 ` Hans Verkuil
2015-12-06 0:53 ` Laurent Pinchart
2015-12-08 18:46 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 44/55] [media] uapi/media.h: Add MEDIA_IOC_G_TOPOLOGY ioctl Mauro Carvalho Chehab
2015-08-31 12:00 ` Hans Verkuil
2015-08-31 13:35 ` Mauro Carvalho Chehab
2015-09-06 12:03 ` Mauro Carvalho Chehab
2015-09-11 13:58 ` Hans Verkuil
2015-12-06 0:47 ` Laurent Pinchart
2015-12-08 19:23 ` Mauro Carvalho Chehab
2015-12-08 19:48 ` Arnd Bergmann
2015-08-30 3:06 ` [PATCH v8 45/55] [media] media: Use a macro to interate between all interfaces Mauro Carvalho Chehab
2015-08-31 12:01 ` Hans Verkuil
2015-09-06 12:03 ` Mauro Carvalho Chehab
2015-11-23 22:36 ` Laurent Pinchart
2015-08-30 3:06 ` [PATCH v8 46/55] [media] media: move mdev list init to gobj Mauro Carvalho Chehab
2015-08-31 12:03 ` Hans Verkuil
2015-09-06 12:03 ` Mauro Carvalho Chehab
2015-09-11 13:59 ` Hans Verkuil
2015-11-23 22:32 ` Laurent Pinchart
2015-12-08 19:31 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 47/55] [media] media-device: add pads and links to media_device Mauro Carvalho Chehab
2015-08-31 12:25 ` Hans Verkuil
2015-09-06 12:03 ` Mauro Carvalho Chehab
2015-11-23 22:28 ` Laurent Pinchart
2015-11-24 12:19 ` Mauro Carvalho Chehab
2015-08-30 3:06 ` [PATCH v8 48/55] [media] media_device: add a topology version field Mauro Carvalho Chehab
2015-08-31 12:29 ` Hans Verkuil
2015-08-31 12:52 ` Mauro Carvalho Chehab
2015-08-31 13:35 ` Hans Verkuil
2015-09-04 17:08 ` Mauro Carvalho Chehab
2015-11-23 22:18 ` Laurent Pinchart
2015-12-08 20:05 ` Mauro Carvalho Chehab
2015-11-23 22:20 ` Laurent Pinchart
2015-09-06 12:03 ` Mauro Carvalho Chehab
2015-09-11 13:59 ` Hans Verkuil
2015-08-30 3:07 ` [PATCH v8 49/55] [media] media-device: add support for MEDIA_IOC_G_TOPOLOGY ioctl Mauro Carvalho Chehab
2015-08-31 12:47 ` Hans Verkuil
2015-08-31 13:40 ` Mauro Carvalho Chehab
2015-08-31 13:48 ` Hans Verkuil
2015-09-06 12:03 ` Mauro Carvalho Chehab
2015-09-07 22:18 ` Sakari Ailus
2015-09-08 1:23 ` Mauro Carvalho Chehab
2015-09-08 7:26 ` Sakari Ailus
2015-09-08 10:49 ` Mauro Carvalho Chehab
2015-09-08 13:34 ` Sakari Ailus
2015-09-08 15:11 ` Mauro Carvalho Chehab
2015-09-11 14:08 ` Hans Verkuil
2015-12-08 20:20 ` Mauro Carvalho Chehab
2015-11-23 22:04 ` Laurent Pinchart
2015-12-08 20:17 ` Mauro Carvalho Chehab
2015-08-30 3:07 ` [PATCH v8 50/55] [media] media-entity: unregister entity links Mauro Carvalho Chehab
2015-08-31 12:48 ` Hans Verkuil
2015-09-06 12:03 ` Mauro Carvalho Chehab
2015-11-23 21:27 ` Laurent Pinchart
2015-12-08 20:23 ` Mauro Carvalho Chehab
2015-08-30 3:07 ` [PATCH v8 51/55] [media] remove interface links at media_entity_unregister() Mauro Carvalho Chehab
2015-08-31 12:53 ` Hans Verkuil
2015-08-31 13:42 ` Mauro Carvalho Chehab
2015-09-06 12:03 ` Mauro Carvalho Chehab
2015-09-11 14:18 ` Hans Verkuil
2015-08-30 3:07 ` [PATCH v8 52/55] [media] media-device: remove interfaces and interface links Mauro Carvalho Chehab
2015-08-31 12:57 ` Hans Verkuil
2015-09-06 12:03 ` Mauro Carvalho Chehab
2015-09-11 14:20 ` Hans Verkuil
2015-11-23 21:22 ` Laurent Pinchart
2015-12-09 13:39 ` Mauro Carvalho Chehab
2015-08-30 3:07 ` [PATCH v8 53/55] [media] v4l2-core: create MC interfaces for devnodes Mauro Carvalho Chehab
2015-08-31 13:23 ` Hans Verkuil
2015-09-04 16:13 ` Mauro Carvalho Chehab
2015-09-06 12:03 ` Mauro Carvalho Chehab
2015-09-11 14:38 ` Hans Verkuil
2015-11-23 21:10 ` Laurent Pinchart
2015-11-24 11:25 ` Mauro Carvalho Chehab
2015-08-30 3:07 ` [PATCH v8 54/55] [media] au0828: unregister MC at the end Mauro Carvalho Chehab
2015-08-31 13:25 ` Hans Verkuil
2015-09-04 22:24 ` Mauro Carvalho Chehab
2015-08-30 3:07 ` [PATCH v8 55/55] [media] media-entity.h: document all the structs Mauro Carvalho Chehab
2015-09-06 12:03 ` Mauro Carvalho Chehab
2015-09-11 14:45 ` Hans Verkuil
2015-11-23 20:19 ` Laurent Pinchart
2015-12-10 18:16 ` Mauro Carvalho Chehab
2015-08-30 14:27 ` [PATCH v8 00/55] MC next generation patches Mauro Carvalho Chehab
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8151381.MYthLnZLUV@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@osg.samsung.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).