From nobody Wed Oct 8 09:04:35 2025 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 71AEE28C01F for ; Mon, 30 Jun 2025 14:20:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293233; cv=none; b=Uvve3Jziye3CZwdMF9e7l8cdDYhVfE8+EMitQb9cRTk2M+5Njk2pFbZOeI637lJ/SbpamcFeaYhdyNnevYAgUOX3cCOFwa++fyJ52ye5b/sJ8BChC25Nbn9VsP7eLtooDasscBcQ09l+1LWjdZZm6JDFNKwfri5F7xEchfTSPII= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293233; c=relaxed/simple; bh=ksdsuPOKtC1LX3xTsWx2D7Y+HomI7lOkC104d/s180U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jcd6Whd3wVfPcn9Gm20joZem9SKpgrp7phBrtrVRiVi6iwHyKp4c9ixf8b2RQReJUy0RezWwHAsIRtnQ6BHx3hb8ff5UteMZG6Ra6iehrqq16pmHIGg9nIlheYs8WdCG/ZUM/gb8Rc93WlGShRQMpSvYx11B6qHe/SXC9XgCZJU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=Re/JvJTA; arc=none smtp.client-ip=209.85.167.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Re/JvJTA" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-555024588a8so2228304e87.0 for ; Mon, 30 Jun 2025 07:20:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1751293228; x=1751898028; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=oAr8Ssh5T1mxHeb8g5LvgIUHQP1PrvIymeg1Z4t2fGg=; b=Re/JvJTAFhaJxX/fzk3JjBniu/V4Yw+dzbZptp6v7emh57kBSS6zuz2U8cosI8cCpD ToWWrXQRQZ33m6aZZKvf/i2ypTb6EhvwldHwsk3W0V6zRPfc4ibwjv/4sg4sxmNLry7V R/iYMe/ky1lhbn6vKaGSpDjBaKi0UnIk5Iz8I= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751293228; x=1751898028; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=oAr8Ssh5T1mxHeb8g5LvgIUHQP1PrvIymeg1Z4t2fGg=; b=j7phb4vYilwl6mmr7tJUD6ssMAJ5lYyTlJM6w9JEP+SZO82tg5y/lnntC3fH0VJxXo VnVomTbdCWFcCiwwclGZCzHsLf+DsgPDbdaViOz9DFm+irfXJlkusYkAuy9nmXLdJT5Z ukLzjg+vswfNRA2H0AZaAHANUaVTzKEIxVoEklFtolCto614B/mjUATFIwtizrrqSTL3 f9ClqalhxhmXXlJmUpeabdRjNn5elNYDDFQ5ysEGIzdOjEVB3u2qnb7SmJy8j80/8DS8 WUHA7NnlfYFRKheSgwDtNS4J828TkmR0Fs6GDMCO6nbfHEYkTC9RzrozU5w9e0BE6ReO WX7g== X-Forwarded-Encrypted: i=1; AJvYcCWgEd9OhwQWIMUoRpVb7UfAEBaSxhq3+yGNLTYh/17264H2Szp7BFuHi+/qJn4cShA/urBi4k1d8QslLnw=@vger.kernel.org X-Gm-Message-State: AOJu0YzrQpzH6zwt549QJ9V1eTwjvn5gjnspMEaPSTDe3MwzE3UpSplA wZAY+gFf0ZIrA64LvA8y9MPSBeGEpTwfojSuS29CFO6lY2P7n/qwZ0WlsuPT/vgj47ew3f8s8pq rs/EfWg== X-Gm-Gg: ASbGncs5J5uQl0kdg4Jwt1gwi2d5p7blCa119WtIfIWE6TQYf0VPD5gGyNbIQm+gvbV okRpbT7OZaKkVSG1/UC5woyKAn2iQm+JEv0SQdm3MktlYCpioSLNkwtZLmE0MNZQrDkDocVAk/7 asLRuFFT8Z1hs9Pt2gYEs8koqIFSgzb+ZoNOCJVwmkX1WWJh/ahL7+jjQMDAyLc+2xQPWtTCTFZ qrwMdeBk8mTt1G8NHqG7WkEJT2n9FHUdQSweWAif2KvBf49zXcJmDDVg+YnNMyRIXb0qdy6S9Jg XscJWjriaYEErSIDXABIS6en6P5zWuIp5x6Cynws33ELb4C2lfe1UhK2DZCPfbxtbY7zc6PfgnV zf9qcjzhM25hnFl1gPMsTt7vJXr6pXVNCi3IQoHhoYg== X-Google-Smtp-Source: AGHT+IFhbWSLBXKY/txsDqo24hJFKhZYuaccRDvP2jR6Wv+riMi/EJC4lfZCIEkOmywNIyq8bhDqyA== X-Received: by 2002:a05:6512:40d5:b0:553:37e7:867b with SMTP id 2adb3069b0e04-5550b9e5e0amr3381270e87.31.1751293228164; Mon, 30 Jun 2025 07:20:28 -0700 (PDT) Received: from ribalda.c.googlers.com (166.141.88.34.bc.googleusercontent.com. [34.88.141.166]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5550b2d8ea8sm1432363e87.210.2025.06.30.07.20.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Jun 2025 07:20:27 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 30 Jun 2025 14:20:26 +0000 Subject: [PATCH v3 1/8] media: uvcvideo: Use vb2 ioctl and fop helpers Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250630-uvc-grannular-invert-v3-1-abd5cb5c45b7@chromium.org> References: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> In-Reply-To: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans Verkuil , Hans de Goede , Hans de Goede Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans Verkuil X-Mailer: b4 0.14.2 From: Hans Verkuil When uvc was written the vb2 ioctl and file operation helpers didn't exist. This patch switches uvc over to those helpers, which removes a lot of boilerplate code and allows us to drop the 'privileges' scheme, since that's now handled inside the vb2 helpers. This makes it possible for uvc to fix the v4l2-compliance streaming tests: warn: v4l2-test-formats.cpp(1075): Could not set fmt2 This patch introduces a change on behavior on the uvcdriver to be aligned with the rest of the subsystem. Now S_INPUT, S_PARM and S_FORMAT do no grant exclusive ownership of the device. There are other side effects, some better than others: - Locking is now more coarse than before, the queue is locked for almost every ioctl. - vidioc_querybuf() can now work when the queue is busy. Future patches should look into the locking architecture of UVC to remove one of stream->mutex or queue->mutex. Reviewed-by: Hans de Goede Reviewed-by: Hans Verkuil Signed-off-by: Hans Verkuil Co-developed-by: Ricardo Ribalda Signed-off-by: Ricardo Ribalda Link: https://lore.kernel.org/r/20250616-uvc-fop-v4-1-250286570ee7@chromium= .org Signed-off-by: Hans de Goede --- drivers/media/usb/uvc/uvc_driver.c | 37 ++--- drivers/media/usb/uvc/uvc_metadata.c | 8 +- drivers/media/usb/uvc/uvc_queue.c | 143 -------------------- drivers/media/usb/uvc/uvc_v4l2.c | 252 +++----------------------------= ---- drivers/media/usb/uvc/uvcvideo.h | 36 +---- 5 files changed, 34 insertions(+), 442 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index 62eb45435d8bec5c955720ecb46fb8936871e6cc..accfb4ca3c72cb899185ddc8ecf= 4e29143d58fc6 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -1961,31 +1961,7 @@ static void uvc_unregister_video(struct uvc_device *= dev) if (!video_is_registered(&stream->vdev)) continue; =20 - /* - * For stream->vdev we follow the same logic as: - * vb2_video_unregister_device(). - */ - - /* 1. Take a reference to vdev */ - get_device(&stream->vdev.dev); - - /* 2. Ensure that no new ioctls can be called. */ - video_unregister_device(&stream->vdev); - - /* 3. Wait for old ioctls to finish. */ - mutex_lock(&stream->mutex); - - /* 4. Stop streaming. */ - uvc_queue_release(&stream->queue); - - mutex_unlock(&stream->mutex); - - put_device(&stream->vdev.dev); - - /* - * For stream->meta.vdev we can directly call: - * vb2_video_unregister_device(). - */ + vb2_video_unregister_device(&stream->vdev); vb2_video_unregister_device(&stream->meta.vdev); =20 /* @@ -2033,6 +2009,8 @@ int uvc_register_video_device(struct uvc_device *dev, vdev->ioctl_ops =3D ioctl_ops; vdev->release =3D uvc_release; vdev->prio =3D &stream->chain->prio; + vdev->queue =3D &queue->queue; + vdev->lock =3D &queue->mutex; if (type =3D=3D V4L2_BUF_TYPE_VIDEO_OUTPUT) vdev->vfl_dir =3D VFL_DIR_TX; else @@ -2397,9 +2375,12 @@ static int __uvc_resume(struct usb_interface *intf, = int reset) list_for_each_entry(stream, &dev->streams, list) { if (stream->intf =3D=3D intf) { ret =3D uvc_video_resume(stream, reset); - if (ret < 0) - uvc_queue_streamoff(&stream->queue, - stream->queue.queue.type); + if (ret < 0) { + mutex_lock(&stream->queue.mutex); + vb2_streamoff(&stream->queue.queue, + stream->queue.queue.type); + mutex_unlock(&stream->queue.mutex); + } return ret; } } diff --git a/drivers/media/usb/uvc/uvc_metadata.c b/drivers/media/usb/uvc/u= vc_metadata.c index 82de7781f5b6b70c5ba16bcba9e0741231231904..d3aab22f91cea21aefc56409924= dfa1451aec914 100644 --- a/drivers/media/usb/uvc/uvc_metadata.c +++ b/drivers/media/usb/uvc/uvc_metadata.c @@ -96,7 +96,7 @@ static int uvc_meta_v4l2_set_format(struct file *file, vo= id *fh, */ mutex_lock(&stream->mutex); =20 - if (uvc_queue_allocated(&stream->queue)) + if (vb2_is_busy(&stream->meta.queue.queue)) ret =3D -EBUSY; else stream->meta.format =3D fmt->dataformat; @@ -164,12 +164,6 @@ int uvc_meta_register(struct uvc_streaming *stream) =20 stream->meta.format =3D V4L2_META_FMT_UVC; =20 - /* - * The video interface queue uses manual locking and thus does not set - * the queue pointer. Set it manually here. - */ - vdev->queue =3D &queue->queue; - return uvc_register_video_device(dev, stream, vdev, queue, V4L2_BUF_TYPE_META_CAPTURE, &uvc_meta_fops, &uvc_meta_ioctl_ops); diff --git a/drivers/media/usb/uvc/uvc_queue.c b/drivers/media/usb/uvc/uvc_= queue.c index 2ee142621042167c2587b6a6fdd51c1a46d31c11..72c5494dee9f46ff61072e7d293= bfaddda40e615 100644 --- a/drivers/media/usb/uvc/uvc_queue.c +++ b/drivers/media/usb/uvc/uvc_queue.c @@ -242,153 +242,10 @@ int uvc_queue_init(struct uvc_video_queue *queue, en= um v4l2_buf_type type) return 0; } =20 -void uvc_queue_release(struct uvc_video_queue *queue) -{ - mutex_lock(&queue->mutex); - vb2_queue_release(&queue->queue); - mutex_unlock(&queue->mutex); -} - -/* -----------------------------------------------------------------------= ------ - * V4L2 queue operations - */ - -int uvc_request_buffers(struct uvc_video_queue *queue, - struct v4l2_requestbuffers *rb) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_reqbufs(&queue->queue, rb); - mutex_unlock(&queue->mutex); - - return ret ? ret : rb->count; -} - -int uvc_query_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *bu= f) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_querybuf(&queue->queue, buf); - mutex_unlock(&queue->mutex); - - return ret; -} - -int uvc_create_buffers(struct uvc_video_queue *queue, - struct v4l2_create_buffers *cb) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_create_bufs(&queue->queue, cb); - mutex_unlock(&queue->mutex); - - return ret; -} - -int uvc_queue_buffer(struct uvc_video_queue *queue, - struct media_device *mdev, struct v4l2_buffer *buf) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_qbuf(&queue->queue, mdev, buf); - mutex_unlock(&queue->mutex); - - return ret; -} - -int uvc_export_buffer(struct uvc_video_queue *queue, - struct v4l2_exportbuffer *exp) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_expbuf(&queue->queue, exp); - mutex_unlock(&queue->mutex); - - return ret; -} - -int uvc_dequeue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *= buf, - int nonblocking) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_dqbuf(&queue->queue, buf, nonblocking); - mutex_unlock(&queue->mutex); - - return ret; -} - -int uvc_queue_streamon(struct uvc_video_queue *queue, enum v4l2_buf_type t= ype) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_streamon(&queue->queue, type); - mutex_unlock(&queue->mutex); - - return ret; -} - -int uvc_queue_streamoff(struct uvc_video_queue *queue, enum v4l2_buf_type = type) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_streamoff(&queue->queue, type); - mutex_unlock(&queue->mutex); - - return ret; -} - -int uvc_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *v= ma) -{ - return vb2_mmap(&queue->queue, vma); -} - -#ifndef CONFIG_MMU -unsigned long uvc_queue_get_unmapped_area(struct uvc_video_queue *queue, - unsigned long pgoff) -{ - return vb2_get_unmapped_area(&queue->queue, 0, 0, pgoff, 0); -} -#endif - -__poll_t uvc_queue_poll(struct uvc_video_queue *queue, struct file *file, - poll_table *wait) -{ - __poll_t ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_poll(&queue->queue, file, wait); - mutex_unlock(&queue->mutex); - - return ret; -} - /* -----------------------------------------------------------------------= ------ * */ =20 -/* - * Check if buffers have been allocated. - */ -int uvc_queue_allocated(struct uvc_video_queue *queue) -{ - int allocated; - - mutex_lock(&queue->mutex); - allocated =3D vb2_is_busy(&queue->queue); - mutex_unlock(&queue->mutex); - - return allocated; -} - /* * Cancel the video buffers queue. * diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 1abdf1ea39956bbbadd3f166f37bdac518068648..d06ecf3418a988152c6c413568c= e32e60040fd87 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -47,8 +47,6 @@ void uvc_pm_put(struct uvc_device *dev) usb_autopm_put_interface(dev->intf); } =20 -static int uvc_acquire_privileges(struct uvc_fh *handle); - static int uvc_control_add_xu_mapping(struct uvc_video_chain *chain, struct uvc_control_mapping *map, const struct uvc_xu_control_mapping *xmap) @@ -436,10 +434,6 @@ static int uvc_ioctl_s_fmt(struct file *file, void *fh, const struct uvc_frame *frame; int ret; =20 - ret =3D uvc_acquire_privileges(handle); - if (ret < 0) - return ret; - if (fmt->type !=3D stream->type) return -EINVAL; =20 @@ -448,8 +442,7 @@ static int uvc_ioctl_s_fmt(struct file *file, void *fh, return ret; =20 mutex_lock(&stream->mutex); - - if (uvc_queue_allocated(&stream->queue)) { + if (vb2_is_busy(&stream->queue.queue)) { ret =3D -EBUSY; goto done; } @@ -513,10 +506,6 @@ static int uvc_ioctl_s_parm(struct file *file, void *f= h, unsigned int i; int ret; =20 - ret =3D uvc_acquire_privileges(handle); - if (ret < 0) - return ret; - if (parm->type !=3D stream->type) return -EINVAL; =20 @@ -593,63 +582,6 @@ static int uvc_ioctl_s_parm(struct file *file, void *f= h, return 0; } =20 -/* ------------------------------------------------------------------------ - * Privilege management - */ - -/* - * Privilege management is the multiple-open implementation basis. The cur= rent - * implementation is completely transparent for the end-user and doesn't - * require explicit use of the VIDIOC_G_PRIORITY and VIDIOC_S_PRIORITY ioc= tls. - * Those ioctls enable finer control on the device (by making possible for= a - * user to request exclusive access to a device), but are not mature yet. - * Switching to the V4L2 priority mechanism might be considered in the fut= ure - * if this situation changes. - * - * Each open instance of a UVC device can either be in a privileged or - * unprivileged state. Only a single instance can be in a privileged state= at - * a given time. Trying to perform an operation that requires privileges w= ill - * automatically acquire the required privileges if possible, or return -E= BUSY - * otherwise. Privileges are dismissed when closing the instance or when - * freeing the video buffers using VIDIOC_REQBUFS. - * - * Operations that require privileges are: - * - * - VIDIOC_S_INPUT - * - VIDIOC_S_PARM - * - VIDIOC_S_FMT - * - VIDIOC_CREATE_BUFS - * - VIDIOC_REQBUFS - */ -static int uvc_acquire_privileges(struct uvc_fh *handle) -{ - /* Always succeed if the handle is already privileged. */ - if (handle->state =3D=3D UVC_HANDLE_ACTIVE) - return 0; - - /* Check if the device already has a privileged handle. */ - if (atomic_inc_return(&handle->stream->active) !=3D 1) { - atomic_dec(&handle->stream->active); - return -EBUSY; - } - - handle->state =3D UVC_HANDLE_ACTIVE; - return 0; -} - -static void uvc_dismiss_privileges(struct uvc_fh *handle) -{ - if (handle->state =3D=3D UVC_HANDLE_ACTIVE) - atomic_dec(&handle->stream->active); - - handle->state =3D UVC_HANDLE_PASSIVE; -} - -static int uvc_has_privileges(struct uvc_fh *handle) -{ - return handle->state =3D=3D UVC_HANDLE_ACTIVE; -} - /* ------------------------------------------------------------------------ * V4L2 file operations */ @@ -671,7 +603,6 @@ static int uvc_v4l2_open(struct file *file) v4l2_fh_add(&handle->vfh); handle->chain =3D stream->chain; handle->stream =3D stream; - handle->state =3D UVC_HANDLE_PASSIVE; file->private_data =3D handle; =20 return 0; @@ -686,19 +617,11 @@ static int uvc_v4l2_release(struct file *file) =20 uvc_ctrl_cleanup_fh(handle); =20 - /* Only free resources if this is a privileged handle. */ - if (uvc_has_privileges(handle)) - uvc_queue_release(&stream->queue); - if (handle->is_streaming) uvc_pm_put(stream->dev); =20 /* Release the file handle. */ - uvc_dismiss_privileges(handle); - v4l2_fh_del(&handle->vfh); - v4l2_fh_exit(&handle->vfh); - kfree(handle); - file->private_data =3D NULL; + vb2_fop_release(file); =20 return 0; } @@ -753,91 +676,6 @@ static int uvc_ioctl_try_fmt(struct file *file, void *= fh, return uvc_v4l2_try_format(stream, fmt, &probe, NULL, NULL); } =20 -static int uvc_ioctl_reqbufs(struct file *file, void *fh, - struct v4l2_requestbuffers *rb) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - int ret; - - ret =3D uvc_acquire_privileges(handle); - if (ret < 0) - return ret; - - mutex_lock(&stream->mutex); - ret =3D uvc_request_buffers(&stream->queue, rb); - mutex_unlock(&stream->mutex); - if (ret < 0) - return ret; - - if (ret =3D=3D 0) - uvc_dismiss_privileges(handle); - - return 0; -} - -static int uvc_ioctl_querybuf(struct file *file, void *fh, - struct v4l2_buffer *buf) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - - if (!uvc_has_privileges(handle)) - return -EBUSY; - - return uvc_query_buffer(&stream->queue, buf); -} - -static int uvc_ioctl_qbuf(struct file *file, void *fh, struct v4l2_buffer = *buf) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - - if (!uvc_has_privileges(handle)) - return -EBUSY; - - return uvc_queue_buffer(&stream->queue, - stream->vdev.v4l2_dev->mdev, buf); -} - -static int uvc_ioctl_expbuf(struct file *file, void *fh, - struct v4l2_exportbuffer *exp) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - - if (!uvc_has_privileges(handle)) - return -EBUSY; - - return uvc_export_buffer(&stream->queue, exp); -} - -static int uvc_ioctl_dqbuf(struct file *file, void *fh, struct v4l2_buffer= *buf) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - - if (!uvc_has_privileges(handle)) - return -EBUSY; - - return uvc_dequeue_buffer(&stream->queue, buf, - file->f_flags & O_NONBLOCK); -} - -static int uvc_ioctl_create_bufs(struct file *file, void *fh, - struct v4l2_create_buffers *cb) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - int ret; - - ret =3D uvc_acquire_privileges(handle); - if (ret < 0) - return ret; - - return uvc_create_buffers(&stream->queue, cb); -} - static int uvc_ioctl_streamon(struct file *file, void *fh, enum v4l2_buf_type type) { @@ -845,11 +683,6 @@ static int uvc_ioctl_streamon(struct file *file, void = *fh, struct uvc_streaming *stream =3D handle->stream; int ret; =20 - if (!uvc_has_privileges(handle)) - return -EBUSY; - - guard(mutex)(&stream->mutex); - if (handle->is_streaming) return 0; =20 @@ -857,7 +690,7 @@ static int uvc_ioctl_streamon(struct file *file, void *= fh, if (ret) return ret; =20 - ret =3D uvc_queue_streamon(&stream->queue, type); + ret =3D vb2_ioctl_streamon(file, fh, type); if (ret) { uvc_pm_put(stream->dev); return ret; @@ -873,13 +706,12 @@ static int uvc_ioctl_streamoff(struct file *file, voi= d *fh, { struct uvc_fh *handle =3D fh; struct uvc_streaming *stream =3D handle->stream; + int ret; =20 - if (!uvc_has_privileges(handle)) - return -EBUSY; - - guard(mutex)(&stream->mutex); + ret =3D vb2_ioctl_streamoff(file, fh, type); + if (ret) + return ret; =20 - uvc_queue_streamoff(&stream->queue, type); if (handle->is_streaming) { handle->is_streaming =3D false; uvc_pm_put(stream->dev); @@ -962,13 +794,13 @@ static int uvc_ioctl_g_input(struct file *file, void = *fh, unsigned int *input) static int uvc_ioctl_s_input(struct file *file, void *fh, unsigned int inp= ut) { struct uvc_fh *handle =3D fh; + struct uvc_streaming *stream =3D handle->stream; struct uvc_video_chain *chain =3D handle->chain; u8 *buf; int ret; =20 - ret =3D uvc_acquire_privileges(handle); - if (ret < 0) - return ret; + if (vb2_is_busy(&stream->queue.queue)) + return -EBUSY; =20 if (chain->selector =3D=3D NULL || (chain->dev->quirks & UVC_QUIRK_IGNORE_SELECTOR_UNIT)) { @@ -1469,50 +1301,6 @@ static long uvc_v4l2_unlocked_ioctl(struct file *fil= e, return ret; } =20 -static ssize_t uvc_v4l2_read(struct file *file, char __user *data, - size_t count, loff_t *ppos) -{ - struct uvc_fh *handle =3D file->private_data; - struct uvc_streaming *stream =3D handle->stream; - - uvc_dbg(stream->dev, CALLS, "%s: not implemented\n", __func__); - return -EINVAL; -} - -static int uvc_v4l2_mmap(struct file *file, struct vm_area_struct *vma) -{ - struct uvc_fh *handle =3D file->private_data; - struct uvc_streaming *stream =3D handle->stream; - - uvc_dbg(stream->dev, CALLS, "%s\n", __func__); - - return uvc_queue_mmap(&stream->queue, vma); -} - -static __poll_t uvc_v4l2_poll(struct file *file, poll_table *wait) -{ - struct uvc_fh *handle =3D file->private_data; - struct uvc_streaming *stream =3D handle->stream; - - uvc_dbg(stream->dev, CALLS, "%s\n", __func__); - - return uvc_queue_poll(&stream->queue, file, wait); -} - -#ifndef CONFIG_MMU -static unsigned long uvc_v4l2_get_unmapped_area(struct file *file, - unsigned long addr, unsigned long len, unsigned long pgoff, - unsigned long flags) -{ - struct uvc_fh *handle =3D file->private_data; - struct uvc_streaming *stream =3D handle->stream; - - uvc_dbg(stream->dev, CALLS, "%s\n", __func__); - - return uvc_queue_get_unmapped_area(&stream->queue, pgoff); -} -#endif - const struct v4l2_ioctl_ops uvc_ioctl_ops =3D { .vidioc_g_fmt_vid_cap =3D uvc_ioctl_g_fmt, .vidioc_g_fmt_vid_out =3D uvc_ioctl_g_fmt, @@ -1525,12 +1313,13 @@ const struct v4l2_ioctl_ops uvc_ioctl_ops =3D { .vidioc_enum_fmt_vid_out =3D uvc_ioctl_enum_fmt, .vidioc_try_fmt_vid_cap =3D uvc_ioctl_try_fmt, .vidioc_try_fmt_vid_out =3D uvc_ioctl_try_fmt, - .vidioc_reqbufs =3D uvc_ioctl_reqbufs, - .vidioc_querybuf =3D uvc_ioctl_querybuf, - .vidioc_qbuf =3D uvc_ioctl_qbuf, - .vidioc_expbuf =3D uvc_ioctl_expbuf, - .vidioc_dqbuf =3D uvc_ioctl_dqbuf, - .vidioc_create_bufs =3D uvc_ioctl_create_bufs, + .vidioc_reqbufs =3D vb2_ioctl_reqbufs, + .vidioc_querybuf =3D vb2_ioctl_querybuf, + .vidioc_prepare_buf =3D vb2_ioctl_prepare_buf, + .vidioc_qbuf =3D vb2_ioctl_qbuf, + .vidioc_expbuf =3D vb2_ioctl_expbuf, + .vidioc_dqbuf =3D vb2_ioctl_dqbuf, + .vidioc_create_bufs =3D vb2_ioctl_create_bufs, .vidioc_streamon =3D uvc_ioctl_streamon, .vidioc_streamoff =3D uvc_ioctl_streamoff, .vidioc_enum_input =3D uvc_ioctl_enum_input, @@ -1557,11 +1346,10 @@ const struct v4l2_file_operations uvc_fops =3D { #ifdef CONFIG_COMPAT .compat_ioctl32 =3D uvc_v4l2_compat_ioctl32, #endif - .read =3D uvc_v4l2_read, - .mmap =3D uvc_v4l2_mmap, - .poll =3D uvc_v4l2_poll, + .mmap =3D vb2_fop_mmap, + .poll =3D vb2_fop_poll, #ifndef CONFIG_MMU - .get_unmapped_area =3D uvc_v4l2_get_unmapped_area, + .get_unmapped_area =3D vb2_fop_get_unmapped_area, #endif }; =20 diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 11d6e3c2ebdfbabd7bbe5722f88ff85f406d9bb6..b300487e6ec9163ac8236803b9e= 819814233f419 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -328,7 +328,10 @@ struct uvc_buffer { =20 struct uvc_video_queue { struct vb2_queue queue; - struct mutex mutex; /* Protects queue */ + struct mutex mutex; /* + * Serializes vb2_queue and + * fops + */ =20 unsigned int flags; unsigned int buf_used; @@ -621,16 +624,10 @@ struct uvc_device { struct uvc_entity *gpio_unit; }; =20 -enum uvc_handle_state { - UVC_HANDLE_PASSIVE =3D 0, - UVC_HANDLE_ACTIVE =3D 1, -}; - struct uvc_fh { struct v4l2_fh vfh; struct uvc_video_chain *chain; struct uvc_streaming *stream; - enum uvc_handle_state state; unsigned int pending_async_ctrls; bool is_streaming; }; @@ -689,36 +686,11 @@ struct uvc_entity *uvc_entity_by_id(struct uvc_device= *dev, int id); =20 /* Video buffers queue management. */ int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type); -void uvc_queue_release(struct uvc_video_queue *queue); -int uvc_request_buffers(struct uvc_video_queue *queue, - struct v4l2_requestbuffers *rb); -int uvc_query_buffer(struct uvc_video_queue *queue, - struct v4l2_buffer *v4l2_buf); -int uvc_create_buffers(struct uvc_video_queue *queue, - struct v4l2_create_buffers *v4l2_cb); -int uvc_queue_buffer(struct uvc_video_queue *queue, - struct media_device *mdev, - struct v4l2_buffer *v4l2_buf); -int uvc_export_buffer(struct uvc_video_queue *queue, - struct v4l2_exportbuffer *exp); -int uvc_dequeue_buffer(struct uvc_video_queue *queue, - struct v4l2_buffer *v4l2_buf, int nonblocking); -int uvc_queue_streamon(struct uvc_video_queue *queue, enum v4l2_buf_type t= ype); -int uvc_queue_streamoff(struct uvc_video_queue *queue, enum v4l2_buf_type = type); void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect); struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue, struct uvc_buffer *buf); struct uvc_buffer *uvc_queue_get_current_buffer(struct uvc_video_queue *qu= eue); void uvc_queue_buffer_release(struct uvc_buffer *buf); -int uvc_queue_mmap(struct uvc_video_queue *queue, - struct vm_area_struct *vma); -__poll_t uvc_queue_poll(struct uvc_video_queue *queue, struct file *file, - poll_table *wait); -#ifndef CONFIG_MMU -unsigned long uvc_queue_get_unmapped_area(struct uvc_video_queue *queue, - unsigned long pgoff); -#endif -int uvc_queue_allocated(struct uvc_video_queue *queue); static inline int uvc_queue_streaming(struct uvc_video_queue *queue) { return vb2_is_streaming(&queue->queue); --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Wed Oct 8 09:04:35 2025 Received: from mail-lf1-f45.google.com (mail-lf1-f45.google.com [209.85.167.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C35FE28C02D for ; Mon, 30 Jun 2025 14:20:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293232; cv=none; b=l+jBx4qKhk6SX8Q1MfuNIL4mFOBhP/aETc2aj5DG5ApN6nQd8NSWxd+XiUaEa1fikc/8R5hKhwBehmNCjC0nBPNE//A31RVbYrbOtuEgpdu7YgD+odcs9xFwDlW5xde2FGagAYVTYPexG+1AV0ni5kbdD1+m1RA6sMzRS7zRk30= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293232; c=relaxed/simple; bh=yqUXUVprqc4Kpn+kWKnhx6hx/ZsxT0W1igC+YxtmoeU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eGZreR0XaYYpUobCoEL7XHYIjrH2HKRCnVaak7HDNlDXOkCk0jQvosFKa+K4/mIEKVXy5MwLTTWcMF8mXuOJcRypBzLcis0Qeoxb8xIE08spJkqHRKAJqy4wtaGaLWxhWqa41Xvfe8CkxWrLNPDkaXcmqhX1tG4R3J9eIv2vXs4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=JDFYD35E; arc=none smtp.client-ip=209.85.167.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="JDFYD35E" Received: by mail-lf1-f45.google.com with SMTP id 2adb3069b0e04-553b6a349ccso2417620e87.0 for ; Mon, 30 Jun 2025 07:20:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1751293229; x=1751898029; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=XrE6GNKbVHGpnk0TTosO+XCb4jgeJmiva3zLbz/vTGo=; b=JDFYD35EU0sB6tAYVvw5+pubhRD3aQoWVVcapSQnqxwuDdThx+3RJBWSDrvhZjhFew fAZyQQuYAemqrb/GCp2hGuqe5EW1/DZM4uZOr6jcE4aWWDV4ODUVHqViTrBd0r/T+KwL E1oV7Lq/REP+GQo5V2pg2hjmDCk+UaE4N30mg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751293229; x=1751898029; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=XrE6GNKbVHGpnk0TTosO+XCb4jgeJmiva3zLbz/vTGo=; b=BFRSqr5hcZ6MvUB6RnkI0IdIG61OcIK9ypvZXi2FXSYQtOVrlx/xQBhgQ1qIuhE7Dd vrJu9do0Mk9m/x9xIyHFfoks9ZMRgKCLByBQhw6ALGihC02LdMLq6MGHQeAmMs/mx/ug NdN9vhxkJrlJTanvLh600syuiZE/MEXMjYGzEl5Uc85ul2DSoIEIWsLWsN8M4SoSYuIA mhlmLMPMvs9/HsVpKBiPhUV0ac59WUtzczQTPU8M2epRti4G9bGD27u2h2t1PZZVZcTV QbMyzJH9ZrQkBe7ETJITqz/d+r01KF8gam9X3E3I6sMZoMuobUoqjfXfLXHxOe75Y3pP aRBg== X-Forwarded-Encrypted: i=1; AJvYcCXLPIchCDeY0m/5se1jNBlxeuufEGBaY46tpTTlZWQvV7HFWH4JcxtnqhPG+PtlTiZED+w/p/naXPBdwu8=@vger.kernel.org X-Gm-Message-State: AOJu0YynyYsc0bQivkX+2jI6QgVlW/0s4Xq1YwkgGkLooyhzYyUl6Q3B 3FoBspZo/wcRwKT9MBUiXpf+GnLEFuDiI40tFQyXY9br8GjOe2aDG13Ctcj0cQvZbgHJT6t6AbF EuY5gVg== X-Gm-Gg: ASbGncueWk9hYA+h3JCULKPd0IewckX3b5CtCD+fBHo3KPkyP5xVhQMTLsO/CSpsCp3 4q6lyku7M4ltRUHqRlIEuPTyc2ecco31uZrINEEsS3r4+fAISQCgU7usjnAQg2/fp9sTE2sSoNO J4vL0Gv1/ewPT6wBQWlJAFRpVZWGDoCb2es6NCcdFiHyGuk0ha0qWdBil1vjGn9vaqHE8LLFBh1 DoHvMOVr6Bsof+MuKUdCL9Rh12DITik90A1PGQNMyfvMPn5DdnU6cQIr8kOEOt/MoTod7ytAiLB wGKp2vMH24SZ3NCOtZLvvqF4wDXpTDJ38NRNxuwEzNQDKB/SnhxnNDg1NIJPjKUpeARt11y3UGj FJrrZ3JvEx10nDHbmc22afYPSRH9U4daW/Y0h1EGeMg== X-Google-Smtp-Source: AGHT+IEYOZRia/C4/fIWKkA+Jh26ufRFDX2YpNeZrNnPKtM6B8Dh625OcdfNpk8ik/bJrSc3cPZY8Q== X-Received: by 2002:a05:6512:3b96:b0:553:26f6:bbfd with SMTP id 2adb3069b0e04-5550b7e6e65mr4165857e87.8.1751293228668; Mon, 30 Jun 2025 07:20:28 -0700 (PDT) Received: from ribalda.c.googlers.com (166.141.88.34.bc.googleusercontent.com. [34.88.141.166]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5550b2d8ea8sm1432363e87.210.2025.06.30.07.20.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Jun 2025 07:20:28 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 30 Jun 2025 14:20:27 +0000 Subject: [PATCH v3 2/8] media: uvcvideo: Handle locks in uvc_queue_return_buffers Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250630-uvc-grannular-invert-v3-2-abd5cb5c45b7@chromium.org> References: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> In-Reply-To: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans Verkuil , Hans de Goede , Hans de Goede Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.2 Most of the calls to uvc_queue_return_buffers() wrap the call with spin_lock_irq()/spin_unlock_irq(). Rename uvc_queue_return_buffers to __uvc_queue_return_buffers to indicate that this is the version that does not handle locks and create a new version of the function that handles the lock. Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda Link: https://lore.kernel.org/r/20250616-uvc-fop-v4-2-250286570ee7@chromium= .org Reviewed-by: Hans Verkuil Signed-off-by: Hans de Goede --- drivers/media/usb/uvc/uvc_queue.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_queue.c b/drivers/media/usb/uvc/uvc_= queue.c index 72c5494dee9f46ff61072e7d293bfaddda40e615..8f9737ac729546683ca48f5e71c= e3dfacbae2926 100644 --- a/drivers/media/usb/uvc/uvc_queue.c +++ b/drivers/media/usb/uvc/uvc_queue.c @@ -42,13 +42,15 @@ static inline struct uvc_buffer *uvc_vbuf_to_buffer(str= uct vb2_v4l2_buffer *buf) * * This function must be called with the queue spinlock held. */ -static void uvc_queue_return_buffers(struct uvc_video_queue *queue, - enum uvc_buffer_state state) +static void __uvc_queue_return_buffers(struct uvc_video_queue *queue, + enum uvc_buffer_state state) { enum vb2_buffer_state vb2_state =3D state =3D=3D UVC_BUF_STATE_ERROR ? VB2_BUF_STATE_ERROR : VB2_BUF_STATE_QUEUED; =20 + lockdep_assert_held(&queue->irqlock); + while (!list_empty(&queue->irqqueue)) { struct uvc_buffer *buf =3D list_first_entry(&queue->irqqueue, struct uvc_buffer, @@ -59,6 +61,14 @@ static void uvc_queue_return_buffers(struct uvc_video_qu= eue *queue, } } =20 +static void uvc_queue_return_buffers(struct uvc_video_queue *queue, + enum uvc_buffer_state state) +{ + spin_lock_irq(&queue->irqlock); + __uvc_queue_return_buffers(queue, state); + spin_unlock_irq(&queue->irqlock); +} + /* -----------------------------------------------------------------------= ------ * videobuf2 queue operations */ @@ -171,9 +181,7 @@ static int uvc_start_streaming(struct vb2_queue *vq, un= signed int count) if (ret =3D=3D 0) return 0; =20 - spin_lock_irq(&queue->irqlock); uvc_queue_return_buffers(queue, UVC_BUF_STATE_QUEUED); - spin_unlock_irq(&queue->irqlock); =20 return ret; } @@ -187,9 +195,7 @@ static void uvc_stop_streaming(struct vb2_queue *vq) if (vq->type !=3D V4L2_BUF_TYPE_META_CAPTURE) uvc_video_stop_streaming(uvc_queue_to_stream(queue)); =20 - spin_lock_irq(&queue->irqlock); uvc_queue_return_buffers(queue, UVC_BUF_STATE_ERROR); - spin_unlock_irq(&queue->irqlock); } =20 static const struct vb2_ops uvc_queue_qops =3D { @@ -263,7 +269,7 @@ void uvc_queue_cancel(struct uvc_video_queue *queue, in= t disconnect) unsigned long flags; =20 spin_lock_irqsave(&queue->irqlock, flags); - uvc_queue_return_buffers(queue, UVC_BUF_STATE_ERROR); + __uvc_queue_return_buffers(queue, UVC_BUF_STATE_ERROR); /* * This must be protected by the irqlock spinlock to avoid race * conditions between uvc_buffer_queue and the disconnection event that --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Wed Oct 8 09:04:35 2025 Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4217628C037 for ; Mon, 30 Jun 2025 14:20:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293233; cv=none; b=sd0IZxOQz/TLUb/IV8AsGfrO0ucrw6tLfaNEWvTBTLhWvIp1FWMi6HJEBgl9sMW6kk0SrqAtAMUE0PuS1Q7EbIo8t324MmuKdAOalqtyIBpO8N+j472w+fIB7ZdRr6OZqo9lVNooCyqO+q60jKZIqvnQWZC5PQBwMsrwYm8fIYA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293233; c=relaxed/simple; bh=jhmtrOZynF97yPTl8KLNDy4e5vqCIcVcQhtc4QKka7E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XtfOWKq/mdiNkToQZP8fnwiRtRoDDsxQDR9Gc6VEZ9uD1QUPeAFG4sWLFZK1yDZ1+vGEM+oPkwRwbuzqpUdeenjKs1znCFhtcTxYWr3z/GhhQlwp3k4QfrPoxzMdzTWyfdCVIPQV8y70JqtyCu3hIhPHrZOJMWljNA3ZTYZRXgU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=jtE9OauB; arc=none smtp.client-ip=209.85.167.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="jtE9OauB" Received: by mail-lf1-f43.google.com with SMTP id 2adb3069b0e04-553b16a0e38so4892791e87.1 for ; Mon, 30 Jun 2025 07:20:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1751293229; x=1751898029; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=2sXxnutuQNshAuN25MG1B9YNe5116VtrTWttVb+J9U0=; b=jtE9OauB0MsEkovMpZdAzt/njk0VSQjSeIPPTh30gkuTnExrcG+5QgXT0lGX7u8TjB 49EBlpSI5p3QvLZAf2tSrYDLUoqz4mAeAQ4dRh/xstnlVxmJS4d9nIGhZ7k8Q7vh+Bq4 AfO2DaJVIBdEz39Sv9Y2AgiZy3ngh+m9KZW48= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751293229; x=1751898029; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2sXxnutuQNshAuN25MG1B9YNe5116VtrTWttVb+J9U0=; b=CLHCh+xn+8jHoYiyoNyucfxLXjd+U6wHzgwEwMs0ijM+1w9YAhBIERVmOmrXvpBHpR VK9RBvaM1U8ryT4OYtJyWR03AWPGCfAmg8F5DM/rvIT25Ns1skHw5pboBU2yJVrri15+ jAGaxJkteiXKAEKgfIeY0Hxp9vMN1qzpSJgbN/ZUMYvTuxjJ2q4cn82FZgZvubIkADpG kTLWI+5yS6r13lZmW4lMc8c2jcLKprGOuWmbcNQVttASIRtwhGfidRcvT9g7po03wr7P ObipSvoyJQhX/mnXUfWYxaoR6LkaYBMEYtT6PMAiUxqlyNu1l2qF7OtnFRDkUUNhAHvG bCIw== X-Forwarded-Encrypted: i=1; AJvYcCVErzEVb4n8/DaYhprSm0BYll1qtyu93l48C9+Rsz2LUHiNaKpggxNdR9SlySReMQBGe8n6Hnz91iaqjmI=@vger.kernel.org X-Gm-Message-State: AOJu0YylyLdhL/jevz+aoER4bsgPzgSCuyUNj/EAZZMVjdEUcnRDyhjN irUuAVq4+QtNFa10GAxuzYP8m0SPmEZ3cTPfcqZfSY7q+uOPO2ff6bihcnCHb1fcO6+9HkU+wv7 jsyADjw== X-Gm-Gg: ASbGncvEeaRLNQt17uiZqaMVSrs1agG2e7PNPhYNXKsUHKsaunFCnY7VPmaVEG2bxbY G08egxMR3+wEqOpjbmoqfAPuky+/OoBj6noBmhrRccYTTshsCqsNsOEhGa4myIgwOf8vh/YC7+k Nf0bDtFC75/6f0uUxnuOiyEwqSooV5xdmAUFWe/vCpElPd0OuweKPbuRuidH/zpsDpG728olG9g Elu4pwqRm7RsrcOlOaqWFIkFltKCm3l6jQeG1qx/Vl7GMA9O7H4Ga3L/Eqj8QtWhmK5+LqlQQYC 1gG5jzIjGUFdvOXLjYZMifSOW0eOuSSjRDuPWd6sRRoxEqRZWmKNQPVvsuxSw2lWegzWHjkWkuY e0fMhgkiVOWWOLKr386onVtHVYOWY/wke9iUO58XeLA== X-Google-Smtp-Source: AGHT+IHbcAPXvePe30HSj85z7toWQIzqZIuNPLHXcAnug7hR/AjGTbBMUa+1SidzHEMD1ZaaRXRakA== X-Received: by 2002:ac2:4c55:0:b0:553:2cfe:9f1f with SMTP id 2adb3069b0e04-5550b7e9dcbmr5357754e87.6.1751293229195; Mon, 30 Jun 2025 07:20:29 -0700 (PDT) Received: from ribalda.c.googlers.com (166.141.88.34.bc.googleusercontent.com. [34.88.141.166]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5550b2d8ea8sm1432363e87.210.2025.06.30.07.20.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Jun 2025 07:20:28 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 30 Jun 2025 14:20:28 +0000 Subject: [PATCH v3 3/8] media: uvcvideo: Split uvc_stop_streaming() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250630-uvc-grannular-invert-v3-3-abd5cb5c45b7@chromium.org> References: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> In-Reply-To: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans Verkuil , Hans de Goede , Hans de Goede Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.2 uvc_stop_streaming() is used for meta and video nodes. Split the function in two to avoid confusion. Use this opportunity to rename uvc_start_streaming() to uvc_start_streaming_video(), as it is only called by the video nodes. Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda Link: https://lore.kernel.org/r/20250616-uvc-fop-v4-3-250286570ee7@chromium= .org Reviewed-by: Hans Verkuil Signed-off-by: Hans de Goede --- drivers/media/usb/uvc/uvc_queue.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_queue.c b/drivers/media/usb/uvc/uvc_= queue.c index 8f9737ac729546683ca48f5e71ce3dfacbae2926..b11f56d62ec0495a86105803674= 86dfaa31c450d 100644 --- a/drivers/media/usb/uvc/uvc_queue.c +++ b/drivers/media/usb/uvc/uvc_queue.c @@ -167,7 +167,7 @@ static void uvc_buffer_finish(struct vb2_buffer *vb) uvc_video_clock_update(stream, vbuf, buf); } =20 -static int uvc_start_streaming(struct vb2_queue *vq, unsigned int count) +static int uvc_start_streaming_video(struct vb2_queue *vq, unsigned int co= unt) { struct uvc_video_queue *queue =3D vb2_get_drv_priv(vq); struct uvc_streaming *stream =3D uvc_queue_to_stream(queue); @@ -186,14 +186,22 @@ static int uvc_start_streaming(struct vb2_queue *vq, = unsigned int count) return ret; } =20 -static void uvc_stop_streaming(struct vb2_queue *vq) +static void uvc_stop_streaming_video(struct vb2_queue *vq) { struct uvc_video_queue *queue =3D vb2_get_drv_priv(vq); =20 lockdep_assert_irqs_enabled(); =20 - if (vq->type !=3D V4L2_BUF_TYPE_META_CAPTURE) - uvc_video_stop_streaming(uvc_queue_to_stream(queue)); + uvc_video_stop_streaming(uvc_queue_to_stream(queue)); + + uvc_queue_return_buffers(queue, UVC_BUF_STATE_ERROR); +} + +static void uvc_stop_streaming_meta(struct vb2_queue *vq) +{ + struct uvc_video_queue *queue =3D vb2_get_drv_priv(vq); + + lockdep_assert_irqs_enabled(); =20 uvc_queue_return_buffers(queue, UVC_BUF_STATE_ERROR); } @@ -203,15 +211,20 @@ static const struct vb2_ops uvc_queue_qops =3D { .buf_prepare =3D uvc_buffer_prepare, .buf_queue =3D uvc_buffer_queue, .buf_finish =3D uvc_buffer_finish, - .start_streaming =3D uvc_start_streaming, - .stop_streaming =3D uvc_stop_streaming, + .start_streaming =3D uvc_start_streaming_video, + .stop_streaming =3D uvc_stop_streaming_video, }; =20 static const struct vb2_ops uvc_meta_queue_qops =3D { .queue_setup =3D uvc_queue_setup, .buf_prepare =3D uvc_buffer_prepare, .buf_queue =3D uvc_buffer_queue, - .stop_streaming =3D uvc_stop_streaming, + /* + * .start_streaming is not provided here. Metadata relies on video + * streaming being active. If video isn't streaming, then no metadata + * will arrive either. + */ + .stop_streaming =3D uvc_stop_streaming_meta, }; =20 int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type) --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Wed Oct 8 09:04:35 2025 Received: from mail-lj1-f180.google.com (mail-lj1-f180.google.com [209.85.208.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1122B28DF33 for ; Mon, 30 Jun 2025 14:20:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293238; cv=none; b=k8QPsXZ6xN1U1ICcQ9em1htV9KHdatO2X0fGdfEFyz5Q0ZNmLgpKKk40ReeASfTkpoSjUmpYRKnIAe+TOjtwcrqSMZEWOnw94D7EyRCBXI92BSjRwXv1VIh0a7U1j1XlQpbmJaZcGLxq5bfxJ/3zkMkferq6uDftRaGZ1cmAva4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293238; c=relaxed/simple; bh=hUSTM0cz4lDmfgU98My5Gb8Nx4v9DP1TnSn7IZqRpUY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Gyki5yiXeHQLiQP61p7kNa2w1ruEIzwOnz7XWVk5tfx0EOQ8C2hqCFehBfgOGBoeg7YptecauR5YUBohkZDN6LaU/Q6RShQoG/8bgmmap37EGte55mmcThE3Ak5zi/htqOBEjxBd3Re8TS65CgMppCCX4hh+mYP2UGa0bQXwoHY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=PiBvIEsN; arc=none smtp.client-ip=209.85.208.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="PiBvIEsN" Received: by mail-lj1-f180.google.com with SMTP id 38308e7fff4ca-32b50f357ecso20309911fa.2 for ; Mon, 30 Jun 2025 07:20:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1751293235; x=1751898035; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=dnt386dfMPODMMm6G8wrSthRtbiPhPkQSBX13EJa6EE=; b=PiBvIEsNTvjHVdevvsOI2Uon/M/uZxjRxeM4doVgLpzxR3R5yStmBRrmtZFI+usV93 +2wEXtzKWomVl31FFLwWFsyaDILDYo6167xBxf2vT5eQoMljgGNAux58TIUlucz60lRi P6bijaVX8NufnvMwLV5zqKBgOWZJrkEcTrwHI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751293235; x=1751898035; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dnt386dfMPODMMm6G8wrSthRtbiPhPkQSBX13EJa6EE=; b=PJjYlf/Eqt5k5xFh3BRcNmy9g/pf93qVwBP6G8YO89OwrvdD5OASi4syqjAuXKxO+i EvBOUz8bQgOD6/+4ZI7SrI3K4h4LSABWkRcw+ewT5ojbxtakEdMyQfl65UEf7J76oNnk uMeKUHrIAHIASplgOvr2Kpxj4z/oUaGBRjAZ0nNYTdNiUROvtw1s4xPf0EhvcEnrJqUw XiyJooi9RHMkMOtzn9YO1nOxPbvC8HXcto1evDCjYpwhsbd56GVsnm7WYye5ltq5C7pq 5mZ+NOFvsvMF+oTtTN+OTczl9Q333rr4TzwBV2nyRNY4VbpNPjIvvJCQCZQVpeaNdoiS pFQQ== X-Forwarded-Encrypted: i=1; AJvYcCWYBq/ywcQg6kZtxkMM5zLZbtEiJ8DMZ78donT0WEhjhbfjSInUcqJw5tpl1auER+HtIpL4otyaqQH6mMc=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+fC/eszw1J/JnbpRW17wRNUaRhuuvrK5f8XtqH508vkULCZFX v9x4irLDOqOrHVx/m6VtkuNhbtmpNBQtOQDgV0+ipXxIot1H3eet+sp1qjZWRk84fvl73tztH0g 2mJNQuA== X-Gm-Gg: ASbGncvhQvQjHHQSr3W5lj1SH4fPXbjwlu4DeqwO0kxRNji6reI2JgGc0TlB/zRLrNw GHfD9SlIZxSzZT0XuV6uyPxVgm9nqx/fQVgsT5YZ6aoW+b3vJ0p7norQn1g2RvdfRWYcArBHbSM Bl0cy4jaI+ZBu2L0atkaFXoYRTgWwDUXsYTk2z2mRgWKao0yqxZiLy5Cp4ZmXaoH4VZgHUwANMZ pSnGtr4F/++8bLcmM+rQoAH+9mUmG7cqGybSmT6Ae0vWa9yAcg4xyhCi1WUAQFtmOk/lxTl1ofF G53QLSynqngkfC8o8dnq6KQsT3J9tCDZunELfBDrS7jfAiWitFMnyTBY+c+3JBVmvzRFxOpEeiA 7b+AIF8KolwyYFKKt5zMhDuLG5XlLB+iFASsq1bcRXw== X-Google-Smtp-Source: AGHT+IGdwXnpgUB0vN6sIBFwmisdEJIRVa6FJTkVxayzmF/fNIKWfsG+a9C1TibVfwWUCEy4vc7WRA== X-Received: by 2002:a05:6512:3156:b0:553:34b7:5731 with SMTP id 2adb3069b0e04-5550b7eccf9mr3761330e87.3.1751293229598; Mon, 30 Jun 2025 07:20:29 -0700 (PDT) Received: from ribalda.c.googlers.com (166.141.88.34.bc.googleusercontent.com. [34.88.141.166]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5550b2d8ea8sm1432363e87.210.2025.06.30.07.20.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Jun 2025 07:20:29 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 30 Jun 2025 14:20:29 +0000 Subject: [PATCH v3 4/8] media: uvcvideo: Remove stream->is_streaming field Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250630-uvc-grannular-invert-v3-4-abd5cb5c45b7@chromium.org> References: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> In-Reply-To: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans Verkuil , Hans de Goede , Hans de Goede Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.2 The is_streaming field is used by modular PM to know if the device is currently streaming or not. With the transition to vb2 and fop helpers, we can use vb2 functions for the same functionality. The great benefit is that vb2 already tracks the streaming state for us. Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda Link: https://lore.kernel.org/r/20250616-uvc-fop-v4-4-250286570ee7@chromium= .org Reviewed-by: Hans Verkuil Signed-off-by: Hans de Goede --- drivers/media/usb/uvc/uvc_queue.c | 9 +++++++ drivers/media/usb/uvc/uvc_v4l2.c | 51 ++---------------------------------= ---- drivers/media/usb/uvc/uvcvideo.h | 1 - 3 files changed, 11 insertions(+), 50 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_queue.c b/drivers/media/usb/uvc/uvc_= queue.c index b11f56d62ec0495a8610580367486dfaa31c450d..790184c9843d211d34fa7d66801= 631d5a07450bd 100644 --- a/drivers/media/usb/uvc/uvc_queue.c +++ b/drivers/media/usb/uvc/uvc_queue.c @@ -175,12 +175,18 @@ static int uvc_start_streaming_video(struct vb2_queue= *vq, unsigned int count) =20 lockdep_assert_irqs_enabled(); =20 + ret =3D uvc_pm_get(stream->dev); + if (ret) + return ret; + queue->buf_used =3D 0; =20 ret =3D uvc_video_start_streaming(stream); if (ret =3D=3D 0) return 0; =20 + uvc_pm_put(stream->dev); + uvc_queue_return_buffers(queue, UVC_BUF_STATE_QUEUED); =20 return ret; @@ -189,11 +195,14 @@ static int uvc_start_streaming_video(struct vb2_queue= *vq, unsigned int count) static void uvc_stop_streaming_video(struct vb2_queue *vq) { struct uvc_video_queue *queue =3D vb2_get_drv_priv(vq); + struct uvc_streaming *stream =3D uvc_queue_to_stream(queue); =20 lockdep_assert_irqs_enabled(); =20 uvc_video_stop_streaming(uvc_queue_to_stream(queue)); =20 + uvc_pm_put(stream->dev); + uvc_queue_return_buffers(queue, UVC_BUF_STATE_ERROR); } =20 diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index d06ecf3418a988152c6c413568ce32e60040fd87..7ab1bdcfb493fe9f47dbdc86da2= 3cba98d7d10ff 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -617,9 +617,6 @@ static int uvc_v4l2_release(struct file *file) =20 uvc_ctrl_cleanup_fh(handle); =20 - if (handle->is_streaming) - uvc_pm_put(stream->dev); - /* Release the file handle. */ vb2_fop_release(file); =20 @@ -676,50 +673,6 @@ static int uvc_ioctl_try_fmt(struct file *file, void *= fh, return uvc_v4l2_try_format(stream, fmt, &probe, NULL, NULL); } =20 -static int uvc_ioctl_streamon(struct file *file, void *fh, - enum v4l2_buf_type type) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - int ret; - - if (handle->is_streaming) - return 0; - - ret =3D uvc_pm_get(stream->dev); - if (ret) - return ret; - - ret =3D vb2_ioctl_streamon(file, fh, type); - if (ret) { - uvc_pm_put(stream->dev); - return ret; - } - - handle->is_streaming =3D true; - - return 0; -} - -static int uvc_ioctl_streamoff(struct file *file, void *fh, - enum v4l2_buf_type type) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - int ret; - - ret =3D vb2_ioctl_streamoff(file, fh, type); - if (ret) - return ret; - - if (handle->is_streaming) { - handle->is_streaming =3D false; - uvc_pm_put(stream->dev); - } - - return 0; -} - static int uvc_ioctl_enum_input(struct file *file, void *fh, struct v4l2_input *input) { @@ -1320,8 +1273,8 @@ const struct v4l2_ioctl_ops uvc_ioctl_ops =3D { .vidioc_expbuf =3D vb2_ioctl_expbuf, .vidioc_dqbuf =3D vb2_ioctl_dqbuf, .vidioc_create_bufs =3D vb2_ioctl_create_bufs, - .vidioc_streamon =3D uvc_ioctl_streamon, - .vidioc_streamoff =3D uvc_ioctl_streamoff, + .vidioc_streamon =3D vb2_ioctl_streamon, + .vidioc_streamoff =3D vb2_ioctl_streamoff, .vidioc_enum_input =3D uvc_ioctl_enum_input, .vidioc_g_input =3D uvc_ioctl_g_input, .vidioc_s_input =3D uvc_ioctl_s_input, diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index b300487e6ec9163ac8236803b9e819814233f419..3e6d2d912f3a1cfcf63b2bc8edd= 3f86f3da305db 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -629,7 +629,6 @@ struct uvc_fh { struct uvc_video_chain *chain; struct uvc_streaming *stream; unsigned int pending_async_ctrls; - bool is_streaming; }; =20 /* ------------------------------------------------------------------------ --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Wed Oct 8 09:04:35 2025 Received: from mail-lf1-f45.google.com (mail-lf1-f45.google.com [209.85.167.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A14428CF76 for ; Mon, 30 Jun 2025 14:20:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293235; cv=none; b=DxJJy+HSKSZNRMGukm4ORjjxXrmIWIJVhDScPWqOHGE3pJm1Abvg6tftyirVNSgdP5JDs7plnDZVa7YDDj7W/QlGWJuZ3ahq+Ejgj0A3O63pvmcBBKyjsK8Mb50Fjj2zU7wJ74iZ12EqEGCnbj+AmQ756jcoVAuW2nn+oVu5WHQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293235; c=relaxed/simple; bh=kmRTm9kyR+46n0xfucUpkYJjdAw04RXMg4vx4GWGzVE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=J98ZxKd0EOt6pxr42YEYAOvYBSVXjB55itjUix7PWWt+dTBrHdC7PXVOB+5FPnJSaP8VTxsAvgJ09JikinepZKgHS4bt+syAJ4lZnyU52SJUaraVnvmc9Csa0AN8wW2hm/+Eta5H07JyshBdwSMFKMlMZ4mtdkCxZ9Kcwq9sq68= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=nHY+cQxO; arc=none smtp.client-ip=209.85.167.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="nHY+cQxO" Received: by mail-lf1-f45.google.com with SMTP id 2adb3069b0e04-553b3316160so2452442e87.2 for ; Mon, 30 Jun 2025 07:20:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1751293231; x=1751898031; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=xvxAKM98pb9QJ/qUv4r/ub1kcRedtcU6A5oFVUSoXHg=; b=nHY+cQxOegHmIhApJxtAfPoHjiwNj+UOT35mKM6B2f7oMf4PSqx/Pp1IibkisSCK+J AbcWBuasVrTRkGxGdyntt1HA9xv+02Cr6RqQi0YQMUNjq/DQi+Tz2qXNh06mGe70RR4n 1mDlBtR0ahnIgpb0pM6c6xj0sNbVwfWdqybnw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751293232; x=1751898032; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xvxAKM98pb9QJ/qUv4r/ub1kcRedtcU6A5oFVUSoXHg=; b=xDCZUCkSdpEQ9RnMww26pLLXtDTTJMIS3K+S37O8KjnRhcxsIgsVbMnu4xQdMmKhD8 pR5uQOQoTkE8p34vuBRY18WFcTZWqMm4sjgVtj0tTAzCKJ/GAZwUIQftdu7/JXgGXWsJ k1YVqKOojUtrkIecvwxdtKTYo0Os5DtvzuRbYz9YUwIpDdHVyLr7PIPLJpP/+j+EOBEy uRN/sVb5YXhRMGr6urz3mcYF3vyWQ1wO+g/oi9PkhkpmhWJsftMKl//2gd5QjZumizpu U/RUR8Ke9QrwvneDtM2onPh1wmyPwaMz75CWnQpwn1wrKYPGTyaO0up9vFjlJVNFrnCm sC7g== X-Forwarded-Encrypted: i=1; AJvYcCX4ge2ezTBkesw65hw7tieefuH5w9SYMgTrhrVrUJ/sMCAea9gBKEbGGIkpRKT4mBh73tPnOvk9QjyouaU=@vger.kernel.org X-Gm-Message-State: AOJu0YyOvcy0XX40pShe14uYFBph+lyj3s0uWtqG92G9cSG+Rk1QO1Zb AwlAzIT6MMKqdVw8O0oBdwUz0ATlRVUdUUkfWVXK1V6pFjk3XQXCUi+kMXnLNzQ19XC4UhQAC82 KlB9fSQ== X-Gm-Gg: ASbGncu/4OFDEc6DxmJmNqvArgWhhu0RHGeQ/2AXqbnT0yKqsjsL4uXDaXgsCYpyvJL sFyBWdqlu5TX4FjbmygESj8V8IGQ2ycs9whVO3uOnZDna5Dayo0yy28w8SS9wSTRyKBlbbAIMVL vOvbXTyhxozLR7OdQ95/kPA8ubmcYtOPNqZ+jqkhmHb2Yl7/1PlyLPxZ+CfyuwBptIf0X+r71Xh yNBwH0KJ+1o1L5Flr4SmW64D3Ty7m+9p9lVqcfIWPFNDIjq81NIRZiQpLlrW+iL0Jf6juoaNRoo B06Cjfx/U/b3FmJnUx5HeimiOPALcDHbo4I67I4PDjFSdvPHflHM+SZ0GhVPIRAPHjZK8M+JoiU pbmpsERVh3GiWLwNhRlHRxg7Js10dU1F9/98McBHz+g== X-Google-Smtp-Source: AGHT+IFKrR5YCaYnhS5iD0uImmyjOzhm8bzbacAYk7AWZ1KupjzDmN0IxVjJ2iXbSGGDEwb9B5VosQ== X-Received: by 2002:a05:6512:3d1e:b0:553:3892:5ecc with SMTP id 2adb3069b0e04-5550b8ce576mr3858682e87.36.1751293231523; Mon, 30 Jun 2025 07:20:31 -0700 (PDT) Received: from ribalda.c.googlers.com (166.141.88.34.bc.googleusercontent.com. [34.88.141.166]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5550b2d8ea8sm1432363e87.210.2025.06.30.07.20.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Jun 2025 07:20:31 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 30 Jun 2025 14:20:30 +0000 Subject: [PATCH v3 5/8] media: uvcvideo: Turn on the camera if V4L2_EVENT_SUB_FL_SEND_INITIAL Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250630-uvc-grannular-invert-v3-5-abd5cb5c45b7@chromium.org> References: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> In-Reply-To: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans Verkuil , Hans de Goede , Hans de Goede Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.2 If we subscribe to an event with V4L2_EVENT_SUB_FL_SEND_INITIAL, the driver needs to report back some values that require the camera to be powered on. But VIDIOC_SUBSCRIBE_EVENT is not part of the ioctls that turn on the camera. We could unconditionally turn on the camera during VIDIOC_SUBSCRIBE_EVENT, but it is more efficient to turn it on only during V4L2_EVENT_SUB_FL_SEND_INITIAL, which we believe is not a common usecase. To avoid a list_del if uvc_pm_get() fails, we move list_add_tail to the end of the function. Reviewed-by: Hans de Goede Fixes: d1b618e79548 ("media: uvcvideo: Do not turn on the camera for some i= octls") Signed-off-by: Ricardo Ribalda Reviewed-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_ctrl.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 303b7509ec47964dc1bf0e28127075b4a3867511..e84aaf130c73403a6c818decead= f404a2975c816 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -2072,18 +2072,23 @@ static int uvc_ctrl_add_event(struct v4l2_subscribe= d_event *sev, unsigned elems) goto done; } =20 - list_add_tail(&sev->node, &mapping->ev_subs); if (sev->flags & V4L2_EVENT_SUB_FL_SEND_INITIAL) { struct v4l2_event ev; u32 changes =3D V4L2_EVENT_CTRL_CH_FLAGS; s32 val =3D 0; =20 + ret =3D uvc_pm_get(handle->chain->dev); + if (ret) + goto done; + if (uvc_ctrl_mapping_is_compound(mapping) || __uvc_ctrl_get(handle->chain, ctrl, mapping, &val) =3D=3D 0) changes |=3D V4L2_EVENT_CTRL_CH_VALUE; =20 uvc_ctrl_fill_event(handle->chain, &ev, ctrl, mapping, val, changes); + + uvc_pm_put(handle->chain->dev); /* * Mark the queue as active, allowing this initial event to be * accepted. @@ -2092,6 +2097,7 @@ static int uvc_ctrl_add_event(struct v4l2_subscribed_= event *sev, unsigned elems) v4l2_event_queue_fh(sev->fh, &ev); } =20 + list_add_tail(&sev->node, &mapping->ev_subs); done: mutex_unlock(&handle->chain->ctrl_mutex); return ret; --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Wed Oct 8 09:04:35 2025 Received: from mail-lf1-f54.google.com (mail-lf1-f54.google.com [209.85.167.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EE53D28C030 for ; Mon, 30 Jun 2025 14:20:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293235; cv=none; b=L1GZSHDB8z4PogA4DbjL9fBo78c6b0DKrrG+4nWYhxQqWegbr3pGtdTj4sTz3AeAK6DxewNKly8DppLM9bwXx9hHajPV1WBKFbze8WbeU7n79+cNn2oPmSStOyY/3fwXdgap75OvclcoiGdpC0z4+Cm4VSROIj/v5W2SBzeSt1U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293235; c=relaxed/simple; bh=M4iJm9plTTflFPunOkSmnLashKdwUdy/6f2HU79tXu8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IYeoIzBJ2WW/fdT7d4H20nuxzr9Ov8+sCB5LluuLk+Z4/gj/8e1m54WPlDVlZWIvLiSpgjx9vG3HguAIgupTDHxkq878DO6jo6wzHrnRyzVAu0Q3qRVl4onUZcp5K/D9iNV/aH/WWPBaQx0HyzqeMY2zXB8xNpUhlM/Vprh5GtI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=DABCQcdN; arc=none smtp.client-ip=209.85.167.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="DABCQcdN" Received: by mail-lf1-f54.google.com with SMTP id 2adb3069b0e04-553b6a349ccso2417674e87.0 for ; Mon, 30 Jun 2025 07:20:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1751293232; x=1751898032; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=53U0DriXJKKU6AjmS/GbGBXA7AhDrFUGqACgSJAnLKQ=; b=DABCQcdNlfn/h2NxFRQwRnb257GneGPaYoZz8xaD+/G0W8DqL/PC3DBow43v/m/Ihk UWaEIw/TecrRtDFSHfcJzmAdoAus8N2ejM3dUZAAITi4BnZKzb3X6KdplduReNwp0XHY iNKg/EDkBnzwREAYUnbOClxsQ8mlIyPH/AcT0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751293232; x=1751898032; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=53U0DriXJKKU6AjmS/GbGBXA7AhDrFUGqACgSJAnLKQ=; b=bT287x0Ur91wRHj0ntT7VqEC9SZJrn7/f62/W1Njthmx8fYqLEs9hspvF8arafq4kL cu/ZI+7ZyoFjPtJNYBC0pT565guqlB4K2RxPKG28JHRCslDxOOEv1hHywU1O/7b2YQaI c8GAhokiJTVUZR1zhsMZ93uOJ0fpghivXEpzZ2/v9+FfHTy2EWBNHOqR2oP8tYoZ5NPY 15WEhgXWlQun+baBikCYllpwkRIRgOObN+hDpNmhEIOTe4RFGnQaNu7uXUz0I/233HD7 by3VQxNVMO8rapbZEMB8AfxVm+kZdE6cEqhaUz2GQgQBbOoWYomEvpZcR8+3zEMXWaur TGfg== X-Forwarded-Encrypted: i=1; AJvYcCVzQ0w7oP0tBO8EhAeOFOXNOkK1Un0/w9rMF6cmup0Kdfac3mZoPeEEoupGuCQc7kWE2D2Zei1O0uNK0go=@vger.kernel.org X-Gm-Message-State: AOJu0YwxZI4QIBLnY9zEXjtSMMafcMNFgWFJFlXnwyGIn3hVC00lq2dL 9+pjH1QJQoOO1O/phqLvhHgTe+O/NMs2jLyrW801+eozWsPJCIkE2zFos56LvoQV6omH32hac7s VfiwM0A== X-Gm-Gg: ASbGncsXg65+wYY8bXy2mBoJbqDIEBu5vN0jkGSNm8XzQoK0s75DU7jmDNUKbN+5IQt 2Ltzji2qJgeyw7YVvk4sTk4RNnGcUR0FAlTttoEzNQzs5hqDaD0jTEX6F+eR2ddrcPriOu1XXkp dwMzrGTDwSHIEEmGtqdNKdwjD6UberSbgKMpsvSGpDCFVrYXBQEkINOzGwdpuiKtGuftqUFz1nX 31kiTcSu8joky4REXnJQr+JRwbzVFOA7Cpzg4GvTL7rkEnB5mipFYoZAV4Om+gc0sMt3uUvJ40s 3S+7g/1IE2yh7UcDEG7CdS7ixB1w42XC7MqLShamXL0HzPcm+O/d0pLyM4fUh84ynzsRCrB4ZO6 F+IhbF5ccrFML4/5SEn44E9MisR9wYY5YirmXRHPOfA== X-Google-Smtp-Source: AGHT+IEyEk+IFI/NztfDlgnMuyWUGlQ1F/bRW1nlXrov83yP0tHVCKZPdgUeT/hlzVW+RcxmBJvWqQ== X-Received: by 2002:a05:6512:118a:b0:553:2dbd:6a61 with SMTP id 2adb3069b0e04-5550b80c2c7mr4349117e87.14.1751293231929; Mon, 30 Jun 2025 07:20:31 -0700 (PDT) Received: from ribalda.c.googlers.com (166.141.88.34.bc.googleusercontent.com. [34.88.141.166]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5550b2d8ea8sm1432363e87.210.2025.06.30.07.20.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Jun 2025 07:20:31 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 30 Jun 2025 14:20:31 +0000 Subject: [PATCH v3 6/8] media: uvcvideo: Do not enable camera during UVCIOC_CTRL_MAP* Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250630-uvc-grannular-invert-v3-6-abd5cb5c45b7@chromium.org> References: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> In-Reply-To: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans Verkuil , Hans de Goede , Hans de Goede Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.2 The device does not need to be enabled to do this, it is merely an internal data operation. Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_v4l2.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 7ab1bdcfb493fe9f47dbdc86da23cba98d7d10ff..350cd2cc88f872d2e8bd19e2b8f= b067894916364 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -1178,10 +1178,6 @@ static long uvc_v4l2_compat_ioctl32(struct file *fil= e, void __user *up =3D compat_ptr(arg); long ret; =20 - ret =3D uvc_pm_get(handle->stream->dev); - if (ret) - return ret; - switch (cmd) { case UVCIOC_CTRL_MAP32: ret =3D uvc_v4l2_get_xu_mapping(&karg.xmap, up); @@ -1197,9 +1193,15 @@ static long uvc_v4l2_compat_ioctl32(struct file *fil= e, =20 case UVCIOC_CTRL_QUERY32: ret =3D uvc_v4l2_get_xu_query(&karg.xqry, up); + if (ret) + break; + + ret =3D uvc_pm_get(handle->stream->dev); if (ret) break; ret =3D uvc_xu_ctrl_query(handle->chain, &karg.xqry); + uvc_pm_put(handle->stream->dev); + if (ret) break; ret =3D uvc_v4l2_put_xu_query(&karg.xqry, up); @@ -1212,8 +1214,6 @@ static long uvc_v4l2_compat_ioctl32(struct file *file, break; } =20 - uvc_pm_put(handle->stream->dev); - return ret; } #endif @@ -1226,6 +1226,7 @@ static long uvc_v4l2_unlocked_ioctl(struct file *file, =20 /* The following IOCTLs do not need to turn on the camera. */ switch (cmd) { + case UVCIOC_CTRL_MAP: case VIDIOC_CREATE_BUFS: case VIDIOC_DQBUF: case VIDIOC_ENUM_FMT: --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Wed Oct 8 09:04:35 2025 Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6951728D85E for ; Mon, 30 Jun 2025 14:20:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293236; cv=none; b=S+ecpTxnGzrJ9SW0wsS34yZ5+yWz/mbcM/wK43qlgs262a/tze4s9MypLus5kS6oayklkasPFMiTqDNnWKY3bEzjID9qUZSu6oO3ms4q2AFoQUvmWd7K/9wBqSlYVIU9GkjzIjnj0DCCdc0pdkzjhmhetx3SgJsOrUdk/AyXrcc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293236; c=relaxed/simple; bh=StIjsrDQQ94ySFohrFAOiuV4cwGsQ1ciljTg7HivbGw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=t2wNaqUFMzdWoXYUPj1RODsiyDTlqefEn4QIydpQrIMgdruMV4pUCRLQ87etl7yh48DyuqIHy+9yry+uTdRvh+DLysu/lu/oNdvjfY+Bku5gX4ceWhlFR/Aa8DwIAUODssswwlc7cznXhR+saewENxztcaiNFc8GwefMg+ms7VI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=Or7EttL8; arc=none smtp.client-ip=209.85.167.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Or7EttL8" Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-5535652f42cso5335324e87.2 for ; Mon, 30 Jun 2025 07:20:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1751293232; x=1751898032; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=yAe7NPUv3UgqaitLxwSrpp8vWQyIkzVUxkP+DtxYy80=; b=Or7EttL8zMipdGyF4PtWh9cC5FhUZgnYaOQpD0HNumm3rorl6crQGWSDahFm7+WDc9 i6L01cU/QplyT6QjEXze7ydmdZwPl5+A8brBnqcl4rJ2tuOrSR0wmuq1QcP7GTqi7BPJ D3AbzanRdJl8L50qqG92uQx+QgqB8UqqkEj04= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751293232; x=1751898032; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=yAe7NPUv3UgqaitLxwSrpp8vWQyIkzVUxkP+DtxYy80=; b=ovFxqtvqvWzSaCP+celv/6Ii6MFejRQH28/rq+Xq26GYUMeZH4SLkn6UpOB58fL5hV fYdFiXpjbNCzJswyX0F5TNwPGodpCB+MlatOH2zUkPVQOoXiniiaiHDxmG4UfJuRGaTn RUfzS5bch3+cQPhdXX1z8srnCU9NIeqNSEOqAHoBFXHEgoxr1Mo++XHP4mnUAnAeB2oC hLbzQoSAK+fhlcGj6b8DjM8HG7zhMHyEycv8AImPn0bLbHQuM2fRBYsdX5hStmgyCRmi ZNEzROYwKoUjYUqqgl5nkRzUaJFzIOx3jS9juUg93t4/hAgSzWXDxXGEhenKDfnl0Ym+ EdBw== X-Forwarded-Encrypted: i=1; AJvYcCWAtlpitG0Ce5PEmH43NYcbOAInHBj9DLCi/ZzCMMyOt1fHUI1aFeZ1v2vcBsDCHvAqRDYCI4/6PnWMEHg=@vger.kernel.org X-Gm-Message-State: AOJu0Yzhpz7+Mn0Pjoj1FYmREvG52zkgbp0u+9gKtuwWpErZbhiacVf8 hvf5ICaSVYJaonopElsuwxEyA3wQEFaiAht/z3GrgCwx8IHZTbA8P7iOk14Isz6jIO0vcJmxXoY nqNE4NA== X-Gm-Gg: ASbGncufncxU9F6X2/Ud0LIY/d/5NAR4b1WaO8ZfUz5DikCiV9ugNdDDNxQPQszw2Zn hwi85ELE5w0MZ704fPK6Ikgh/AkTk6d1pyneAVF59Ladd0G2FzMfC4hrSJrBDU56OqPBv31AUof Apc+TIMSpBXwLiUgKayKoMp8Ktor/5cTSPSqv/GLc/y5kLBJcklEyldZuSKPxhbzOZnik5Tu1Ss 1gBxMjEL3f9gSKX1DO5D26X4ZxR0KoijMR9AciwoTewISEf20CAb3KVCD9KfWyT2wOwjOTHBPw+ f7O8TzldrqGxPoVG9cFhHvKfKXcrvhT2j0fA7HhszfVb3D9pqmyeDtT8FdBquAxb3OEEdtX2w3D O/coWjLQxuvsJc86zVTtcgR2z5uJyp1+qmOc9/KH3KQ== X-Google-Smtp-Source: AGHT+IH96wRX1j0FKyBt7CEEjQe/wEUSTI8G8V1XuwjaaQ7uyNNMf+G24gjYADezAvSI/USmW+h+mQ== X-Received: by 2002:a05:6512:ea5:b0:553:a469:3fed with SMTP id 2adb3069b0e04-5550b7e7b6fmr4009017e87.11.1751293232320; Mon, 30 Jun 2025 07:20:32 -0700 (PDT) Received: from ribalda.c.googlers.com (166.141.88.34.bc.googleusercontent.com. [34.88.141.166]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5550b2d8ea8sm1432363e87.210.2025.06.30.07.20.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Jun 2025 07:20:32 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 30 Jun 2025 14:20:32 +0000 Subject: [PATCH v3 7/8] media: core: export v4l2_translate_cmd Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250630-uvc-grannular-invert-v3-7-abd5cb5c45b7@chromium.org> References: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> In-Reply-To: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans Verkuil , Hans de Goede , Hans de Goede Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.2 video_translate_cmd() can be useful for drivers to convert between the VIDIOC_*32 and VIDIOC_ defines. Let's export it. Now that the function is exported, use this opportunity to rename the function with the v4l2_ prefix, that is less ambiguous than video_ The VIDIOC_*32 defines are not accessible by the drivers, they live in v4l2-compat-ioctl32.c. Signed-off-by: Ricardo Ribalda Reviewed-by: Hans Verkuil --- drivers/media/v4l2-core/v4l2-ioctl.c | 5 +++-- include/media/v4l2-ioctl.h | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core= /v4l2-ioctl.c index 650dc1956f73d2f1943b56c42140c7b8d757259f..1e22ca898ab77e581d78c1a618e= 1de0e57281cde 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -3245,7 +3245,7 @@ static int check_array_args(unsigned int cmd, void *p= arg, size_t *array_size, return ret; } =20 -static unsigned int video_translate_cmd(unsigned int cmd) +unsigned int v4l2_translate_cmd(unsigned int cmd) { #if !defined(CONFIG_64BIT) && defined(CONFIG_COMPAT_32BIT_TIME) switch (cmd) { @@ -3266,6 +3266,7 @@ static unsigned int video_translate_cmd(unsigned int = cmd) =20 return cmd; } +EXPORT_SYMBOL(v4l2_translate_cmd); =20 static int video_get_user(void __user *arg, void *parg, unsigned int real_cmd, unsigned int cmd, @@ -3426,7 +3427,7 @@ video_usercopy(struct file *file, unsigned int orig_c= md, unsigned long arg, size_t array_size =3D 0; void __user *user_ptr =3D NULL; void **kernel_ptr =3D NULL; - unsigned int cmd =3D video_translate_cmd(orig_cmd); + unsigned int cmd =3D v4l2_translate_cmd(orig_cmd); const size_t ioc_size =3D _IOC_SIZE(cmd); =20 /* Copy arguments into temp kernel buffer */ diff --git a/include/media/v4l2-ioctl.h b/include/media/v4l2-ioctl.h index c6ec87e88dfef9e6cfe1d1fb587c1600882fb14d..82695c3a300a73219f262fb556e= d61a8f09d273e 100644 --- a/include/media/v4l2-ioctl.h +++ b/include/media/v4l2-ioctl.h @@ -679,6 +679,7 @@ long int v4l2_compat_ioctl32(struct file *file, unsigne= d int cmd, #endif =20 unsigned int v4l2_compat_translate_cmd(unsigned int cmd); +unsigned int v4l2_translate_cmd(unsigned int cmd); int v4l2_compat_get_user(void __user *arg, void *parg, unsigned int cmd); int v4l2_compat_put_user(void __user *arg, void *parg, unsigned int cmd); int v4l2_compat_get_array_args(struct file *file, void *mbuf, --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Wed Oct 8 09:04:35 2025 Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CB87D28C2C2 for ; Mon, 30 Jun 2025 14:20:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293237; cv=none; b=Mw09L2SEl8eL60qUX71HXqkwO6NxwQmlMR14JF7C+cgam5u7St+RyZL0jL0VVmehg+ITt2GhECqwah0W1MgZQkSxhMyh7+3+dyyKEng09WKWLUxat2ybmTSksA4xMT4U2Y8BUbxbC9kGIlv6dgD9k+iHipbW7bfLvYMKpo2bxbU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751293237; c=relaxed/simple; bh=S0aFpFC4n3QawWa7V2OErQFJEBz53JWrHnAFsX28XUo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Jmqu/IGqCxN3ybKhF/19c8rmuf6f8QDJouT8unCYFWq9HbB5soNr1DWFvee6WZpr2ciA3Dw0rMXPVbGFc52xS351GdmpTDYu4SXWNICi4HfLr7XgWqA6jeXDiC5KO7k/tssFPmMQFxj/O8oZPGYhwul3WoQZAsqHjWhRgMowUTw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=HeGFkQRQ; arc=none smtp.client-ip=209.85.167.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="HeGFkQRQ" Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-553b165c80cso4577050e87.2 for ; Mon, 30 Jun 2025 07:20:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1751293233; x=1751898033; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=lV5zqtGaJFdq64Z/f4wEaBtjans6GYNhmk/s3Cxy0fg=; b=HeGFkQRQRPUUfuokoQk5ewNWY/83Csji91i1/neKLNM58RpoN54B1szNCjLEDi/PGl Cf3ugZ20+57Lr/ci1Z/M8R05HF9/CovJUoFXzWAN+U+lRhBJuu8R7a7OZnU0yppi1OxS N4OuOJAJ3f3KOaQRmFlTgjaw+4qboE5sqnXXY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751293233; x=1751898033; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=lV5zqtGaJFdq64Z/f4wEaBtjans6GYNhmk/s3Cxy0fg=; b=TWYvoAL8y8FFjGwgubebt7JgQ86/t46vuU1ax1brvxIx2OW4MsRQKC/usXxaMd3FUo dCRs06MLYnnRMcIQLbmqeKccBdFUDYgQ7QpTbr3oqo8+cKZUPlFP/XkXz3MEMgtabpKE lB5G7XkAYzgSLHFDz/aAO2HMtcGtCRWN4L78g2epFlK0f0Z6oKdZZMoaCKxO60RIiDir X387+CsFprxgxgmolMFLU21kCwMG6wgE3dAeoRnyxq6siMl5UeN+XYhKz1U4LneA2/YG rRkhtJCWATFcbFVw4yNWimwEafkyVyxaLscRlyCokqGKosmy0MHXoPVkgIn/oAIbRq6G U4Vw== X-Forwarded-Encrypted: i=1; AJvYcCUbTCXZFjxRda/Jd2CCA48bl8tAPIeB7KxrzX4j7k1AoAh+smtQjl76tPFChOu78UGSRVbAm3jKSM09HWg=@vger.kernel.org X-Gm-Message-State: AOJu0YzLQJ8aULvWy5sT3HC+mm2ShmMp0vMywxbCdHC2+fsQAhYMcpoZ s2gn2DkDN1ImtpyrPhhYSfroMHvXOcTTwaD151+2wTcfIkF03a4uhbLJdmes7DhYR+Z6WZY6OBG 447NO0A== X-Gm-Gg: ASbGnctKUvZrDQ2g30+JCDjGiuADkTp71XZRFfkntro3sl1Xi/iEMYxjHqshoJgUsvo eTGE6UWImgREcIl4/1ZK7zAy53jLXKNNOSzQAlSLg3f+273puSSAsyDblXyQ1/+2KsV7lNCR1lP k3evmQEekQmJ198mm3uOyVf+Tp5gy4wXHCPXdHpj0sapw7Dxqt8jfGIl/0f9yowIOqEiEknRbeW PkB+WKlzHEWNIF3FODP4IHR3HmXoB+J68lOXOUob4fkl4PhXYR/Q33Ev88KDbnD8ZtJl5Al3Tzv jSUPSUhRznQSdolak6snEkSScJyh7BO4Josa15D1JL6aKQe/aPd/rDmj9F96NSC5oTyekDoGoQ5 VtFs/BQ+Wgl2+J1wPAmNQd9gpST9Iv1LdhpFDFN1MJw== X-Google-Smtp-Source: AGHT+IEHySu2ZYesyEoFEJ/oKpjAojmH1jxOLz5N72hVn7IAx/v2lionP8GlV1OsFKCtl8ojRqFamA== X-Received: by 2002:a05:6512:33c7:b0:553:aa32:4106 with SMTP id 2adb3069b0e04-5550b892b93mr4365091e87.23.1751293232698; Mon, 30 Jun 2025 07:20:32 -0700 (PDT) Received: from ribalda.c.googlers.com (166.141.88.34.bc.googleusercontent.com. [34.88.141.166]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5550b2d8ea8sm1432363e87.210.2025.06.30.07.20.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Jun 2025 07:20:32 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 30 Jun 2025 14:20:33 +0000 Subject: [PATCH v3 8/8] media: uvcvideo: uvc_v4l2_unlocked_ioctl: Invert PM logic Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250630-uvc-grannular-invert-v3-8-abd5cb5c45b7@chromium.org> References: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> In-Reply-To: <20250630-uvc-grannular-invert-v3-0-abd5cb5c45b7@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans Verkuil , Hans de Goede , Hans de Goede Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans Verkuil X-Mailer: b4 0.14.2 Instead of listing the IOCTLs that do not need to turn on the camera, list the IOCTLs that need to turn it on. This makes the code more maintainable. This patch changes the behaviour for unsupported IOCTLs. Those IOCTLs will not turn on the camera. Suggested-by: Hans Verkuil Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_v4l2.c | 52 +++++++++++++++++++-----------------= ---- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 350cd2cc88f872d2e8bd19e2b8fb067894916364..94dc97448446d36a85a1b36d16c= 29f22af89c640 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -1222,37 +1222,35 @@ static long uvc_v4l2_unlocked_ioctl(struct file *fi= le, unsigned int cmd, unsigned long arg) { struct uvc_fh *handle =3D file->private_data; + unsigned int converted_cmd =3D v4l2_translate_cmd(cmd); int ret; =20 - /* The following IOCTLs do not need to turn on the camera. */ - switch (cmd) { - case UVCIOC_CTRL_MAP: - case VIDIOC_CREATE_BUFS: - case VIDIOC_DQBUF: - case VIDIOC_ENUM_FMT: - case VIDIOC_ENUM_FRAMEINTERVALS: - case VIDIOC_ENUM_FRAMESIZES: - case VIDIOC_ENUMINPUT: - case VIDIOC_EXPBUF: - case VIDIOC_G_FMT: - case VIDIOC_G_PARM: - case VIDIOC_G_SELECTION: - case VIDIOC_QBUF: - case VIDIOC_QUERYCAP: - case VIDIOC_REQBUFS: - case VIDIOC_SUBSCRIBE_EVENT: - case VIDIOC_UNSUBSCRIBE_EVENT: - return video_ioctl2(file, cmd, arg); - } - - ret =3D uvc_pm_get(handle->stream->dev); - if (ret) + /* The following IOCTLs need to turn on the camera. */ + switch (converted_cmd) { + case UVCIOC_CTRL_QUERY: + case VIDIOC_G_CTRL: + case VIDIOC_G_EXT_CTRLS: + case VIDIOC_G_INPUT: + case VIDIOC_QUERYCTRL: + case VIDIOC_QUERYMENU: + case VIDIOC_QUERY_EXT_CTRL: + case VIDIOC_S_CTRL: + case VIDIOC_S_EXT_CTRLS: + case VIDIOC_S_FMT: + case VIDIOC_S_INPUT: + case VIDIOC_S_PARM: + case VIDIOC_TRY_EXT_CTRLS: + case VIDIOC_TRY_FMT: + ret =3D uvc_pm_get(handle->stream->dev); + if (ret) + return ret; + ret =3D video_ioctl2(file, cmd, arg); + uvc_pm_put(handle->stream->dev); return ret; + } =20 - ret =3D video_ioctl2(file, cmd, arg); - - uvc_pm_put(handle->stream->dev); - return ret; + /* The other IOCTLs can run with the camera off. */ + return video_ioctl2(file, cmd, arg); } =20 const struct v4l2_ioctl_ops uvc_ioctl_ops =3D { --=20 2.50.0.727.gbf7dc18ff4-goog