From: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Pratyush Yadav <p.yadav@ti.com>,
Lokesh Vutla <lokeshvutla@ti.com>,
linux-media@vger.kernel.org
Subject: Re: [PATCH v3 33/38] media: ti-vpe: cal: add camerarx locking
Date: Mon, 7 Jun 2021 14:55:04 +0300 [thread overview]
Message-ID: <d204c557-2801-8710-23f9-cb385c9c21cf@ideasonboard.com> (raw)
In-Reply-To: <YLo1TGU/skvimy70@pendragon.ideasonboard.com>
On 04/06/2021 17:14, Laurent Pinchart wrote:
> Hi Tomi,
>
> Thank you for the patch.
>
> On Mon, May 24, 2021 at 02:09:04PM +0300, Tomi Valkeinen wrote:
>> We don't have any locking in camerarx for the subdev ops. We have
>> managed fine so far without locking, but in the future multiple video
>> capture devices can use the same camerarx, and locking is a must.
>>
>> Add a mutex to protect the camerarx subdev ops. Some of the functions
>> were slightly restructured to make lock handling cleaner.
>>
>> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
>> ---
>> drivers/media/platform/ti-vpe/cal-camerarx.c | 81 ++++++++++++++------
>> drivers/media/platform/ti-vpe/cal.h | 3 +
>> 2 files changed, 61 insertions(+), 23 deletions(-)
>>
>> diff --git a/drivers/media/platform/ti-vpe/cal-camerarx.c b/drivers/media/platform/ti-vpe/cal-camerarx.c
>> index 82392499e663..b87ffc52feb6 100644
>> --- a/drivers/media/platform/ti-vpe/cal-camerarx.c
>> +++ b/drivers/media/platform/ti-vpe/cal-camerarx.c
>> @@ -601,12 +601,18 @@ cal_camerarx_get_pad_format(struct cal_camerarx *phy,
>> static int cal_camerarx_sd_s_stream(struct v4l2_subdev *sd, int enable)
>> {
>> struct cal_camerarx *phy = to_cal_camerarx(sd);
>> + int r = 0;
>
> The driver uses ret :-)
...fine... ;)
>> +
>> + mutex_lock(&phy->mutex);
>>
>> if (enable)
>> - return cal_camerarx_start(phy);
>> + r = cal_camerarx_start(phy);
>> + else
>> + cal_camerarx_stop(phy);
>>
>> - cal_camerarx_stop(phy);
>> - return 0;
>> + mutex_unlock(&phy->mutex);
>> +
>> + return r;
>> }
>>
>> static int cal_camerarx_sd_enum_mbus_code(struct v4l2_subdev *sd,
>> @@ -614,27 +620,36 @@ static int cal_camerarx_sd_enum_mbus_code(struct v4l2_subdev *sd,
>> struct v4l2_subdev_mbus_code_enum *code)
>> {
>> struct cal_camerarx *phy = to_cal_camerarx(sd);
>> + int r = 0;
>> +
>> + mutex_lock(&phy->mutex);
>>
>> /* No transcoding, source and sink codes must match. */
>> if (code->pad == CAL_CAMERARX_PAD_SOURCE) {
>> struct v4l2_mbus_framefmt *fmt;
>>
>> - if (code->index > 0)
>> - return -EINVAL;
>> + if (code->index > 0) {
>> + r = -EINVAL;
>> + goto out;
>> + }
>>
>> fmt = cal_camerarx_get_pad_format(phy, sd_state,
>> CAL_CAMERARX_PAD_SINK,
>> code->which);
>> code->code = fmt->code;
>> - return 0;
>> - }
>> + } else {
>> + if (code->index >= cal_num_formats) {
>> + r = -EINVAL;
>> + goto out;
>> + }
>>
>> - if (code->index >= cal_num_formats)
>> - return -EINVAL;
>> + code->code = cal_formats[code->index].code;
>> + }
>>
>> - code->code = cal_formats[code->index].code;
>> +out:
>> + mutex_unlock(&phy->mutex);
>>
>> - return 0;
>> + return r;
>> }
>>
>> static int cal_camerarx_sd_enum_frame_size(struct v4l2_subdev *sd,
>> @@ -643,10 +658,13 @@ static int cal_camerarx_sd_enum_frame_size(struct v4l2_subdev *sd,
>> {
>> struct cal_camerarx *phy = to_cal_camerarx(sd);
>> const struct cal_format_info *fmtinfo;
>> + int r = 0;
>>
>> if (fse->index > 0)
>> return -EINVAL;
>>
>> + mutex_lock(&phy->mutex);
>> +
>> /* No transcoding, source and sink formats must match. */
>> if (fse->pad == CAL_CAMERARX_PAD_SOURCE) {
>> struct v4l2_mbus_framefmt *fmt;
>> @@ -654,27 +672,34 @@ static int cal_camerarx_sd_enum_frame_size(struct v4l2_subdev *sd,
>> fmt = cal_camerarx_get_pad_format(phy, sd_state,
>> CAL_CAMERARX_PAD_SINK,
>> fse->which);
>> - if (fse->code != fmt->code)
>> - return -EINVAL;
>> + if (fse->code != fmt->code) {
>> + r = -EINVAL;
>> + goto out;
>> + }
>>
>> fse->min_width = fmt->width;
>> fse->max_width = fmt->width;
>> fse->min_height = fmt->height;
>> fse->max_height = fmt->height;
>> + } else {
>> + fmtinfo = cal_format_by_code(fse->code);
>> + if (!fmtinfo) {
>> + r = -EINVAL;
>> + goto out;
>> + }
>>
>> - return 0;
>> + fse->min_width =
>> + CAL_MIN_WIDTH_BYTES * 8 / ALIGN(fmtinfo->bpp, 8);
>> + fse->max_width =
>> + CAL_MAX_WIDTH_BYTES * 8 / ALIGN(fmtinfo->bpp, 8);
>
> This is a case where I'd write
>
> fse->min_width = CAL_MIN_WIDTH_BYTES * 8
> / ALIGN(fmtinfo->bpp, 8);
> fse->max_width = CAL_MAX_WIDTH_BYTES * 8
> / ALIGN(fmtinfo->bpp, 8);
>
> or go slightly over 80 columns.
Yes. clang-format insist on formatting like that, and I haven't figured
out how to prevent it from moving everything to next line. It does that
for some function calls too.
And I'm often relying on clang-format, as my editor doesn't like mixed
spaces and tabs (googling shows that most of Internet hates mixed spaces
and tabs...).
But wouldn't the operator usually be left in the earlier line, i.e.
fse->min_width = CAL_MIN_WIDTH_BYTES * 8 /
ALIGN(fmtinfo->bpp, 8);
? That's how I would split it.
>> + fse->min_height = CAL_MIN_HEIGHT_LINES;
>> + fse->max_height = CAL_MAX_HEIGHT_LINES;
>> }
>>
>> - fmtinfo = cal_format_by_code(fse->code);
>> - if (!fmtinfo)
>> - return -EINVAL;
>> -
>> - fse->min_width = CAL_MIN_WIDTH_BYTES * 8 / ALIGN(fmtinfo->bpp, 8);
>> - fse->max_width = CAL_MAX_WIDTH_BYTES * 8 / ALIGN(fmtinfo->bpp, 8);
>> - fse->min_height = CAL_MIN_HEIGHT_LINES;
>> - fse->max_height = CAL_MAX_HEIGHT_LINES;
>> +out:
>> + mutex_unlock(&phy->mutex);
>>
>> - return 0;
>> + return r;
>> }
>>
>> static int cal_camerarx_sd_get_fmt(struct v4l2_subdev *sd,
>> @@ -684,10 +709,14 @@ static int cal_camerarx_sd_get_fmt(struct v4l2_subdev *sd,
>> struct cal_camerarx *phy = to_cal_camerarx(sd);
>> struct v4l2_mbus_framefmt *fmt;
>>
>> + mutex_lock(&phy->mutex);
>> +
>> fmt = cal_camerarx_get_pad_format(phy, sd_state, format->pad,
>> format->which);
>> format->format = *fmt;
>>
>> + mutex_unlock(&phy->mutex);
>> +
>> return 0;
>> }
>>
>> @@ -725,6 +754,8 @@ static int cal_camerarx_sd_set_fmt(struct v4l2_subdev *sd,
>> format->format.field = V4L2_FIELD_NONE;
>>
>> /* Store the format and propagate it to the source pad. */
>> + mutex_lock(&phy->mutex);
>> +
>> fmt = cal_camerarx_get_pad_format(phy, sd_state,
>> CAL_CAMERARX_PAD_SINK,
>> format->which);
>> @@ -735,6 +766,8 @@ static int cal_camerarx_sd_set_fmt(struct v4l2_subdev *sd,
>> format->which);
>> *fmt = format->format;
>>
>> + mutex_unlock(&phy->mutex);
>> +
>> return 0;
>> }
>>
>> @@ -801,6 +834,8 @@ struct cal_camerarx *cal_camerarx_create(struct cal_dev *cal,
>> phy->cal = cal;
>> phy->instance = instance;
>>
>> + mutex_init(&phy->mutex);
>
> A mutex_destroy() somewhere would be nice.
Right.
>> +
>> phy->res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
>> (instance == 0) ?
>> "cal_rx_core0" :
>> diff --git a/drivers/media/platform/ti-vpe/cal.h b/drivers/media/platform/ti-vpe/cal.h
>> index ad08c189ad3b..78bd2e041d9a 100644
>> --- a/drivers/media/platform/ti-vpe/cal.h
>> +++ b/drivers/media/platform/ti-vpe/cal.h
>> @@ -163,6 +163,9 @@ struct cal_camerarx {
>> struct v4l2_subdev subdev;
>> struct media_pad pads[2];
>> struct v4l2_mbus_framefmt formats[2];
>> +
>> + /* mutex for camerarx ops */
>> + struct mutex mutex;
>
> It's best when possible to list the fields protected by a lock, instead
> of the functions. It seems to be cal_camerarx.formats (but would need to
> be updated in subsequent patches).
I've added this.
Tomi
next prev parent reply other threads:[~2021-06-07 11:55 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-24 11:08 [PATCH v3 00/38] media: ti-vpe: cal: multistream & embedded data support Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 01/38] media: ti-vpe: cal: add g/s_parm for legacy API Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 02/38] media: ti-vpe: cal: fix error handling in cal_camerarx_create Tomi Valkeinen
2021-06-04 12:12 ` Laurent Pinchart
2021-05-24 11:08 ` [PATCH v3 03/38] media: ti-vpe: cal: remove unused cal_camerarx->dev field Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 04/38] media: ti-vpe: cal: rename "sensor" to "source" Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 05/38] media: ti-vpe: cal: move global config from cal_ctx_wr_dma_config to runtime resume Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 06/38] media: ti-vpe: cal: use v4l2_get_link_freq Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 07/38] media: ti-vpe: cal: add cal_ctx_prepare/unprepare Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 08/38] media: ti-vpe: cal: change index and cport to u8 Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 09/38] media: ti-vpe: cal: Add CSI2 context Tomi Valkeinen
2021-06-04 13:40 ` Laurent Pinchart
2021-05-24 11:08 ` [PATCH v3 10/38] media: ti-vpe: cal: Add pixel processing context Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 11/38] media: ti-vpe: cal: rename cal_ctx->index to dma_ctx Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 12/38] media: ti-vpe: cal: rename CAL_HL_IRQ_MASK Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 13/38] media: ti-vpe: cal: clean up CAL_CSI2_VC_IRQ_* macros Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 14/38] media: ti-vpe: cal: catch VC errors Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 15/38] media: ti-vpe: cal: remove wait when stopping camerarx Tomi Valkeinen
2021-06-04 13:43 ` Laurent Pinchart
2021-05-24 11:08 ` [PATCH v3 16/38] media: ti-vpe: cal: disable csi2 ctx and pix proc at ctx_stop Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 17/38] media: ti-vpe: cal: allocate pix proc dynamically Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 18/38] media: ti-vpe: cal: add 'use_pix_proc' field Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 19/38] media: ti-vpe: cal: add cal_ctx_wr_dma_enable and fix a race Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 20/38] media: ti-vpe: cal: add vc and datatype fields to cal_ctx Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 21/38] media: ti-vpe: cal: handle cal_ctx_v4l2_register error Tomi Valkeinen
2021-06-04 13:47 ` Laurent Pinchart
2021-06-07 7:44 ` Tomi Valkeinen
2021-06-07 8:00 ` Laurent Pinchart
2021-06-07 8:53 ` Tomi Valkeinen
2021-06-09 12:36 ` Laurent Pinchart
2021-06-09 14:07 ` Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 22/38] media: ti-vpe: cal: set field always to V4L2_FIELD_NONE Tomi Valkeinen
2021-06-04 13:48 ` Laurent Pinchart
2021-05-24 11:08 ` [PATCH v3 23/38] media: ti-vpe: cal: fix typo in a comment Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 24/38] media: ti-vpe: cal: add mbus_code support to cal_mc_enum_fmt_vid_cap Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 25/38] media: ti-vpe: cal: rename non-MC funcs to cal_legacy_* Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 26/38] media: ti-vpe: cal: init ctx->v_fmt correctly in MC mode Tomi Valkeinen
2021-06-04 13:51 ` Laurent Pinchart
2021-05-24 11:08 ` [PATCH v3 27/38] media: ti-vpe: cal: remove cal_camerarx->fmtinfo Tomi Valkeinen
2021-05-24 11:08 ` [PATCH v3 28/38] media: ti-vpe: cal: support 8 DMA contexts Tomi Valkeinen
2021-05-24 11:09 ` [PATCH v3 29/38] media: ti-vpe: cal: cleanup phy iteration in cal_remove Tomi Valkeinen
2021-06-04 13:52 ` Laurent Pinchart
2021-05-24 11:09 ` [PATCH v3 30/38] media: ti-vpe: cal: fix ctx uninitialization Tomi Valkeinen
2021-06-04 13:55 ` Laurent Pinchart
2021-05-24 11:09 ` [PATCH v3 31/38] media: ti-vpe: cal: fix queuing of the initial buffer Tomi Valkeinen
2021-06-04 13:57 ` Laurent Pinchart
2021-05-24 11:09 ` [PATCH v3 32/38] media: ti-vpe: cal: use CSI-2 frame number Tomi Valkeinen
2021-06-04 14:04 ` Laurent Pinchart
2021-06-07 12:39 ` Tomi Valkeinen
2021-06-07 13:42 ` Laurent Pinchart
2021-06-07 14:55 ` Tomi Valkeinen
2021-06-07 16:51 ` Laurent Pinchart
2021-06-08 7:38 ` Tomi Valkeinen
2021-06-08 12:46 ` Tomi Valkeinen
2021-06-09 12:47 ` Laurent Pinchart
2021-06-09 14:02 ` Tomi Valkeinen
2021-05-24 11:09 ` [PATCH v3 33/38] media: ti-vpe: cal: add camerarx locking Tomi Valkeinen
2021-06-04 14:14 ` Laurent Pinchart
2021-06-07 11:55 ` Tomi Valkeinen [this message]
2021-06-07 12:21 ` Laurent Pinchart
2021-05-24 11:09 ` [PATCH v3 34/38] media: ti-vpe: cal: add camerarx enable/disable refcounting Tomi Valkeinen
2021-06-04 14:16 ` Laurent Pinchart
2021-05-24 11:09 ` [PATCH v3 35/38] media: ti-vpe: cal: allow more than 1 source pads Tomi Valkeinen
2021-06-04 14:18 ` Laurent Pinchart
2021-05-24 11:09 ` [PATCH v3 36/38] media: ti-vpe: cal: add embedded data support Tomi Valkeinen
2021-05-24 11:09 ` [PATCH v3 37/38] media: ti-vpe: cal: use frame desc to get vc and dt Tomi Valkeinen
2021-06-04 14:25 ` Laurent Pinchart
2021-06-07 12:07 ` Tomi Valkeinen
2021-06-07 12:23 ` Laurent Pinchart
2021-05-24 11:09 ` [PATCH v3 38/38] media: ti-vpe: cal: add multiplexed streams support Tomi Valkeinen
2021-05-27 16:06 ` Pratyush Yadav
2021-05-27 16:10 ` Tomi Valkeinen
2021-05-27 16:30 ` Laurent Pinchart
2021-05-27 16:33 ` Tomi Valkeinen
2021-06-04 11:57 ` Laurent Pinchart
2021-06-06 16:14 ` Laurent Pinchart
2021-06-29 9:12 ` Tomi Valkeinen
2021-08-03 10:21 ` Pratyush Yadav
2021-08-03 14:51 ` Tomi Valkeinen
2021-08-03 16:27 ` Pratyush Yadav
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=d204c557-2801-8710-23f9-cb385c9c21cf@ideasonboard.com \
--to=tomi.valkeinen@ideasonboard.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=lokeshvutla@ti.com \
--cc=p.yadav@ti.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).