Message ID | 20230619112707.239565-1-tomi.valkeinen@ideasonboard.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp2939833vqr; Mon, 19 Jun 2023 04:31:56 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4CpSXlA8+SFpSDBMWC5IrU0kBbF72oz8UTwMU6jFlZuguCpGutZLr62+eVQ1xFHJscHYRq X-Received: by 2002:a05:6830:1491:b0:6b4:6945:867d with SMTP id s17-20020a056830149100b006b46945867dmr2591212otq.9.1687174315960; Mon, 19 Jun 2023 04:31:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687174315; cv=none; d=google.com; s=arc-20160816; b=jhg6TkhLoJmrRn7CI3gPc1ULB37G2NbUlXCAkq9yNL8RoUFgbgsDnTqAYwlH9RCUGl 1oCQ2si/N2BhjHhR2fAF+ozLOWGXbQCDjD0oAQPm0oJcURGoJi/pmn+unxY22CY+R349 fhGZkeweEylEwwmGAt/yhUmmj67YlmgCfzLL+TrDw7BDpAuh0MtBa+p0sY+Jjug8hcPV jFEyHN7nE7VvFZT8ZZ2oGnVkB5njV19XpRtRCmlDytsFgdlUdCME6Cgpm1Pg0k0qzeva izXgnyzcDpyN7ul7K7EOu/fTo1Dqol6fbTPWMuMqm4F/eu8tURP2yRWuVd3OV/NnHrGR GbzQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=QGoV+p2U2JjfptTIQsLM0IarNYs008kHFSeefDMzwiA=; b=tKWovT51r4esSwEbA9NebK7fF4OSE/ytFBWaeS0jithm0sia0/ckh6iRT3KqrmSj2m Cfw/Hrj6+PAvuu71KlTyXY2+ssAGE6PclaHPC73y9jxWb3/r8FRR7a0to6QyZbdjJION hbPwRExVx1hbfpKPtxDDAisX6lmG+T8eBBQzP9zoC+2OesjqbMly/vi9NWCxmI+kttGK MQ64TkWwUxRd0ioNHHdi1+MkBq4ixZ5AoiycrWBRx7Y7/osYFTPEiZnJwkihhPw3ZIq9 eFas+Zxp2XYodwShVep4Tfw/BkHYbK7GeLNuSV6nF+1p2mDlsrGbxVPFs1pAkokw8euv lx+w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=ZF1xhfol; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id j63-20020a638b42000000b0054fd642ae84si11657558pge.561.2023.06.19.04.31.43; Mon, 19 Jun 2023 04:31:55 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=ZF1xhfol; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231500AbjFSL1a (ORCPT <rfc822;duw91626@gmail.com> + 99 others); Mon, 19 Jun 2023 07:27:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46602 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230293AbjFSL11 (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Mon, 19 Jun 2023 07:27:27 -0400 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7ACD810F; Mon, 19 Jun 2023 04:27:25 -0700 (PDT) Received: from desky.lan (91-154-35-171.elisa-laajakaista.fi [91.154.35.171]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 3D59AFB; Mon, 19 Jun 2023 13:26:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1687174009; bh=SKZE2foAuEiJpM0lv3kNXoNAKjM6FsyDumDBcf61Xvs=; h=From:To:Cc:Subject:Date:From; b=ZF1xhfol2ETOAkBHuhR8/KeNPrD0+8aql8U32pZdWdmLtitmvbN4/Ts/ld3X49toj bsV/UKVz4R3t7OB11GHOwHoZYDQntwySGsdDPALi8WSBW0tjWr1OCMpePzXtZi/Kj2 W1ddrcCS0M/mRKUHjd8D2tehqnxQneYVwKyOu+tY= From: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> To: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Mauro Carvalho Chehab <mchehab@kernel.org>, Sakari Ailus <sakari.ailus@linux.intel.com>, Laurent Pinchart <laurent.pinchart@ideasonboard.com>, Jacopo Mondi <jacopo.mondi@ideasonboard.com> Cc: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> Subject: [PATCH 1/3] media: subdev: Drop implicit zeroing of stream field Date: Mon, 19 Jun 2023 14:27:05 +0300 Message-Id: <20230619112707.239565-1-tomi.valkeinen@ideasonboard.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_PASS,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1769130495480769146?= X-GMAIL-MSGID: =?utf-8?q?1769130495480769146?= |
Series |
[1/3] media: subdev: Drop implicit zeroing of stream field
|
|
Commit Message
Tomi Valkeinen
June 19, 2023, 11:27 a.m. UTC
Now that the kernel drivers have been fixed to initialize the stream
field, and we have the client capability which the userspace uses to say
it has initialized the stream field, we can drop the implicit zeroing of
the stream field in the various check functions.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
drivers/media/v4l2-core/v4l2-subdev.c | 15 ---------------
1 file changed, 15 deletions(-)
Comments
Hi Tomi On Mon, Jun 19, 2023 at 02:27:05PM +0300, Tomi Valkeinen wrote: > Now that the kernel drivers have been fixed to initialize the stream > field, and we have the client capability which the userspace uses to say Not sure I got this. Isn't the capabilities flag intended for drivers to tell userspace it support streams ? This seems to suggest it is userspace setting it ? > it has initialized the stream field, we can drop the implicit zeroing of > the stream field in the various check functions. > I guess this is safe, but I'm not sure why it wasn't before. If a driver doesn't support streams (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) then it should have ignored the 'stream' field even if it wasn't zeroed. So I suspect I am missing the reason for zeroing in first place... > Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> > --- > drivers/media/v4l2-core/v4l2-subdev.c | 15 --------------- > 1 file changed, 15 deletions(-) > > diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c > index 2ec179cd1264..c1ac6d7a63d2 100644 > --- a/drivers/media/v4l2-core/v4l2-subdev.c > +++ b/drivers/media/v4l2-core/v4l2-subdev.c > @@ -200,9 +200,6 @@ static inline int check_format(struct v4l2_subdev *sd, > if (!format) > return -EINVAL; > > - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) > - format->stream = 0; > - > return check_which(format->which) ? : check_pad(sd, format->pad) ? : > check_state(sd, state, format->which, format->pad, format->stream); > } > @@ -230,9 +227,6 @@ static int call_enum_mbus_code(struct v4l2_subdev *sd, > if (!code) > return -EINVAL; > > - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) > - code->stream = 0; > - > return check_which(code->which) ? : check_pad(sd, code->pad) ? : > check_state(sd, state, code->which, code->pad, code->stream) ? : > sd->ops->pad->enum_mbus_code(sd, state, code); > @@ -245,9 +239,6 @@ static int call_enum_frame_size(struct v4l2_subdev *sd, > if (!fse) > return -EINVAL; > > - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) > - fse->stream = 0; > - > return check_which(fse->which) ? : check_pad(sd, fse->pad) ? : > check_state(sd, state, fse->which, fse->pad, fse->stream) ? : > sd->ops->pad->enum_frame_size(sd, state, fse); > @@ -283,9 +274,6 @@ static int call_enum_frame_interval(struct v4l2_subdev *sd, > if (!fie) > return -EINVAL; > > - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) > - fie->stream = 0; > - > return check_which(fie->which) ? : check_pad(sd, fie->pad) ? : > check_state(sd, state, fie->which, fie->pad, fie->stream) ? : > sd->ops->pad->enum_frame_interval(sd, state, fie); > @@ -298,9 +286,6 @@ static inline int check_selection(struct v4l2_subdev *sd, > if (!sel) > return -EINVAL; > > - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) > - sel->stream = 0; > - > return check_which(sel->which) ? : check_pad(sd, sel->pad) ? : > check_state(sd, state, sel->which, sel->pad, sel->stream); > } > -- > 2.34.1 >
On 17/07/2023 17:11, Jacopo Mondi wrote: > Hi Tomi > > On Mon, Jun 19, 2023 at 02:27:05PM +0300, Tomi Valkeinen wrote: >> Now that the kernel drivers have been fixed to initialize the stream >> field, and we have the client capability which the userspace uses to say > > Not sure I got this. Isn't the capabilities flag intended for drivers > to tell userspace it support streams ? This seems to suggest it is > userspace setting it ? Client capabilities tell the capabilities of the client. It's the new VIDIOC_SUBDEV_S_CLIENT_CAP/VIDIOC_SUBDEV_G_CLIENT_CAP ioctl. >> it has initialized the stream field, we can drop the implicit zeroing of >> the stream field in the various check functions. >> > > I guess this is safe, but I'm not sure why it wasn't before. If a > driver doesn't support streams (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) > then it should have ignored the 'stream' field even if it wasn't > zeroed. So I suspect I am missing the reason for zeroing in first > place... The code being removed here was a quick fix. The issue was that before we had the client capability flag for "userspace supports streams", the 'stream' field could contain garbage. Also some kernel drivers were not properly initializing struct v4l2_subdev_format to zero, so again the 'stream' field could contain garbage. The code removed here made sure that if a non-streams-supporting device was used, the 'stream' field would be zero as expected, and the v4l2 framework would not get confused by seeing a non-zero stream. The non-streams-enabled drivers themselves would not use the field anyway, of course, but the framework has code that expects the 'stream' to be zero (e.g. check_state() checks that stream == 0 if the device hasn't set V4L2_SUBDEV_FL_STREAMS). Now the kernel drivers have been fixed to initialize the struct properly, and we have the VIDIOC_SUBDEV_S_CLIENT_CAP to handle the userspace part. Thus this code is no longer needed, and, I think, just might confused the reader. And, in fact, I think it might hide an error. If a subdev is used that does not support streams, but the userspace supports streams. If the userspace uses an ioctl with stream != 0 for that subdev, it's clearly an error. However, with the code removed here, the error would go unnoticed as the kernel clears the stream field. Tomi >> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> >> --- >> drivers/media/v4l2-core/v4l2-subdev.c | 15 --------------- >> 1 file changed, 15 deletions(-) >> >> diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c >> index 2ec179cd1264..c1ac6d7a63d2 100644 >> --- a/drivers/media/v4l2-core/v4l2-subdev.c >> +++ b/drivers/media/v4l2-core/v4l2-subdev.c >> @@ -200,9 +200,6 @@ static inline int check_format(struct v4l2_subdev *sd, >> if (!format) >> return -EINVAL; >> >> - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) >> - format->stream = 0; >> - >> return check_which(format->which) ? : check_pad(sd, format->pad) ? : >> check_state(sd, state, format->which, format->pad, format->stream); >> } >> @@ -230,9 +227,6 @@ static int call_enum_mbus_code(struct v4l2_subdev *sd, >> if (!code) >> return -EINVAL; >> >> - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) >> - code->stream = 0; >> - >> return check_which(code->which) ? : check_pad(sd, code->pad) ? : >> check_state(sd, state, code->which, code->pad, code->stream) ? : >> sd->ops->pad->enum_mbus_code(sd, state, code); >> @@ -245,9 +239,6 @@ static int call_enum_frame_size(struct v4l2_subdev *sd, >> if (!fse) >> return -EINVAL; >> >> - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) >> - fse->stream = 0; >> - >> return check_which(fse->which) ? : check_pad(sd, fse->pad) ? : >> check_state(sd, state, fse->which, fse->pad, fse->stream) ? : >> sd->ops->pad->enum_frame_size(sd, state, fse); >> @@ -283,9 +274,6 @@ static int call_enum_frame_interval(struct v4l2_subdev *sd, >> if (!fie) >> return -EINVAL; >> >> - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) >> - fie->stream = 0; >> - >> return check_which(fie->which) ? : check_pad(sd, fie->pad) ? : >> check_state(sd, state, fie->which, fie->pad, fie->stream) ? : >> sd->ops->pad->enum_frame_interval(sd, state, fie); >> @@ -298,9 +286,6 @@ static inline int check_selection(struct v4l2_subdev *sd, >> if (!sel) >> return -EINVAL; >> >> - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) >> - sel->stream = 0; >> - >> return check_which(sel->which) ? : check_pad(sd, sel->pad) ? : >> check_state(sd, state, sel->which, sel->pad, sel->stream); >> } >> -- >> 2.34.1 >>
Hi Tomi On Mon, Jul 17, 2023 at 05:39:21PM +0300, Tomi Valkeinen wrote: > On 17/07/2023 17:11, Jacopo Mondi wrote: > > Hi Tomi > > > > On Mon, Jun 19, 2023 at 02:27:05PM +0300, Tomi Valkeinen wrote: > > > Now that the kernel drivers have been fixed to initialize the stream > > > field, and we have the client capability which the userspace uses to say > > > > Not sure I got this. Isn't the capabilities flag intended for drivers > > to tell userspace it support streams ? This seems to suggest it is > > userspace setting it ? > > Client capabilities tell the capabilities of the client. It's the new > VIDIOC_SUBDEV_S_CLIENT_CAP/VIDIOC_SUBDEV_G_CLIENT_CAP ioctl. > > > > it has initialized the stream field, we can drop the implicit zeroing of > > > the stream field in the various check functions. > > > > > > > I guess this is safe, but I'm not sure why it wasn't before. If a > > driver doesn't support streams (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) > > then it should have ignored the 'stream' field even if it wasn't > > zeroed. So I suspect I am missing the reason for zeroing in first > > place... > > The code being removed here was a quick fix. The issue was that before we > had the client capability flag for "userspace supports streams", the > 'stream' field could contain garbage. Also some kernel drivers were not > properly initializing struct v4l2_subdev_format to zero, so again the > 'stream' field could contain garbage. > > The code removed here made sure that if a non-streams-supporting device was > used, the 'stream' field would be zero as expected, and the v4l2 framework > would not get confused by seeing a non-zero stream. The non-streams-enabled > drivers themselves would not use the field anyway, of course, but the > framework has code that expects the 'stream' to be zero (e.g. check_state() > checks that stream == 0 if the device hasn't set V4L2_SUBDEV_FL_STREAMS). > > Now the kernel drivers have been fixed to initialize the struct properly, > and we have the VIDIOC_SUBDEV_S_CLIENT_CAP to handle the userspace part. > Thus this code is no longer needed, and, I think, just might confused the > reader. > > And, in fact, I think it might hide an error. If a subdev is used that does > not support streams, but the userspace supports streams. If the userspace > uses an ioctl with stream != 0 for that subdev, it's clearly an error. > However, with the code removed here, the error would go unnoticed as the > kernel clears the stream field. > Thanks for the clarifications! I admit I missed VIDIOC_SUBDEV_S_CLIENT_CAP! Now it makes sense Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Thanks j > Tomi > > > > Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> > > > --- > > > drivers/media/v4l2-core/v4l2-subdev.c | 15 --------------- > > > 1 file changed, 15 deletions(-) > > > > > > diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c > > > index 2ec179cd1264..c1ac6d7a63d2 100644 > > > --- a/drivers/media/v4l2-core/v4l2-subdev.c > > > +++ b/drivers/media/v4l2-core/v4l2-subdev.c > > > @@ -200,9 +200,6 @@ static inline int check_format(struct v4l2_subdev *sd, > > > if (!format) > > > return -EINVAL; > > > > > > - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) > > > - format->stream = 0; > > > - > > > return check_which(format->which) ? : check_pad(sd, format->pad) ? : > > > check_state(sd, state, format->which, format->pad, format->stream); > > > } > > > @@ -230,9 +227,6 @@ static int call_enum_mbus_code(struct v4l2_subdev *sd, > > > if (!code) > > > return -EINVAL; > > > > > > - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) > > > - code->stream = 0; > > > - > > > return check_which(code->which) ? : check_pad(sd, code->pad) ? : > > > check_state(sd, state, code->which, code->pad, code->stream) ? : > > > sd->ops->pad->enum_mbus_code(sd, state, code); > > > @@ -245,9 +239,6 @@ static int call_enum_frame_size(struct v4l2_subdev *sd, > > > if (!fse) > > > return -EINVAL; > > > > > > - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) > > > - fse->stream = 0; > > > - > > > return check_which(fse->which) ? : check_pad(sd, fse->pad) ? : > > > check_state(sd, state, fse->which, fse->pad, fse->stream) ? : > > > sd->ops->pad->enum_frame_size(sd, state, fse); > > > @@ -283,9 +274,6 @@ static int call_enum_frame_interval(struct v4l2_subdev *sd, > > > if (!fie) > > > return -EINVAL; > > > > > > - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) > > > - fie->stream = 0; > > > - > > > return check_which(fie->which) ? : check_pad(sd, fie->pad) ? : > > > check_state(sd, state, fie->which, fie->pad, fie->stream) ? : > > > sd->ops->pad->enum_frame_interval(sd, state, fie); > > > @@ -298,9 +286,6 @@ static inline int check_selection(struct v4l2_subdev *sd, > > > if (!sel) > > > return -EINVAL; > > > > > > - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) > > > - sel->stream = 0; > > > - > > > return check_which(sel->which) ? : check_pad(sd, sel->pad) ? : > > > check_state(sd, state, sel->which, sel->pad, sel->stream); > > > } > > > -- > > > 2.34.1 > > > >
diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c index 2ec179cd1264..c1ac6d7a63d2 100644 --- a/drivers/media/v4l2-core/v4l2-subdev.c +++ b/drivers/media/v4l2-core/v4l2-subdev.c @@ -200,9 +200,6 @@ static inline int check_format(struct v4l2_subdev *sd, if (!format) return -EINVAL; - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) - format->stream = 0; - return check_which(format->which) ? : check_pad(sd, format->pad) ? : check_state(sd, state, format->which, format->pad, format->stream); } @@ -230,9 +227,6 @@ static int call_enum_mbus_code(struct v4l2_subdev *sd, if (!code) return -EINVAL; - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) - code->stream = 0; - return check_which(code->which) ? : check_pad(sd, code->pad) ? : check_state(sd, state, code->which, code->pad, code->stream) ? : sd->ops->pad->enum_mbus_code(sd, state, code); @@ -245,9 +239,6 @@ static int call_enum_frame_size(struct v4l2_subdev *sd, if (!fse) return -EINVAL; - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) - fse->stream = 0; - return check_which(fse->which) ? : check_pad(sd, fse->pad) ? : check_state(sd, state, fse->which, fse->pad, fse->stream) ? : sd->ops->pad->enum_frame_size(sd, state, fse); @@ -283,9 +274,6 @@ static int call_enum_frame_interval(struct v4l2_subdev *sd, if (!fie) return -EINVAL; - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) - fie->stream = 0; - return check_which(fie->which) ? : check_pad(sd, fie->pad) ? : check_state(sd, state, fie->which, fie->pad, fie->stream) ? : sd->ops->pad->enum_frame_interval(sd, state, fie); @@ -298,9 +286,6 @@ static inline int check_selection(struct v4l2_subdev *sd, if (!sel) return -EINVAL; - if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS)) - sel->stream = 0; - return check_which(sel->which) ? : check_pad(sd, sel->pad) ? : check_state(sd, state, sel->which, sel->pad, sel->stream); }