From nobody Wed Feb 11 05:18:01 2026 Received: from mail-qt1-f180.google.com (mail-qt1-f180.google.com [209.85.160.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 7DD8023D7 for ; Wed, 27 Mar 2024 08:24:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711527892; cv=none; b=CWXULcqNdHNUrEwH4iJLH4p1C4hPHgTDXLcQgPGZgjulHqLIrVKZfYX57A2q3ql1l3WYGZByXn3zFmmY8MqrtvmW6c3dNgshvsWBcXESiW+lmjfmGqZ48yx40f9oxkfvo3izwmgTM+0DzIYM2d02HDB+20N1JGyabnLxJaxwY28= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711527892; c=relaxed/simple; bh=IbGWx43paY/eY3BoKH9LIehCJLKILNpJ3miMe4Ay6xU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZNzW/aDBv9n12Hc/3DSvS46WzEh8nyOO1AYdxXlHfDYiqfPMWxK45SuWauejz3v9sRnJjdEChA7+KJu9ueilA/RH/A74wAWH+flHvdFSOwozU+gY5EuPtbA6eoIahHBt+QNmfno5GZX/fOeOFdb0BHk93Mo0C1RKEPGoZMjTB4I= 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=j195btc+; arc=none smtp.client-ip=209.85.160.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="j195btc+" Received: by mail-qt1-f180.google.com with SMTP id d75a77b69052e-430ad286ab8so36924821cf.1 for ; Wed, 27 Mar 2024 01:24:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1711527889; x=1712132689; 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=yu6CRq784zZk8JmoJH+VcllViInTfNkEV44O9xYOrqY=; b=j195btc+VTQAeWheL6eIlXjFDfcR87V3HGPtAkf5AM9y4VKX4MVYtflg7RPLiupkbh SITfTx+3alq059iL6R0ASdTwA6Qr5OePwsrFfDlQGIbT3G4xiaOBOlGLgxVWKgfhUXtD EHgPnYd5nTS4EnKfnRwVR1UmzWHd2ZD72QTOQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711527889; x=1712132689; 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=yu6CRq784zZk8JmoJH+VcllViInTfNkEV44O9xYOrqY=; b=N6QkXIIm69OshybY9Xq/3/7MxAklR5/tYiT7uMCKqOI1mYkJGhnaQqFr7HNbT1oyxS iTbI0N6EG+IzHlKs7KiGN9FFaEWVbAnFfUaiLqfvUkYAdJGnIx9Cd/NsvGAejxQfKXTR kQCzxh7+QhG55WnwezVDcE8gqGlI6m4cIdp3ZjjPJe5bUzteOZA8fpXPpTiDZU4S0sg+ pTUg1bKuhdiB4vzOLopPkrd+pIHYiyAUl9KRXGcnHxxQM3i+zNOyOD623KAlGQS1QzjW Ns2PyXGJHkdGBg1vibhpMQGNC8rj46k6FucCHVcMltHwPSlzbgFZ3G1K5VqtiETF3oEB cEAQ== X-Forwarded-Encrypted: i=1; AJvYcCWnvWDssjFUP7VPays6kzDOZ+c0AkHJsFXsyWKptT1PBITCLt6PgIMzr/Z3yjJDegQ+zMgLFZSKbHbE4t/Y1zPM9F8McbDPfKHqXybk X-Gm-Message-State: AOJu0Yzr6AGjNSXfTJr1pwp8jZpIDNc/oSVlQzF2TwHjWELQLXi4yCSz Vap62E6I1+WUDsNvzi67AtNQhMwEd7Ll1mXisGwseMS/y/120Z9IWluKeb/gOw== X-Google-Smtp-Source: AGHT+IGgVDltHpo85/iezWoRecn1u3UhxgTUnv8za/M4lLvLgH586s4zoUdEZcsJsYWBFRbX5QyQxg== X-Received: by 2002:a05:622a:2a07:b0:431:80c9:ab17 with SMTP id hc7-20020a05622a2a0700b0043180c9ab17mr683009qtb.29.1711527889256; Wed, 27 Mar 2024 01:24:49 -0700 (PDT) Received: from denia.c.googlers.com (131.65.194.35.bc.googleusercontent.com. [35.194.65.131]) by smtp.gmail.com with ESMTPSA id ca9-20020a05622a1f0900b00430ea220b32sm4581691qtb.71.2024.03.27.01.24.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Mar 2024 01:24:48 -0700 (PDT) From: Ricardo Ribalda Date: Wed, 27 Mar 2024 08:24:44 +0000 Subject: [PATCH v4 1/4] media: uvcvideo: stop stream during unregister 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: <20240327-guenter-mini-v4-1-49955c198eae@chromium.org> References: <20240327-guenter-mini-v4-0-49955c198eae@chromium.org> In-Reply-To: <20240327-guenter-mini-v4-0-49955c198eae@chromium.org> To: Mauro Carvalho Chehab Cc: Guenter Roeck , Max Staudt , Tomasz Figa , Laurent Pinchart , Alan Stern , Hans Verkuil , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Sean Paul , Ricardo Ribalda , Sakari Ailus X-Mailer: b4 0.12.4 uvc_unregister_video() can be called asynchronously from uvc_disconnect(). If the device is still streaming when that happens, a plethora of race conditions can happen. Make sure that the device has stopped streaming before exiting this function. If the user still holds handles to the driver's file descriptors, any ioctl will return -ENODEV from the v4l2 core. This change make uvc more consistent with the rest of the v4l2 drivers using the vb2_fop_* and vb2_ioctl_* helpers. Suggested-by: Hans Verkuil Signed-off-by: Ricardo Ribalda Reviewed-by: Sergey Senozhatsky --- drivers/media/usb/uvc/uvc_driver.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index bbd90123a4e76..17fc945c8deb6 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -1911,8 +1911,19 @@ static void uvc_unregister_video(struct uvc_device *= dev) if (!video_is_registered(&stream->vdev)) continue; =20 + /* + * Serialize other access to the stream. + */ + mutex_lock(&stream->mutex); + uvc_queue_streamoff(&stream->queue, stream->type); video_unregister_device(&stream->vdev); video_unregister_device(&stream->meta.vdev); + mutex_unlock(&stream->mutex); + + /* + * Now the vdev is not streaming and all the ioctls will + * return -ENODEV + */ =20 uvc_debugfs_cleanup_stream(stream); } --=20 2.44.0.396.g6e790dbe36-goog From nobody Wed Feb 11 05:18:01 2026 Received: from mail-qt1-f176.google.com (mail-qt1-f176.google.com [209.85.160.176]) (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 EF2422E645 for ; Wed, 27 Mar 2024 08:24:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711527893; cv=none; b=PZ1eBWhNc6zyOOccCMtsL2eK6xNK2PUNZLScNSU7cxUj5gzSay4LJXOakubLr5BmS293NqGCKpeuUClYO8YZzhFBpRV2utZ0XD6Mbg/if0342j6xSwdQNjLx8qNwOvX0sDbN/oCzhtbLJPTqzauzgtkk1J3zGwSa0c7OQ4Iyct0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711527893; c=relaxed/simple; bh=9RLuwP/ogAKSLndvjalwDyIeMRGXBo7XEO//Re2gJyk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fhnrGXvbBGLRf/cK9wOlsICrHW5RRDxLZ+KgVolqy9wnQ8/tHJ1gMPrQ2TqXmxuyO0SJT4TEueNq/oBYQDxPmzhEGv+ivbc/ZNe8N9Nv0b9Yt1Wom1OyOS/xxwMnZ9oaBImPpABY+fxga+Yuh2dUHPR4HFV7dRNWJFJsp6HwMaM= 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=KN2VspRS; arc=none smtp.client-ip=209.85.160.176 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="KN2VspRS" Received: by mail-qt1-f176.google.com with SMTP id d75a77b69052e-430c63d4da9so45520881cf.0 for ; Wed, 27 Mar 2024 01:24:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1711527891; x=1712132691; 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=OmWRpBECwxe7ijkwLIPczozPsnS1Cw5Xsz7/RS0qQRY=; b=KN2VspRSefxtVCrZwxhPyUR3lyvvXDry6xKhdC9et//LgUKh5H5xwzegX7Yfn9PJ8b TWWIlCZJa62htCAp6yvw2FYJvQE2vOOedJig99A3mOIsYmK6U+aTAofQc8iabmis2v2a EoTlH6WjhMJFREThjwvC8b2SDwcCnDsElQhEY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711527891; x=1712132691; 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=OmWRpBECwxe7ijkwLIPczozPsnS1Cw5Xsz7/RS0qQRY=; b=Ur8PxqM8+v4g4Ldow/TQJTdckIG1WhI1Abrp6t9jJuIVGmN+CwpUlRKqohFFneATnv 57CYTXYBPL6ZoLkvYQFe0oqt1h4bvZnVxnS6/kRzqcA1kG/ecsUE65ZY+0QOq/K6uSXj nig9+jtNSRoeZc1Qa/uDzXrjZqmGwIECJFbMDJ/pNPl1mspiKz0HaJWq3BCNWrGPmCkV CAP/FJR9VUHQ/8/h7RXZK/b3D9f4P29iDEYEfp7gE9b8b1KobLcJ4HiLIeahLLBRLgU9 /fKlMlGt/fQXGY1pGliMrHDxX/Eas+lj2xzd6ErzSCpF9Gk/9q/Jun5/rsCH1Hacumi5 keyw== X-Forwarded-Encrypted: i=1; AJvYcCXkmcef/I6MbzVef3lRsgQ9AtOcZRb8/O2sBpb1N1cXD/qCEHG3g4b6uW67Pz/nU1h5bdX31nEpYZV0eoE4y3TlP++JAplMez9PSSot X-Gm-Message-State: AOJu0Yy2rMyBkca8+gJWzIBMMoozZGfQZrLZfhDoVekOct2wZQyzOPN5 /THAwl4m9UuNPr0cm20qQMPfjs7vTCx0dtMAv9O0PxmS4i70ApfW5Ighf3BgDw== X-Google-Smtp-Source: AGHT+IHcrYLlePvtS2L+3EOSxz98tF2AwNVGbSteXEp13d492FBjYS/lfiS4OitGu1Suvpn3kOVSXw== X-Received: by 2002:a05:622a:253:b0:431:50a0:9154 with SMTP id c19-20020a05622a025300b0043150a09154mr4232946qtx.18.1711527890552; Wed, 27 Mar 2024 01:24:50 -0700 (PDT) Received: from denia.c.googlers.com (131.65.194.35.bc.googleusercontent.com. [35.194.65.131]) by smtp.gmail.com with ESMTPSA id ca9-20020a05622a1f0900b00430ea220b32sm4581691qtb.71.2024.03.27.01.24.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Mar 2024 01:24:49 -0700 (PDT) From: Ricardo Ribalda Date: Wed, 27 Mar 2024 08:24:45 +0000 Subject: [PATCH v4 2/4] media: uvcvideo: Refactor the status irq API 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: <20240327-guenter-mini-v4-2-49955c198eae@chromium.org> References: <20240327-guenter-mini-v4-0-49955c198eae@chromium.org> In-Reply-To: <20240327-guenter-mini-v4-0-49955c198eae@chromium.org> To: Mauro Carvalho Chehab Cc: Guenter Roeck , Max Staudt , Tomasz Figa , Laurent Pinchart , Alan Stern , Hans Verkuil , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Sean Paul , Ricardo Ribalda , Sakari Ailus X-Mailer: b4 0.12.4 There are two different use-cases of uvc_status(): - adding/removing a user when the camera is open/closed - stopping/starting when the camera is suspended/resumed Make the API reflect these two use-cases and move all the refcounting and locking logic to the uvc_status.c file. Signed-off-by: Ricardo Ribalda Reviewed-by: Sergey Senozhatsky --- drivers/media/usb/uvc/uvc_driver.c | 13 ++------- drivers/media/usb/uvc/uvc_status.c | 55 ++++++++++++++++++++++++++++++++++= ++-- drivers/media/usb/uvc/uvc_v4l2.c | 22 +++++---------- drivers/media/usb/uvc/uvcvideo.h | 10 ++++--- 4 files changed, 67 insertions(+), 33 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index 17fc945c8deb6..b579644ac0745 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -2116,7 +2116,6 @@ static int uvc_probe(struct usb_interface *intf, INIT_LIST_HEAD(&dev->streams); kref_init(&dev->ref); atomic_set(&dev->nmappings, 0); - mutex_init(&dev->lock); =20 dev->udev =3D usb_get_dev(udev); dev->intf =3D usb_get_intf(intf); @@ -2282,10 +2281,7 @@ static int uvc_suspend(struct usb_interface *intf, p= m_message_t message) /* Controls are cached on the fly so they don't need to be saved. */ if (intf->cur_altsetting->desc.bInterfaceSubClass =3D=3D UVC_SC_VIDEOCONTROL) { - mutex_lock(&dev->lock); - if (dev->users) - uvc_status_stop(dev); - mutex_unlock(&dev->lock); + uvc_status_suspend(dev); return 0; } =20 @@ -2316,12 +2312,7 @@ static int __uvc_resume(struct usb_interface *intf, = int reset) return ret; } =20 - mutex_lock(&dev->lock); - if (dev->users) - ret =3D uvc_status_start(dev, GFP_NOIO); - mutex_unlock(&dev->lock); - - return ret; + return uvc_status_resume(dev); } =20 list_for_each_entry(stream, &dev->streams, list) { diff --git a/drivers/media/usb/uvc/uvc_status.c b/drivers/media/usb/uvc/uvc= _status.c index a78a88c710e24..375a95dd30110 100644 --- a/drivers/media/usb/uvc/uvc_status.c +++ b/drivers/media/usb/uvc/uvc_status.c @@ -257,6 +257,8 @@ int uvc_status_init(struct uvc_device *dev) unsigned int pipe; int interval; =20 + mutex_init(&dev->status_lock); + if (ep =3D=3D NULL) return 0; =20 @@ -302,18 +304,22 @@ void uvc_status_cleanup(struct uvc_device *dev) kfree(dev->status); } =20 -int uvc_status_start(struct uvc_device *dev, gfp_t flags) +static int __uvc_status_start(struct uvc_device *dev, gfp_t flags) { + lockdep_assert_held(&dev->status_lock); + if (dev->int_urb =3D=3D NULL) return 0; =20 return usb_submit_urb(dev->int_urb, flags); } =20 -void uvc_status_stop(struct uvc_device *dev) +static void __uvc_status_stop(struct uvc_device *dev) { struct uvc_ctrl_work *w =3D &dev->async_ctrl; =20 + lockdep_assert_held(&dev->status_lock); + /* * Prevent the asynchronous control handler from requeing the URB. The * barrier is needed so the flush_status change is visible to other @@ -350,3 +356,48 @@ void uvc_status_stop(struct uvc_device *dev) */ smp_store_release(&dev->flush_status, false); } + +int uvc_status_resume(struct uvc_device *dev) +{ + int ret =3D 0; + + mutex_lock(&dev->status_lock); + if (dev->status_users) + ret =3D __uvc_status_start(dev, GFP_NOIO); + mutex_unlock(&dev->status_lock); + + return ret; +} + +void uvc_status_suspend(struct uvc_device *dev) +{ + mutex_lock(&dev->status_lock); + if (dev->status_users) + __uvc_status_stop(dev); + mutex_unlock(&dev->status_lock); +} + +int uvc_status_get(struct uvc_device *dev) +{ + int ret =3D 0; + + mutex_lock(&dev->status_lock); + if (!dev->status_users) + ret =3D __uvc_status_start(dev, GFP_KERNEL); + if (!ret) + dev->status_users++; + mutex_unlock(&dev->status_lock); + + return ret; +} + +void uvc_status_put(struct uvc_device *dev) +{ + mutex_lock(&dev->status_lock); + if (dev->status_users =3D=3D 1) + __uvc_status_stop(dev); + WARN_ON(!dev->status_users); + if (dev->status_users) + dev->status_users--; + mutex_unlock(&dev->status_lock); +} diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index f4988f03640ae..97c5407f66032 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -628,20 +628,13 @@ static int uvc_v4l2_open(struct file *file) return -ENOMEM; } =20 - mutex_lock(&stream->dev->lock); - if (stream->dev->users =3D=3D 0) { - ret =3D uvc_status_start(stream->dev, GFP_KERNEL); - if (ret < 0) { - mutex_unlock(&stream->dev->lock); - usb_autopm_put_interface(stream->dev->intf); - kfree(handle); - return ret; - } + ret =3D uvc_status_get(stream->dev); + if (ret) { + usb_autopm_put_interface(stream->dev->intf); + kfree(handle); + return ret; } =20 - stream->dev->users++; - mutex_unlock(&stream->dev->lock); - v4l2_fh_init(&handle->vfh, &stream->vdev); v4l2_fh_add(&handle->vfh); handle->chain =3D stream->chain; @@ -670,10 +663,7 @@ static int uvc_v4l2_release(struct file *file) kfree(handle); file->private_data =3D NULL; =20 - mutex_lock(&stream->dev->lock); - if (--stream->dev->users =3D=3D 0) - uvc_status_stop(stream->dev); - mutex_unlock(&stream->dev->lock); + uvc_status_put(stream->dev); =20 usb_autopm_put_interface(stream->dev->intf); return 0; diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 6fb0a78b1b009..00b600eb058cc 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -555,8 +555,6 @@ struct uvc_device { =20 const struct uvc_device_info *info; =20 - struct mutex lock; /* Protects users */ - unsigned int users; atomic_t nmappings; =20 /* Video control interface */ @@ -578,6 +576,8 @@ struct uvc_device { struct usb_host_endpoint *int_ep; struct urb *int_urb; struct uvc_status *status; + struct mutex status_lock; /* Protects status_users */ + unsigned int status_users; bool flush_status; =20 struct input_dev *input; @@ -744,8 +744,10 @@ int uvc_register_video_device(struct uvc_device *dev, int uvc_status_init(struct uvc_device *dev); void uvc_status_unregister(struct uvc_device *dev); void uvc_status_cleanup(struct uvc_device *dev); -int uvc_status_start(struct uvc_device *dev, gfp_t flags); -void uvc_status_stop(struct uvc_device *dev); +int uvc_status_resume(struct uvc_device *dev); +void uvc_status_suspend(struct uvc_device *dev); +int uvc_status_get(struct uvc_device *dev); +void uvc_status_put(struct uvc_device *dev); =20 /* Controls */ extern const struct uvc_control_mapping uvc_ctrl_power_line_mapping_limite= d; --=20 2.44.0.396.g6e790dbe36-goog From nobody Wed Feb 11 05:18:01 2026 Received: from mail-qt1-f182.google.com (mail-qt1-f182.google.com [209.85.160.182]) (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 3FBC52E851 for ; Wed, 27 Mar 2024 08:24:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711527893; cv=none; b=iK6Hwlzcc8YG6b032B3by1RPiG7H5DRADON6QxTIYIkl6LGFqBVVRtCNNyANUK5haUr8/hfrRszhwoNC+RUp5S8IudNE5+T8zStkz5pbcjFdAFQ8hBYaIYezWqWB0UPIXmgu5tKlT6Mbpb4iRx4F5QfMhpfWmQOyke4Zyc0cvoA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711527893; c=relaxed/simple; bh=nahiOHPE8IkoaUj7w2mRwbmhYqYPACwR6bZojjKSo5U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uIy1NWpYazBm3y/iVttAYHk9tmx56A/z+fRIu8eZz7tojONUxAspMfkYVA7tvGqqtrwfmoKCs91pOQ9O8jUAvCiopi/F1s/+HDiFlnY2gYhO3uRjuvEYSluat51uQ5UQFQCzXGPlSee9+SGKibBUwNgbCZOTEL8nNAyce0xgfC0= 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=ehGslJHm; arc=none smtp.client-ip=209.85.160.182 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="ehGslJHm" Received: by mail-qt1-f182.google.com with SMTP id d75a77b69052e-430c41f3f89so5710511cf.0 for ; Wed, 27 Mar 2024 01:24:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1711527891; x=1712132691; 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=KkLI9A62H1Ggh1TCkrNUBd+w+3o29QTz44nWNnN5YQA=; b=ehGslJHm5IXl9yQVuCJylonirPcnS3eQBD4CvC4/vwO8y2nejVQkF3w6ZimSMZ0oMO +gf0y63rkdhVn3FEwPusmdNhaLsd40Lba/bm14gwviaV0lHD1NtairyLJHIyCzzdhsyh yjN5cj2/3W1lWN3J09vjJvfLG4K051G/4DD8I= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711527891; x=1712132691; 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=KkLI9A62H1Ggh1TCkrNUBd+w+3o29QTz44nWNnN5YQA=; b=kTQabWgNzUBA2z1/6n06TtADyfLPvVSRjsYnPfM2FpB4LVhzf+38x9xQjCelE3rlIj vln8sgGd21ht+Dw3vc0F5VRIhF+rl18FmeW6LbXCYVi0SyDjjHDn3Crfj6PZTa9bhzGC Si3ig+1aG3bpx41Qyzdal7Awi5peHVe+HdesnA3UW1yUFmEuZFpn7xfy3eHZYGlqkFU6 9Km4dJSb9uW6SA//r+gU6til9lp0FMsJAsYEcF5SkXuaiCYmPf42AzzUxdPk9dXZ//NU T6kjFps2qA+OO3jK1/K7yUTBzoBORNB9SgssHAeGXK8G6Vsr2abghwCPuMwKEokTVNyR 3hlA== X-Forwarded-Encrypted: i=1; AJvYcCW4yi69abncTaox/MeReluyFaUQA5lBgNuuSOoVOepQa3UIhkxs9AV/LhzwjuRTDgT0ZfdUSm+hYm/ld6HNBmnQs/lWXYmygft7e6qE X-Gm-Message-State: AOJu0YwtjR1Dt3JhiKNCqnRyo0b4Lpw/vREP/2U7wK6aq+mlTbR9K7wL ixBjmeIGt9GFtTos8PD3GXZNE7u1IvHCnx3uZWHIx3zi+hU1JUvO9WvTESH78g== X-Google-Smtp-Source: AGHT+IGNUblwo/JlwehDtdXHQDYBlalI2e9kD1Y2cVhoODvGCnn0vyY+nubC8YlGQFiQ/qJcUAgU9w== X-Received: by 2002:a05:622a:40a:b0:431:503e:4139 with SMTP id n10-20020a05622a040a00b00431503e4139mr6285588qtx.14.1711527891164; Wed, 27 Mar 2024 01:24:51 -0700 (PDT) Received: from denia.c.googlers.com (131.65.194.35.bc.googleusercontent.com. [35.194.65.131]) by smtp.gmail.com with ESMTPSA id ca9-20020a05622a1f0900b00430ea220b32sm4581691qtb.71.2024.03.27.01.24.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Mar 2024 01:24:50 -0700 (PDT) From: Ricardo Ribalda Date: Wed, 27 Mar 2024 08:24:46 +0000 Subject: [PATCH v4 3/4] media: uvcvideo: Avoid race condition during unregister 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: <20240327-guenter-mini-v4-3-49955c198eae@chromium.org> References: <20240327-guenter-mini-v4-0-49955c198eae@chromium.org> In-Reply-To: <20240327-guenter-mini-v4-0-49955c198eae@chromium.org> To: Mauro Carvalho Chehab Cc: Guenter Roeck , Max Staudt , Tomasz Figa , Laurent Pinchart , Alan Stern , Hans Verkuil , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Sean Paul , Ricardo Ribalda , Sakari Ailus X-Mailer: b4 0.12.4 The control events are handled asynchronously by the driver. Once the control event are handled, the urb is re-submitted. If we simply kill the urb, there is a chance that a control event is waiting to be processed, which will re-submit the urb after the device is disconnected. uvc_status_suspend() flushes the async controls and stops the urb in a correct manner. Signed-off-by: Ricardo Ribalda Reviewed-by: Sergey Senozhatsky --- drivers/media/usb/uvc/uvc_status.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/usb/uvc/uvc_status.c b/drivers/media/usb/uvc/uvc= _status.c index 375a95dd30110..8fd8250110e2f 100644 --- a/drivers/media/usb/uvc/uvc_status.c +++ b/drivers/media/usb/uvc/uvc_status.c @@ -294,7 +294,7 @@ int uvc_status_init(struct uvc_device *dev) =20 void uvc_status_unregister(struct uvc_device *dev) { - usb_kill_urb(dev->int_urb); + uvc_status_suspend(dev); uvc_input_unregister(dev); } =20 --=20 2.44.0.396.g6e790dbe36-goog From nobody Wed Feb 11 05:18:01 2026 Received: from mail-qt1-f170.google.com (mail-qt1-f170.google.com [209.85.160.170]) (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 510A336103 for ; Wed, 27 Mar 2024 08:24:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711527894; cv=none; b=nRwMIgLmVQHFtbMtJictPW+SC9N5csicclQgRjaQtOLqUUMJwlaxnYz5uIHBmZ5OqTLJLOg8kFHKeGAtrbyHjPUW3C+TNH7+YqchFxuCySuS1CX6pfDUG+mD+cfbCZkSE6E2Tu+D2U3pAyIDHXtBuw5EhZyifPqH07Xl/fO+fKM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711527894; c=relaxed/simple; bh=bRmG+R4WpzyKvUI1uUWRSJ67hIlvwT6pr/FQGV/U1XQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bcQfxWUbELhB1cGbV/ZzfZY3AZ6i3uwYOHY/hILnvOTqIS2/ugBL69117Ov1wMX4QhHA4loclat/X4mOX9eoNAmzRG8S2xVX7MLd36vlAMSIk/6LaCXobmQ9PD3MW3ZCi7lh6QLT8bBtKNs+Ah2rVJiwLOEq1AWRiPeFUPUVoc8= 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=jkP+KvMh; arc=none smtp.client-ip=209.85.160.170 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="jkP+KvMh" Received: by mail-qt1-f170.google.com with SMTP id d75a77b69052e-430c63d4da9so45520951cf.0 for ; Wed, 27 Mar 2024 01:24:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1711527892; x=1712132692; 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=q91fMluof7ru1htcNbZ7jN0/AlY71gRdn67Zo4X/cIc=; b=jkP+KvMhRa+iIrcyrjHIyHuqg1kadBEvLfW7cBoys16ubuivXLDfWkCqhkC2RdhIp1 DfvHqqqKr9LQdEAs7M+w8khg8z4E/V1zFFw+LWiDntjTsNm3yt1U2vRBoUvu2LVPM2Bh 3o/RZAdqWaNZslHNOb/nhBduu+614DoxNh0eQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711527892; x=1712132692; 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=q91fMluof7ru1htcNbZ7jN0/AlY71gRdn67Zo4X/cIc=; b=tJC6nz/GqM3nH5nb6N9drxCeGilnbdWz8MxdYFX4SeL9T3sTsGX2uTPgv0Nbibn70F qr+lf3f+mRFcwkjAnCorIb0cBFTxCaY1xhq208n+1AIPBuHW7+f7NlDRFqoJYCNiFkYj L5jWDjpbrYJqCtf9CVl2Dqcy+sq3fNM1dtBYq4sHGIvWcNJQePDF7zXU0ia0Db1mLgNh asCsc9zP6jufVbHbXOIfM73WAY1eRucxK6NFJF9b5i+bCPV/P5dYU9xFQGML/+LkU+T5 qtoSco/ZXfUIaGj8bk7nUTTxds7aDD3Qe5i3maZyyZ7rDYiQK1zUMzLeRtKIOPnyEZ20 85zw== X-Forwarded-Encrypted: i=1; AJvYcCW9SBYnsCyGAsvDWbz98PpJ3wJcyZxNxUVDzZunvcMwa1s1d0hV7A8eU4HG6gJxQFrZmt4tNkaUH9YIA7Qpyl4I0B/bDS70vtGKPp5W X-Gm-Message-State: AOJu0YwCNbrx3/NNiRL3iSaMlxdtMprWXSoSfEUWIWpw4MQl8ZT9l6lg IxivHGMxjwMipSsq0IIaCkhg/tlx4MEMBT8jscp07OrM/hlFkollpVcuT441URMiZdLQL9mzxgp cHIRH X-Google-Smtp-Source: AGHT+IFeyiFHPVw9YcXiAwhqjUitPd4tkGsUFvfkwVfV8A2FB+olpwurffx057UQmDPwxHVVXdKZRQ== X-Received: by 2002:ac8:5b93:0:b0:431:5e50:ac0b with SMTP id a19-20020ac85b93000000b004315e50ac0bmr3849716qta.3.1711527892288; Wed, 27 Mar 2024 01:24:52 -0700 (PDT) Received: from denia.c.googlers.com (131.65.194.35.bc.googleusercontent.com. [35.194.65.131]) by smtp.gmail.com with ESMTPSA id ca9-20020a05622a1f0900b00430ea220b32sm4581691qtb.71.2024.03.27.01.24.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Mar 2024 01:24:51 -0700 (PDT) From: Ricardo Ribalda Date: Wed, 27 Mar 2024 08:24:47 +0000 Subject: [PATCH v4 4/4] media: uvcvideo: Exit early if there is not int_urb 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: <20240327-guenter-mini-v4-4-49955c198eae@chromium.org> References: <20240327-guenter-mini-v4-0-49955c198eae@chromium.org> In-Reply-To: <20240327-guenter-mini-v4-0-49955c198eae@chromium.org> To: Mauro Carvalho Chehab Cc: Guenter Roeck , Max Staudt , Tomasz Figa , Laurent Pinchart , Alan Stern , Hans Verkuil , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Sean Paul , Ricardo Ribalda , Sakari Ailus X-Mailer: b4 0.12.4 If there is no int_urb there is no need to do a clean stop. Also we avoid calling usb_kill_urb(NULL). It is properly handled by the usb framework, but it is not polite. Now that we are at it, fix the code style in uvc_status_start() for consistency. Signed-off-by: Ricardo Ribalda Reviewed-by: Sergey Senozhatsky --- drivers/media/usb/uvc/uvc_status.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/media/usb/uvc/uvc_status.c b/drivers/media/usb/uvc/uvc= _status.c index 8fd8250110e2f..9108522beea6a 100644 --- a/drivers/media/usb/uvc/uvc_status.c +++ b/drivers/media/usb/uvc/uvc_status.c @@ -308,7 +308,7 @@ static int __uvc_status_start(struct uvc_device *dev, g= fp_t flags) { lockdep_assert_held(&dev->status_lock); =20 - if (dev->int_urb =3D=3D NULL) + if (!dev->int_urb) return 0; =20 return usb_submit_urb(dev->int_urb, flags); @@ -320,6 +320,9 @@ static void __uvc_status_stop(struct uvc_device *dev) =20 lockdep_assert_held(&dev->status_lock); =20 + if (!dev->int_urb) + return; + /* * Prevent the asynchronous control handler from requeing the URB. The * barrier is needed so the flush_status change is visible to other --=20 2.44.0.396.g6e790dbe36-goog