From nobody Thu Oct 9 20:24:10 2025 Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) (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 D3CC1216E24 for ; Mon, 16 Jun 2025 15:24:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750087494; cv=none; b=QZXJQmxxnD4iSOcHg9hrJQxe7KtLkTzGa9Ukk447AHyNo0tl31N+k+E+i4rk0OvFFcGtK+jxPGe5288mZI1LW/cy7DrPscM0hBHK5jGktST9W84q/NYeA4hhanxHeYlItjyRa52rvoe4A5i6/X60m4bYMbjO+t5IbuTWTdC2BMc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750087494; c=relaxed/simple; bh=6zlPvM8Qqy1qKla5CyeWaPEND1B/TGru/h6GsSwbWG8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=l77RvtZNSJOZ/DJGbk3CSNEGtLHxhc1jiMqnMFAPIHqn8c1AOeyW1ZGmJTXGVpL9BO64snNc8VdjtQyIh6IHAfAGKundwogElQxeBLiDJMa0P6MqdIzoOrqMd+eqBEcb8sSAhwENWdNlxz0LXANddY74+kpQl/cri7qDUyU7KeU= 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=SQh6rL9L; arc=none smtp.client-ip=209.85.167.42 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="SQh6rL9L" Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-54b09cb06b0so5241805e87.1 for ; Mon, 16 Jun 2025 08:24:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1750087490; x=1750692290; 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=SR66obh9Gu7XiDKAF0dd1HLWZ78WF+L7lHafkYYTARU=; b=SQh6rL9LC7Xmo5g+EfiKvV2tVQBc/hNHmU/6oRbAluQ6X5GlyV3w27gKAoGPHuaYVp Z5x5ch0w9Q5CHujLGdqL0Om0TQSpZ2s6AsI9R6hfbD402X0t4fIzN4/JFITcLgcZl+gb 728jOc1z/LS69E/GZTyfKJTgtOAlcpIrQlru8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750087490; x=1750692290; 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=SR66obh9Gu7XiDKAF0dd1HLWZ78WF+L7lHafkYYTARU=; b=OECXwUFce304kUnMxByVYFR+0CkaMz2lwBAwsDJ9hlR6KvuoXS6C/+dF9n9FKfPPyC 0A4HJiiek6Oxec3c2ARufl6TiinTZ6mz5DLbmDX3Yt2j7nJF/e11lDOj705qcbj9MYUT l0b/THFQzN774PK1mAC1Yu0jdesrBjq3EckxiHOFHBFPaZb5lh+EFq7LTOX1r6C8eskR boFrQLnywg2pzGMDtDXbGcHnN/p/8ZbsZ9Nf+CugPMKqYtEWg7g64g5ct3hKl6xI/qt+ 25Onn0sdU6tehxmZRevAzSlyh6ujwPROGG76Tdfatdbfj9//ViE84oObmQDhHu1uxu2w JmNA== X-Forwarded-Encrypted: i=1; AJvYcCUHgA4G6tCBYiShRpgHsbcnD7RuFPdkROrHGE0w1MaJCrQ1/wVno1CAri9dZjHkvHwSZoo/RZoG5Ae1enQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzIHITqsJdAsFJ7qfcGD0Og0Kkupo86RTYlba+fWgINdMwZPM54 DLB+ZvmDIUjM7FJ9EOYEUVs5ttWQ0sMX5QEbodCsUXUMcKOIxpJfegdCcjb0XLGbAg== X-Gm-Gg: ASbGnctZbkngNz6w0ZMk4q7EguXQ1XA4PvpkdFLzcaY+0Rh8WFW9qzQN/H+xdYhLhAd Q4Ifhc4d12uK8jRjULWytoPDkBX1EkAR/l6UtGqIz3XfB/AND1ksXeNHvXggGJQ/ssOGxTX8cfs T0lCB2YGWy/uqxREjLwCXv7yZ96Nrj8EwXZoli5p+6NIG3ap7XRxWF1Al4R4HxegXoZJhlsFneA hZ+lkKjko/jnTxZZnrGLgcWTxPtsFwhxlJffJpSdONb1xceShJtuzTHxEcg7TcFjzht6jwSK2MG 7XKtTDuEIn65WyAqpbTLYqkGUbhG7LA5DWRlv+2jVmFq/PQ1SxE7uTSh+JqBpZRGz99ZNT/gxIq bdA9J7oLMCE545VEbjPsoF231b43x9vKiv0MfVwFYTw== X-Google-Smtp-Source: AGHT+IHwbYB28OtDUIqLt8m7nZBM7xiTsKN5oWPcrIUZ1RpBLxSMoCmGkngbXZRl/AbH+E3wJPx73w== X-Received: by 2002:a05:6512:39c6:b0:553:24f2:c9d8 with SMTP id 2adb3069b0e04-553b6f217damr2458929e87.38.1750087489856; Mon, 16 Jun 2025 08:24:49 -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-553ac1dbcf5sm1564271e87.190.2025.06.16.08.24.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Jun 2025 08:24:49 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 16 Jun 2025 15:24:38 +0000 Subject: [PATCH v4 1/5] 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: <20250616-uvc-fop-v4-1-250286570ee7@chromium.org> References: <20250616-uvc-fop-v4-0-250286570ee7@chromium.org> In-Reply-To: <20250616-uvc-fop-v4-0-250286570ee7@chromium.org> To: Laurent Pinchart , Hans de Goede , Hans Verkuil , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans de Goede , 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 --- 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.rc1.591.g9c95f17f64-goog From nobody Thu Oct 9 20:24:10 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 55BFA21B9E1 for ; Mon, 16 Jun 2025 15:24:52 +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=1750087495; cv=none; b=IzCX25+S41n4tVngPvBYRf+sBRdgyc3aixMpVVrVTzYkUDzgPyhjd/cXYXqrJSEFxoecjMcq8EFz0pvigWHZG6+0zAoC2UPS9724aTRtYSDaR2RJ8fej7h6h94Jjys0F1S+6pEyLLORdR5gf3CcxnSUxwRD8QhVjyb3QobaYD80= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750087495; c=relaxed/simple; bh=VGZlRj6/JcwGJbMiaypib+l9NN/rmQAaBEPvRRaTVBk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=I4hdORb+blcqJ6v+v9OIbwXHKEt24GP8wgVlLfGtueB1Ak0oxmfSI0FJqJodqB0Y3BuEeZG75CZjalYQOV1nhySWbR4fnIBwN4+0iZ1pcv19l031yScKbOejugv4ZgQrCjBDJCFRWDdhp0D0aj/S/qTo/bkaCILsrt5tv22Yfgs= 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=RhPPWsqH; 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="RhPPWsqH" Received: by mail-lf1-f45.google.com with SMTP id 2adb3069b0e04-54d98aa5981so5856193e87.0 for ; Mon, 16 Jun 2025 08:24:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1750087490; x=1750692290; 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=UFtgHVBVDAiEdle9lZJFG2R1x3eYipPxmgDmF+7JNFQ=; b=RhPPWsqHxtq4+OqHpsdDShBiAe/MEic2koNEHS6RVs70VkrOdN56IHyH2sMtEvA1kS MTqs3uRNncTkTaKUpyBWP0e5UJ8kSia8cjqbM2pC3j/cDMODQ2pHCl/XcBVVoWgNZPlG IAySsrf5eAhA/Tm3fKqRRlDxGvhmAi4OY6dkU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750087490; x=1750692290; 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=UFtgHVBVDAiEdle9lZJFG2R1x3eYipPxmgDmF+7JNFQ=; b=OUGDbd5P9vrJtRAv4M4DJKMEp4zB0rZ7mMS6/ElNghd4ucrCbvoOokWB/ScI5k1iwc hX6/CUl43Z8JhyjO1LOdn4DsQowR+USiY2tXIfVK/nxNnW6Y57z9LvjRSbR5/Uh9rsIc /ONq7O3781whZHVZ9Mvnyzdus9CQ33+R9hD4ywOp7dtXcIYPNzkMUHPTevEuIzHdoT9R 122kOAGcC9OGZUf+u/EctO1ZnPjucTgiw+Yf8kPJMROiL9sce5nZKkI/cQdj0Wa8B9FV tgFOKzuqN0AD6IebAqquuTGRholSRa7yh4UrJoWqQR9mB1jK3wAQC6tTO9LKgIBm9tkE Ygsw== X-Forwarded-Encrypted: i=1; AJvYcCVCqwg6N1FhwZkyU0jOpi5v7hRaNMiRGA5mwUJuhMGSm4mTLUp3zMwGOYM4YzJ2QLJy12J31xwx77bhzRM=@vger.kernel.org X-Gm-Message-State: AOJu0YxUrPzWFbxv/uXwGZR1Xb8Dqh3k/h8ig5w+kNxSKCdcTQU3G+9J wtA2qUi7+GALixj9bg0EfS5dN1qTIvvkM3O0PfQUp8zG6hUXA1IKFTYk58hcIkbTEg== X-Gm-Gg: ASbGnctODgs5lvWIfuIODHJ9gOVPlgaqBO5t2h3q+i0bU9xdqIn62EmhG5jQJ4XxBIf vbRNB5QEtVg1w7nJR0D8ujCrxBMMTP7+CXpE68rMj62PmfEC9ESqvoWtsGtENpuS6kO+MtHuJzk ysC8txkdwhWYKMWdAP1Y1ZVSzd2C/9Gl+EeB9Cc9p6rdwcfJ6jEYH2EOafZrMvzNZrN9kBSOYup RAsRmj6fgdR7qcIAAWqdLcnMsWSR3fIdmozBaB4JAZq3l/yVtaV0b6gxBKJPAg4hmVtAFOdu+pM VvfGv1LUyD577OSkI4X9U4auBemWJTL525zszKitAb6qfZ9a7NOMyHMjGx9uDyYF1g2rHi1R15l fNt+ydFxn2xHs/tIyCIHpmB0TAo24ixQUA95Euag0QA== X-Google-Smtp-Source: AGHT+IE/FVVFHkk8r0qUiuV09HgPvz9c2KwY2zvYctVzIMzTqcOZ9wglaIh2OnOY2oJ7FgI4vkXuLg== X-Received: by 2002:a05:6512:3090:b0:553:a4a8:b860 with SMTP id 2adb3069b0e04-553b6da30fdmr2585034e87.0.1750087490428; Mon, 16 Jun 2025 08:24:50 -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-553ac1dbcf5sm1564271e87.190.2025.06.16.08.24.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Jun 2025 08:24:50 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 16 Jun 2025 15:24:39 +0000 Subject: [PATCH v4 2/5] 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: <20250616-uvc-fop-v4-2-250286570ee7@chromium.org> References: <20250616-uvc-fop-v4-0-250286570ee7@chromium.org> In-Reply-To: <20250616-uvc-fop-v4-0-250286570ee7@chromium.org> To: Laurent Pinchart , Hans de Goede , Hans Verkuil , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans de Goede 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 Reviewed-by: Hans erkuil --- 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.rc1.591.g9c95f17f64-goog From nobody Thu Oct 9 20:24:10 2025 Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) (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 A743421D3F6 for ; Mon, 16 Jun 2025 15:24:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750087494; cv=none; b=Zymt62mRj3d4KrabQ/K9/jC1beJMIbJCECk4C0kzMVMkTFpXCNFeGk5OR1zWoK02YNXVfUsWXk8l47+3b1JcHWoyI1cJ0VUeD/bzEZjVLsUDHTgln90aw59BawMbCCxZUGRLxpVHFUQarvHmmPX8CMVNIHITXdS4M/iMTk4IFXY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750087494; c=relaxed/simple; bh=YNM6SC/3f9qdtfvtAokd8Rbd2G9MsDu7yOrOJtV0lds=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gHY68Nih1TFqxT5H3ZKtV7B3T475zMAVMovXnLNhjgUEZzC032HQ1KVX1STLjY/9nYBnP8zjzwoqaNLsDjAi27zgNmrk5V0r4viPKBN8WbP3ar3Q8HrbXObNBQWovsV+w6jGCEr5arZpSHHUtOtwBb50kh82U8SNce+GcKEsRmc= 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=jPioZOL3; arc=none smtp.client-ip=209.85.167.42 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="jPioZOL3" Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-553b82f3767so2222149e87.3 for ; Mon, 16 Jun 2025 08:24:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1750087491; x=1750692291; 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=bL7hot4FBJzREHKHrPXsR0LSAke8lGbxnqSPSSYelSM=; b=jPioZOL3/4aerhtPkjPJ09sDd3p2JSMo//8h/dE8kFcqhhaouDMww6vXDKOYyG0gAW 5we7x+Q3wRZRKjGvsA7RPJpEnHWZYQ/zyV1/CbRkzEJwU42G6SfgYrH4GA0tBxZYWkPJ vlInU90VZImQEEmsWvEtMhq2ylqd01UtzToZI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750087491; x=1750692291; 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=bL7hot4FBJzREHKHrPXsR0LSAke8lGbxnqSPSSYelSM=; b=wx5cpzIjQ/8Cna9lLqJjZsq9zaoj3lUG9lKNVNl7y+AHFDQRuDmFIyqCfv5sMfgw3b LNORodr0VW+Km55AJRvNNhbHkbZGfhMfCycvkOTuG1SOMb1at1HYIbGgHChuQ2+u9qE9 DNUCfaQNOGfqQ8unVlU2ruf57CUYNgxyJhx3hwLHD80t/TkeMD5uBD56wcozTzHSCUkQ ZRA3JlGwVoi7GeiPsn9Z3wnxnYgEpMdj0tcxarUDoPy+Eh0NUpALb8T8ucIby4zJSdZF hglZDBHIZlY0BatyJ6QEDnTVJvAgRIiM9/O9cv9QAxGLkMNUJ4Y0yxchDWWnJgMWDBI1 y44Q== X-Forwarded-Encrypted: i=1; AJvYcCVQCAydLO73ZZHycMs0sBE8Vcn5K5sQYc0ax8bbtgqZIfb9N6LcG1n5M8xH3ZfyIP+mAerKbiR9z6gRGcg=@vger.kernel.org X-Gm-Message-State: AOJu0YxOTAa+7joPGKjMDp1UTcCOHEVo0iZDqsGNg3LU2WU8c5I9goV6 Nn9bQJTjvksQ5/s6v5Hv9SUuyz1SeLDbmJI0PbGltW58jeVKEdDafzHktZox0zLWYg== X-Gm-Gg: ASbGncssblXuEb3r0KcoRTwVo64GSUBo/VZdBavGva8KNdKiWLI1neN2FCKpP/GbhDe hHq42l2Gnxraa1x9YF8xIFS3XbQRQW00e49DJrzY+XATuzdS5DrgmGQQ0/v4iAOplmoQw3reLns DMSPgefVX6U0wpLO2kRsLhsubOgNoNgraByayQdF4zoJk5uA4G+M19LaIEy0Y+ZQ4kJ4J+DjSwu 13tmSmy5I3Y+7JL6pJnvH01Vx66C5d5PaCjALOv5JB1xp66bRVtQADfRv/dZWrZkdB11Iv/Gwzf TW7Q6Cx4N53sH+4znX2FmaB6wI0e/s0etuBUGYrG4R52h4h4/IHselXKeX+bnOYnRnL/1UWwady nVgP27RNVBshmVeyZzdNnwp3f88fKZUC/gUxPInURGA== X-Google-Smtp-Source: AGHT+IH+Gmpu945v+B4LkNCzmEN/GTk4iTMc0teczqPmw14ut29lEvpIT8mqXZPgypA7dvrm2NRPNw== X-Received: by 2002:a05:6512:3b11:b0:553:25f4:695a with SMTP id 2adb3069b0e04-553b6e8af12mr2442376e87.22.1750087490794; Mon, 16 Jun 2025 08:24:50 -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-553ac1dbcf5sm1564271e87.190.2025.06.16.08.24.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Jun 2025 08:24:50 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 16 Jun 2025 15:24:40 +0000 Subject: [PATCH v4 3/5] 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: <20250616-uvc-fop-v4-3-250286570ee7@chromium.org> References: <20250616-uvc-fop-v4-0-250286570ee7@chromium.org> In-Reply-To: <20250616-uvc-fop-v4-0-250286570ee7@chromium.org> To: Laurent Pinchart , Hans de Goede , Hans Verkuil , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans de Goede 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 Reviewed-by: Hans Verkuil --- drivers/media/usb/uvc/uvc_queue.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_queue.c b/drivers/media/usb/uvc/uvc_= queue.c index 8f9737ac729546683ca48f5e71ce3dfacbae2926..3f357c2d48cfd258c26f0342007= d1d12f1e01007 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,15 @@ 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, + .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.rc1.591.g9c95f17f64-goog From nobody Thu Oct 9 20:24:10 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 5FE73221F03 for ; Mon, 16 Jun 2025 15:24:53 +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=1750087495; cv=none; b=lRcQM2YrhTgJmg2oqo1Ajjsvax9FJVSBR7FRkbUtnxE0FMUjG3PKGk5HkLhWAa0UK0MTKh4PRrHdPG6nQOsJ4EL4ReEqXyieHds1qbF2+wm0IQlwCAJBoTe6v/qRdpcVLS1HJ42SSK3pfwvHYMXB4rgdGiZELs+j1Dfw7yU8WrU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750087495; c=relaxed/simple; bh=9kA30+57eWk0fVX8unbNgZkjlYMI/wsqPiSazmWfLtw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iO0jEoOZgKuT+dFsP37w5AwBDCXKUB5NPd53Rtp7MMwsBuW+tEGaVWn5qce7SehCN2cyl7sfacC6e5bq0E7zJ0g+t5t4dX+/vNv1PR74epF/U5kBubOSNnA+Gca2Vem18t4VjKStNNvBtTtVeWenhCjG9aTE3/QQ2tAc8+lu1p0= 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=CAsTgGDk; 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="CAsTgGDk" Received: by mail-lf1-f45.google.com with SMTP id 2adb3069b0e04-54e98f73850so4462201e87.1 for ; Mon, 16 Jun 2025 08:24:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1750087491; x=1750692291; 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=hsPNlHsyKYu+Nk7YIKvEDwnjW+ZYrPSdNGA8EvMV2PM=; b=CAsTgGDkrg5zgIkRCLpa/kJpKeJbzKem9pvAx/E7JAM+K/h2Ac1S+8+Hou8r3h5ZdL td+RM2bR6UY5Dz/3SC/zijeHYipxmCxaOWxyELKnL3R0QWXresNFYZIXBQMWkaJXelRg FBX8zZ/2JMalFHVoOP0U5febEiahS6lTZ/rvQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750087491; x=1750692291; 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=hsPNlHsyKYu+Nk7YIKvEDwnjW+ZYrPSdNGA8EvMV2PM=; b=CImxNCZg0jlBknqHmrF6SJB4Dpvv7z1nLNF5TtUfKV1OvoDDZeuJVXxHgg981lzvD/ vT4ohq7baNM69Nl+/Jj6vjYh8DVi1yPJtTjDZOcPOJozHcPmqqIq/a+sb4hLIe/luMlL uuVKIV3qQ5+RlVNWI6hwOtMT1aOodD4J4fOX6xLZ4h6DWTiHoow8bVv+dTqO2QMLMzCK qh7Jp3R2F6E3QBVE4uB9kEqmKw8te/L1pxld4aXJytoiCbFJ16FrryElGVQY6a3f9Y5v SvQ2JqM/j7TerTLF0PfdNVjhsnEn0C9pwcgiGmlfYdbrYw6J9Yo3yioWiMDZUavQq6Jr Q6Qw== X-Forwarded-Encrypted: i=1; AJvYcCXuxBoxmeY+BZhaF3+PTMrou0XuGCjoGLDeJ1IUV8iE223Y2hxskkqm1qaTG4HFVWJNpSGIK3nOMnbgOw8=@vger.kernel.org X-Gm-Message-State: AOJu0YyvMPRcovkczFx83L1Mu4eMYMMFM0mdbLd6FXRIQQW406FidojH PcgA8BbRY3cDb5etoHpPvTU/eYdqHW2Xlx1deap41RgpGLJYhNYPZUNRUmTLb3KnbA== X-Gm-Gg: ASbGnct0mQ5JeJoYUCuDwREq9vXr5bqDSuVIsV7SrfhHE0eSWNGnsGa7ROC7kqu1QWm NryIiXhr5VdW/J4Z1FS9akAnnQGl7abnVMzcTtFnZUkYeFHIfftBWTFRInhE0oa3YuV7CrsqXT1 UHkZxGIKdsGp9OxFxqKGf9CLcW6AELF1+KjpfVfUlg0ZkNqtl9nq4q2YL7+UV+F8TO27oGySX/b 63eFCEnTKmrEfHbAdjHCFuGKNXCrfB4n2HATowTEvtc92ALErB6/HgICu4EfjNFjHiBQ+K4GzZU 79MUdPmoUp2tGIxBPPh6QvzaUFXD9M/N+M8ZuPSf6oxgW278v/wKesEMkTY/T3f4pkY7HNDI0rg 4CmSyYhCvpbTidV4XdQ20mnd/bHt8uWtgaYad+si2dA== X-Google-Smtp-Source: AGHT+IF0Vzm6zGi8l3n7i0OflXc6dTdNk8cfglD8KGqDzscDTr0vc4XtOn3o3k7EBq/QfdcIE2AFfQ== X-Received: by 2002:a05:6512:4026:b0:553:24b7:2f6f with SMTP id 2adb3069b0e04-553b6f45ccfmr2413522e87.51.1750087491329; Mon, 16 Jun 2025 08:24:51 -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-553ac1dbcf5sm1564271e87.190.2025.06.16.08.24.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Jun 2025 08:24:50 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 16 Jun 2025 15:24:41 +0000 Subject: [PATCH v4 4/5] 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: <20250616-uvc-fop-v4-4-250286570ee7@chromium.org> References: <20250616-uvc-fop-v4-0-250286570ee7@chromium.org> In-Reply-To: <20250616-uvc-fop-v4-0-250286570ee7@chromium.org> To: Laurent Pinchart , Hans de Goede , Hans Verkuil , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans de Goede 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 Reviewed-by: Hans Verkuil --- 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 3f357c2d48cfd258c26f0342007d1d12f1e01007..6e845705b3286348a60650eb262= e620dc6039d60 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.rc1.591.g9c95f17f64-goog From nobody Thu Oct 9 20:24:10 2025 Received: from mail-lf1-f51.google.com (mail-lf1-f51.google.com [209.85.167.51]) (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 44D3C241685 for ; Mon, 16 Jun 2025 15:24:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750087496; cv=none; b=nvlSEU6UtYEyUwU3jUAQT+fxPa6mKuFxm8dpbtjezxSrheXOf/abythNQlzDbQ/I+koNTzR/iSyOTq60cjqXlDcdi/YzZ/xnVazPTjE/WuaeBwNSyNNk78DDcowid8CvJyD+N3ItDoHRYi2aQC/x1Gc/Ns+8X4zB85BPTk3P2lY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750087496; c=relaxed/simple; bh=c1fcbRjJ58/n6v45d0hGUAr9YIahYT5F9yuooQ1PvsY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=E3VFXVh2+AVuKTvD8ZUkkpIAtUzlJUqF8JL7g1tDMTLFsk0H8xtGLSqEY2SMHqoJ0scXxO2e5NyWuLqcIJx5xji7tWD7XC2ylpTvSb6MB0Hsk/xJmIa7YCKe+4cNEOM+py32lNqvx1Z2vjt43p3IA4VSEoSx6IlNArO7ciBYJHY= 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=QrrFgB9+; arc=none smtp.client-ip=209.85.167.51 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="QrrFgB9+" Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-551ed563740so5034868e87.2 for ; Mon, 16 Jun 2025 08:24:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1750087492; x=1750692292; 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=HLP+dzsQogEKVLSLXZuJGypFkFhYImTXNZozm06VbFk=; b=QrrFgB9+kDog4SRjcMILPaD4HjBq5Q9dZHK3GtCw60wU4Ox5V9zKi5h5jqIyXoKMEr 3dHVwKo3gIT17kbw4bQQllfbOUaYL9yfmw/717k/9yxoYuJxMAm33Hg1yTeQaXO9uUs0 7yyCWQMSoAgM4RZDXlPZkAXCkCSpqGzBHbueQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750087492; x=1750692292; 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=HLP+dzsQogEKVLSLXZuJGypFkFhYImTXNZozm06VbFk=; b=wDdUTNIFs4UcaTVQh/tC8ugov9w+viQbrVLIbiM+We2h7ghP+CTPOpMj82NFgxigQS UaiysLrsUQfIjoJw1mJrLN2Ncjm81aGlgshiiCjcJ2PdXpMhXkVQNQXO5oqqAe4EwzGj Dd9yhBGKTp4CRixab9HLe7utcp4ZnV+VjB585fhUR73kUPoUvtyq57VDaUbWSqKhpYz+ z/9reeF4A+zR0oDAsPJ3Gu/wDuWG94lO78y0td/OeJFfN23jKrbW+ce62y0NjauSsycI OK/4RCWitfuGhcDbHMfGyG/6bxYB5ixfc93GhIcCjBG1zEav85/CzkIEP56z206S6jNA bf1g== X-Forwarded-Encrypted: i=1; AJvYcCUAuZAtsGb/qyu2QViKjREZXNMDI+MmfWRBjneyz8PVflNZ5BsEtHVwLKcNk1sBNKuDtKAoKm3txsp71ok=@vger.kernel.org X-Gm-Message-State: AOJu0YxETEZjSz/pEjdr1yX99MHc3p+yhlqS4WPWh8Xwf7jU6Bhj4WVN lJ+I/8r1+Qb3gXPMVKH8Dhw6o8x1cyzSUVjV2w+yUnAQgdGZK+zt0gElynguwwBu5b2MXXuWZ6A dD7fGsA== X-Gm-Gg: ASbGncsGW65wFFEfEqRWNY8eNqE6L+8GhljUDvZnVn9vEamC+RUaQ5VRwmqpLYhLQbK og2Eu+5IyHA2XGM4QHd/0LJNB6eZlZq6SsXBVdTn44ULBPpM64YcoVhekgyLNtKrmwb21XcQh0A mNK6dUf2Xn64t9UjwExQt/bn3xf3MkrDGlns5sffNpim+N42r/aPQe3b74nU6HdVkaC77VqzH4e 9TTN0Pe9rCRI3tdnBk7WQAYMVAFRvjOaNl0LCCScVjvyFB6nxkiHoN535wlYMtMZENeokauj/C1 eZ6C6s66secMYaREFsUxqgYsVAc7azZ9cfYBxHBS/BnqSqolCL/iGS0KMFkDJPnxIEHQKdrbUFH B3sbDW4UWbAMNX0E0LCJaB75x5yaz7ykbHSfqPEw9jA== X-Google-Smtp-Source: AGHT+IHwrxVZaHqzzhsZCvCL26mk133FyEJL7YcfSwuEUUONI/k50br6D5fDapNxD/sPjvUNsvQtfw== X-Received: by 2002:a05:6512:1105:b0:553:2450:58a6 with SMTP id 2adb3069b0e04-553b6e75904mr2244348e87.1.1750087492221; Mon, 16 Jun 2025 08:24:52 -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-553ac1dbcf5sm1564271e87.190.2025.06.16.08.24.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Jun 2025 08:24:51 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 16 Jun 2025 15:24:42 +0000 Subject: [PATCH v4 5/5] media: uvcvideo: Use prio state from v4l2_device 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: <20250616-uvc-fop-v4-5-250286570ee7@chromium.org> References: <20250616-uvc-fop-v4-0-250286570ee7@chromium.org> In-Reply-To: <20250616-uvc-fop-v4-0-250286570ee7@chromium.org> To: Laurent Pinchart , Hans de Goede , Hans Verkuil , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.2 Currently, a UVC device can have multiple chains, and each chain maintains its own priority state. While this behavior is technically correct for UVC, uvcvideo is the *only* V4L2 driver that does not utilize the priority state defined within `v4l2_device`. This patch modifies uvcvideo to use the `v4l2_device` priority state. While this might not be strictly "correct" for uvcvideo's multi-chain design, it aligns uvcvideo with the rest of the V4L2 drivers, providing "correct enoug= h" behavior and enabling code cleanup in v4l2-core. Also, multi-chain devices are extremely rare, they are typically implemented as two independent usb devices. Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_driver.c | 2 -- drivers/media/usb/uvc/uvcvideo.h | 1 - 2 files changed, 3 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index accfb4ca3c72cb899185ddc8ecf4e29143d58fc6..e3795e40f14dc325e5bd120f5f4= 5b60937841641 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -1728,7 +1728,6 @@ static struct uvc_video_chain *uvc_alloc_chain(struct= uvc_device *dev) INIT_LIST_HEAD(&chain->entities); mutex_init(&chain->ctrl_mutex); chain->dev =3D dev; - v4l2_prio_init(&chain->prio); =20 return chain; } @@ -2008,7 +2007,6 @@ int uvc_register_video_device(struct uvc_device *dev, vdev->fops =3D fops; 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) diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 3e6d2d912f3a1cfcf63b2bc8edd3f86f3da305db..5ed9785d59c698cc7e0ac69955b= 892f932961617 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -354,7 +354,6 @@ struct uvc_video_chain { * uvc_fh.pending_async_ctrls */ =20 - struct v4l2_prio_state prio; /* V4L2 priority state */ u32 caps; /* V4L2 chain-wide caps */ u8 ctrl_class_bitmap; /* Bitmap of valid classes */ }; --=20 2.50.0.rc1.591.g9c95f17f64-goog