From nobody Fri Apr 17 08:00:05 2026 Received: from mail-vk1-f173.google.com (mail-vk1-f173.google.com [209.85.221.173]) (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 645A735B62F for ; Sun, 22 Feb 2026 21:56:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=209.85.221.173 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771797376; cv=pass; b=Q9G75izj5kLBwGNw3y+c6bhJdBoZhyz4Ycs8EelXpTMoTHNd5BpPf3vJ/ew6keTPhPxAu2RYVvLo6XB0xfb5KekPEX+uR62YnmZKvjWl9rMWAuaqMB7ORm4OiiNwv9r8unBT6IMIJAQyD44ZNUN2eI34LMy09YxyuAtCw4faYiM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771797376; c=relaxed/simple; bh=JmSvQO5XqyT6TdvcO2hqlfP/xs6Gk//750J3WTyc8u0=; h=MIME-Version:From:Date:Message-ID:Subject:To:Cc:Content-Type; b=MLKSn4Hke5B614LQ8u2Ex3rUK3BwUiAKVsjcXkve+CKidznHPjIDot7ZvF7rnYvc7sm3ZXClmi9C4iBjzrE3aRNpuEXu3euLjdcHz7/5pXxMVLVpXsJunZ4kvlX1AaIeuX4I66rBAzDwxMgR30xIjbZaCF8Yr3yQql/D+rWac0Y= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=PuUmUTQB; arc=pass smtp.client-ip=209.85.221.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PuUmUTQB" Received: by mail-vk1-f173.google.com with SMTP id 71dfb90a1353d-5674689e507so1604349e0c.3 for ; Sun, 22 Feb 2026 13:56:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1771797374; cv=none; d=google.com; s=arc-20240605; b=MZz30NHHM95DMEtT/kV0m9NjfEarFgvnKm4pTpkeC8I3vcFlcoSzZciVKkQ7yCmktM Me7nOz3w6jW6i5LLuvoTfqjUlMwJUDkd8PKkYQwskovyh7QOqAX28t6Je68BZ0Q7rKg+ jiUSHbhetrTTmkIJs41DY8p2Oonvpv0QQtuh9MttSJ4VVCGVZ6XysoLeLQF2OM1HyhPX L3bqgAcKsQ69gyMxRAJgPf7wIzGALrzgFVOpJSFzHQUQ/BDY7dVxZSccaAyc7micSuVh tI92NWvzWeci6VtgwHDzyCHJvwi0EWNLvkVy9XwkOGGxr7RPTLbU1XQNQ3YRGLGlEGZQ p0Mw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=content-transfer-encoding:cc:to:subject:message-id:date:from :mime-version:dkim-signature; bh=fvZFs6ZWQcArHoivTdoRPMVBttlGZZKU4uro3YAyvz8=; fh=3+NpI8NmuFZvOcEO9UpDaSZtvd5uJS0u0ivzVJvAc6g=; b=faqI92URv16mGvM0zuAliyTcRQsG1eCvnnqYXEjxtaB5m+84mOftouuDUwG+DDLrh0 2f3UuIyInVAuWAA0oIa+JuMe2XdbdHVZrH6In1qx/WtqX5F5J3/jk9yvLaKWmVdGEmiI 4cFjjujoZHBXxza2nEvn4LNPhn38UV81ePwMlcj3n5nZx6UFR3UO/xFG4Qbb/4+1AkWs 3MjhGrNgwf+kV6SJmvoCqIhAKRhKCAwFknoFy9L0CUvjF4Ydf5dCOVO4aemsjZ8KVxlf lqwK58a/9rOx0Zt4f2K0EbfEhOVsHyhg/vHbuBsyohzmvoYzw4/Rd4m+aa83lU+JqBJX H0PA==; darn=vger.kernel.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771797374; x=1772402174; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=fvZFs6ZWQcArHoivTdoRPMVBttlGZZKU4uro3YAyvz8=; b=PuUmUTQBb+Mb558N6vMGiEpSEsrP9fJKT7Yd10sPSRpeznTjeAmClndE+ROruMPtY6 coIfG5XhLIYEpBgWdUKVm/qMOI2HaBVc/gz8RKSwVUK13g6kiPpL/3eVe/+tQgRrTrVQ Ez9f8FKMJPfvpeoHqU5X5trewXM4nQVr/1sttBiuF9eIZ7efTk+UcVgTB7N+ucixgaTs wzNHELCG3Jqq+w8MD6RRB32eRn31+kBete7k6qrsYZpR6IuRXh78xpsuOD71o7DK3Epi 5TEMHk0ku1B8Gi6WL/wRv+cPVFcU/1As7KPc2yl3fByO73mc3GNboxakUUhNsJ4vj64k QMow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771797374; x=1772402174; h=content-transfer-encoding:cc:to:subject:message-id:date:from :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=fvZFs6ZWQcArHoivTdoRPMVBttlGZZKU4uro3YAyvz8=; b=Ww3apgAqnCMBUrhmZuEq7kIlN6d5ykgq5NAOFyorazm/Gl5xFTVVwbp6mbFI06BAA5 qgXP5qNJzL8DTz1iTrbVtI3QXfhz6URa3nF1i7PEKNrm/v2eYHysLalAfzfOstNwzabt 2HhgAL+WmZ28E9Y6QM4YFf882xxMValHmKzpYIKdSpuAEh/HbxeiufFo1pXn5rE5Ibhr O4FOhhNTylvlZS2xNzm8kfqxdqTnpBDhAUs4ZP02tgoXmy51fAptlWeDcRFKfldXIzTJ gXbIgajfkykBr4f2Tv79n2pvhFK/ItuBmsDBIxtok/2pC8kgh0Z6A4kjDyOWgTAq9lCA 1FPg== X-Forwarded-Encrypted: i=1; AJvYcCV0HTqPKmbk4mX0O+22mq9PQsCGAPu++SbUhxZyNDEQeWU4ZIo1tSk8THyIchtF4evaJyjDMHnCcK1cZjU=@vger.kernel.org X-Gm-Message-State: AOJu0YwOohnWgSQyaPWwYf8hj8cAEb7qTNVSbKDr4PoNSyHB0301imEX UZi8HO+UctKYDoxV2m8tFuAWBi9YaNjw2uxA/WGO+noojn/XyPS0tD8zl5t8tqtZ8NdMzcKJnvF 8IGrQOgbOmkjrJW2/M9aEq6J6T6Iniss= X-Gm-Gg: AZuq6aIDjVa3SikeqtgI/w5DMDEI45/7mjx8L+d5EJH35b85c7ZaGhzJkv/9PHT0gA7 cfAfNqveB34t0BUmwGhSLIw1E2x+m4z2mVs3AwBu6evLzK6jNltwPvFd0H95cWf079I0AQDmT7i Icjy5RYgP2Go9oF/e2M7fErGArorkeaSXiJ5ie7RcfunKJvXIQkBovrp/rzJK05AINIHMTE9thw XGJVZFbwgY4Q6aSjw2pgKxI4xyMfCjp8ri+5cShBhVQVBiX3R9F9nYf70kAP00tLiB1IwsbPe9w 9Q1FpXugVlA6Om3WL//nFmG8E5clWxzBmfhR6LG8N0jwkyQD8SX6grUw8HQ885s5v5NH1F8a0QZ B/I5ldw63SQ== X-Received: by 2002:a05:6122:469b:b0:55b:1a1b:3273 with SMTP id 71dfb90a1353d-568e47abec3mr2195110e0c.6.1771797374061; Sun, 22 Feb 2026 13:56:14 -0800 (PST) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: =?UTF-8?B?QW5kcsOpcyBQw6lyZXo=?= Date: Sun, 22 Feb 2026 21:55:54 +0000 X-Gm-Features: AaiRm50d7jLgPyD4kdVKiyrm9CHXFWwo9PDyCMT5qvyZh7PMRFS6zqm3NMkVBvk Message-ID: Subject: [REGRESSION] Display freeze on VT switch back to X11 since v6.16 To: stable@vger.kernel.org, Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab , Jani Nikula , Rodrigo Vivi , Joonas Lahtinen , Tvrtko Ursulin , David Airlie , Simona Vetter , intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org, linux-kernel@vger.kernel.org Cc: regressions@lists.linux.dev Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" # OVERVIEW Since kernel v6.16.1, switching from an X11 session to a text VT and back freezes the display on a ThinkPad P15 Gen 2. The system remains responsive over SSH; only the display is frozen. Bisecting identified commit d1b618e7954802fe ("media: uvcvideo: Do not turn on the camera for some ioctls") as the trigger. Reverting the logic change in that commit fixes VT switching on v6.16.1, v6.17.9, and v6.18.9, but that is not an actual solution. Wayla= nd compositors (e.g., river and sway) are not affected. Last good: v6.15.9 First bad: v6.16.1 Bisect result: d1b618e7954802fe media: uvcvideo: Do not turn on the camera for some ioctls ## Hardware: Lenovo ThinkPad P15 Gen 2i (20YQ0031US) CPU: Intel Core i7-11800H (Tiger Lake-H) iGPU: Intel UHD Graphics (TGL GT1) dGPU: NVIDIA T1200 (not involved in eDP output; driver: nvidia-open) Display: 15.6" 1920x1080 eDP, 10 bpc capable (EDID 1.4) Webcam: Integrated Camera on PCH xHCI (Bus 003 Port 004) Firmware: LENOVO N37ET61W (1.97) OS: Arch Linux, Nix home-manager, X11 + xmonad, no display manager ## Symptoms and reproduction steps: 1. Boot, start X11 on tty1 (startx). 2. Switch to tty2 (Ctrl+Alt+F2): works. 3. Switch back to tty1 (Ctrl+Alt+F1): display freezes. - Frozen on the last frame shown before switching away. - System is fully responsive over SSH. - Other VTs switch normally between each other as long as X11 is not active on them. - Killing X does not recover the display. A reboot is required. # DEBUG ANALYSIS On v6.16.1, the VT switch back to X triggers a full modeset due to pipe configuration mismatches detected by intel_pipe_config_compare: [drm:intel_pipe_config_compare] fastset requirement not met in pipe_bpp (expected 30, found 24) [drm:intel_pipe_config_compare] fastset requirement not met in dp_m_n (expected link 269484/524288, found link 336855/524288) [drm:intel_pipe_config_compare] fastset requirement not met in dpll_hw_state (expected cfgcr0: 0xe001a5, found cfgcr0: 0x1c2) [drm:intel_pipe_config_compare] fastset requirement not met in port_clock (expected 270000, found 216000) [drm:intel_atomic_check] forcing full modeset On v6.15.9, the same VT switch shows no such messages. no pipe_config_compare runs, no modeset, no freeze. # BISECT AND VERIFICATION The bisect converged on d1b618e7954802fe in the uvcvideo driver. This commit adds a switch statement to uvc_v4l2_unlocked_ioctl that allows certain V4L2 IOCTLS to call video_ioctl2 directly without first calling uvc_pm_get/uvc_pm_put. Prior to this commit, all ioctls called uvc_pm_get before video_ioctl2. ## VT switching verification across kernel versions: v6.12.74 arch pkg: WORKS v6.15.9 arch pkg: WORKS v6.15.9 from source: WORKS v6.16.1 with d1b618e reverted: WORKS v6.17.9 with PM wrapping restored: WORKS v6.18.9 with PM wrapping restored: WORKS v6.16.1 from source: FREEZES v6.16.1 arch pkg: FREEZES v6.17.9 arch pkg: FREEZES v6.18.9 from source: FREEZES v6.18.9 arch pkg: FREEZES ## Things that do not eliminate the freeze - module_blacklist=3Duvcvideo on boot - CONFIG_USB_VIDEO_CLASS=3Dn (compiled out) - i915.enable_psr=3D0 - Bypassing intel_vrr_transcoder_enable/disable (no-op) - xrandr --output eDP-1 --set "max bpc" 10 - Xorg config FBDepth 30 (No effect on pipe_bpp) ## Workaround patch Reverting the optimization from d1b618e to restore the unconditional uvc_pm_get/put wrapping for all ioctls. This is not a proper fix. diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 9e4a251eca88..15057b47ec4f 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -1199,33 +1199,12 @@ static long uvc_v4l2_unlocked_ioctl(struct file *fi= le, unsigned int converted_cmd =3D v4l2_translate_cmd(cmd); int ret; - /* The following IOCTLs need to turn on the camera. */ - switch (converted_cmd) { - case UVCIOC_CTRL_MAP: - 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); + ret =3D uvc_pm_get(handle->stream->dev); + if (ret) return ret; - } - - /* The other IOCTLs can run with the camera off. */ - return video_ioctl2(file, cmd, arg); + ret =3D video_ioctl2(file, cmd, arg); + uvc_pm_put(handle->stream->dev); + return ret; } const struct v4l2_ioctl_ops uvc_ioctl_ops =3D { Andr=C3=A9s