* FAILED: patch "[PATCH] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon" failed to apply to 6.12-stable tree
@ 2025-12-01 16:01 gregkh
2025-12-01 22:10 ` [PATCH 6.12.y] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup Sasha Levin
2025-12-02 20:23 ` Sasha Levin
0 siblings, 2 replies; 7+ messages in thread
From: gregkh @ 2025-12-01 16:01 UTC (permalink / raw)
To: tzimmermann, alexander.deucher, javierm, stable; +Cc: stable
The patch below does not apply to the 6.12-stable tree.
If someone wants it applied there, or to any other stable or longterm
tree, then please email the backport, including the original git commit
id to <stable@vger.kernel.org>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.12.y
git checkout FETCH_HEAD
git cherry-pick -x eb76d0f5553575599561010f24c277cc5b31d003
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<stable@vger.kernel.org>' --in-reply-to '2025120119-edgy-recycled-bcfe@gregkh' --subject-prefix 'PATCH 6.12.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From eb76d0f5553575599561010f24c277cc5b31d003 Mon Sep 17 00:00:00 2001
From: Thomas Zimmermann <tzimmermann@suse.de>
Date: Wed, 5 Nov 2025 17:14:49 +0100
Subject: [PATCH] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon
setup
Protect vga_switcheroo_client_fb_set() with console lock. Avoids OOB
access in fbcon_remap_all(). Without holding the console lock the call
races with switching outputs.
VGA switcheroo calls fbcon_remap_all() when switching clients. The fbcon
function uses struct fb_info.node, which is set by register_framebuffer().
As the fb-helper code currently sets up VGA switcheroo before registering
the framebuffer, the value of node is -1 and therefore not a legal value.
For example, fbcon uses the value within set_con2fb_map() [1] as an index
into an array.
Moving vga_switcheroo_client_fb_set() after register_framebuffer() can
result in VGA switching that does not switch fbcon correctly.
Therefore move vga_switcheroo_client_fb_set() under fbcon_fb_registered(),
which already holds the console lock. Fbdev calls fbcon_fb_registered()
from within register_framebuffer(). Serializes the helper with VGA
switcheroo's call to fbcon_remap_all().
Although vga_switcheroo_client_fb_set() takes an instance of struct fb_info
as parameter, it really only needs the contained fbcon state. Moving the
call to fbcon initialization is therefore cleaner than before. Only amdgpu,
i915, nouveau and radeon support vga_switcheroo. For all other drivers,
this change does nothing.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://elixir.bootlin.com/linux/v6.17/source/drivers/video/fbdev/core/fbcon.c#L2942 # [1]
Fixes: 6a9ee8af344e ("vga_switcheroo: initial implementation (v15)")
Acked-by: Javier Martinez Canillas <javierm@redhat.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Cc: dri-devel@lists.freedesktop.org
Cc: nouveau@lists.freedesktop.org
Cc: amd-gfx@lists.freedesktop.org
Cc: linux-fbdev@vger.kernel.org
Cc: <stable@vger.kernel.org> # v2.6.34+
Link: https://patch.msgid.link/20251105161549.98836-1-tzimmermann@suse.de
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 11a5b60cb9ce..0b3ee008523d 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -31,9 +31,7 @@
#include <linux/console.h>
#include <linux/export.h>
-#include <linux/pci.h>
#include <linux/sysrq.h>
-#include <linux/vga_switcheroo.h>
#include <drm/drm_atomic.h>
#include <drm/drm_drv.h>
@@ -566,11 +564,6 @@ EXPORT_SYMBOL(drm_fb_helper_release_info);
*/
void drm_fb_helper_unregister_info(struct drm_fb_helper *fb_helper)
{
- struct fb_info *info = fb_helper->info;
- struct device *dev = info->device;
-
- if (dev_is_pci(dev))
- vga_switcheroo_client_fb_set(to_pci_dev(dev), NULL);
unregister_framebuffer(fb_helper->info);
}
EXPORT_SYMBOL(drm_fb_helper_unregister_info);
@@ -1632,7 +1625,6 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper)
struct drm_client_dev *client = &fb_helper->client;
struct drm_device *dev = fb_helper->dev;
struct drm_fb_helper_surface_size sizes;
- struct fb_info *info;
int ret;
if (drm_WARN_ON(dev, !dev->driver->fbdev_probe))
@@ -1653,12 +1645,6 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper)
strcpy(fb_helper->fb->comm, "[fbcon]");
- info = fb_helper->info;
-
- /* Set the fb info for vgaswitcheroo clients. Does nothing otherwise. */
- if (dev_is_pci(info->device))
- vga_switcheroo_client_fb_set(to_pci_dev(info->device), info);
-
return 0;
}
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 9bd3c3814b5c..e7e07eb2142e 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -66,6 +66,7 @@
#include <linux/string.h>
#include <linux/kd.h>
#include <linux/panic.h>
+#include <linux/pci.h>
#include <linux/printk.h>
#include <linux/slab.h>
#include <linux/fb.h>
@@ -78,6 +79,7 @@
#include <linux/interrupt.h>
#include <linux/crc32.h> /* For counting font checksums */
#include <linux/uaccess.h>
+#include <linux/vga_switcheroo.h>
#include <asm/irq.h>
#include "fbcon.h"
@@ -2899,6 +2901,9 @@ void fbcon_fb_unregistered(struct fb_info *info)
console_lock();
+ if (info->device && dev_is_pci(info->device))
+ vga_switcheroo_client_fb_set(to_pci_dev(info->device), NULL);
+
fbcon_registered_fb[info->node] = NULL;
fbcon_num_registered_fb--;
@@ -3032,6 +3037,10 @@ static int do_fb_registered(struct fb_info *info)
}
}
+ /* Set the fb info for vga_switcheroo clients. Does nothing otherwise. */
+ if (info->device && dev_is_pci(info->device))
+ vga_switcheroo_client_fb_set(to_pci_dev(info->device), info);
+
return ret;
}
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH 6.12.y] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup 2025-12-01 16:01 FAILED: patch "[PATCH] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon" failed to apply to 6.12-stable tree gregkh @ 2025-12-01 22:10 ` Sasha Levin 2025-12-02 7:40 ` Thomas Zimmermann 2025-12-02 20:23 ` Sasha Levin 1 sibling, 1 reply; 7+ messages in thread From: Sasha Levin @ 2025-12-01 22:10 UTC (permalink / raw) To: stable Cc: Thomas Zimmermann, Javier Martinez Canillas, Alex Deucher, dri-devel, nouveau, amd-gfx, linux-fbdev, Sasha Levin From: Thomas Zimmermann <tzimmermann@suse.de> [ Upstream commit eb76d0f5553575599561010f24c277cc5b31d003 ] Protect vga_switcheroo_client_fb_set() with console lock. Avoids OOB access in fbcon_remap_all(). Without holding the console lock the call races with switching outputs. VGA switcheroo calls fbcon_remap_all() when switching clients. The fbcon function uses struct fb_info.node, which is set by register_framebuffer(). As the fb-helper code currently sets up VGA switcheroo before registering the framebuffer, the value of node is -1 and therefore not a legal value. For example, fbcon uses the value within set_con2fb_map() [1] as an index into an array. Moving vga_switcheroo_client_fb_set() after register_framebuffer() can result in VGA switching that does not switch fbcon correctly. Therefore move vga_switcheroo_client_fb_set() under fbcon_fb_registered(), which already holds the console lock. Fbdev calls fbcon_fb_registered() from within register_framebuffer(). Serializes the helper with VGA switcheroo's call to fbcon_remap_all(). Although vga_switcheroo_client_fb_set() takes an instance of struct fb_info as parameter, it really only needs the contained fbcon state. Moving the call to fbcon initialization is therefore cleaner than before. Only amdgpu, i915, nouveau and radeon support vga_switcheroo. For all other drivers, this change does nothing. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Link: https://elixir.bootlin.com/linux/v6.17/source/drivers/video/fbdev/core/fbcon.c#L2942 # [1] Fixes: 6a9ee8af344e ("vga_switcheroo: initial implementation (v15)") Acked-by: Javier Martinez Canillas <javierm@redhat.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Cc: dri-devel@lists.freedesktop.org Cc: nouveau@lists.freedesktop.org Cc: amd-gfx@lists.freedesktop.org Cc: linux-fbdev@vger.kernel.org Cc: <stable@vger.kernel.org> # v2.6.34+ Link: https://patch.msgid.link/20251105161549.98836-1-tzimmermann@suse.de [ adapted dev->dev variable access ] Signed-off-by: Sasha Levin <sashal@kernel.org> --- drivers/gpu/drm/drm_fb_helper.c | 6 ------ drivers/video/fbdev/core/fbcon.c | 9 +++++++++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index b15ddbd65e7b5..a8971c4eb9f05 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -30,9 +30,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include <linux/console.h> -#include <linux/pci.h> #include <linux/sysrq.h> -#include <linux/vga_switcheroo.h> #include <drm/drm_atomic.h> #include <drm/drm_drv.h> @@ -1637,10 +1635,6 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper) strcpy(fb_helper->fb->comm, "[fbcon]"); - /* Set the fb info for vgaswitcheroo clients. Does nothing otherwise. */ - if (dev_is_pci(dev->dev)) - vga_switcheroo_client_fb_set(to_pci_dev(dev->dev), fb_helper->info); - return 0; } diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c index 1fc1e47ae2b49..e681066736dea 100644 --- a/drivers/video/fbdev/core/fbcon.c +++ b/drivers/video/fbdev/core/fbcon.c @@ -65,6 +65,7 @@ #include <linux/string.h> #include <linux/kd.h> #include <linux/panic.h> +#include <linux/pci.h> #include <linux/printk.h> #include <linux/slab.h> #include <linux/fb.h> @@ -77,6 +78,7 @@ #include <linux/interrupt.h> #include <linux/crc32.h> /* For counting font checksums */ #include <linux/uaccess.h> +#include <linux/vga_switcheroo.h> #include <asm/irq.h> #include "fbcon.h" @@ -2894,6 +2896,9 @@ void fbcon_fb_unregistered(struct fb_info *info) console_lock(); + if (info->device && dev_is_pci(info->device)) + vga_switcheroo_client_fb_set(to_pci_dev(info->device), NULL); + fbcon_registered_fb[info->node] = NULL; fbcon_num_registered_fb--; @@ -3027,6 +3032,10 @@ static int do_fb_registered(struct fb_info *info) } } + /* Set the fb info for vga_switcheroo clients. Does nothing otherwise. */ + if (info->device && dev_is_pci(info->device)) + vga_switcheroo_client_fb_set(to_pci_dev(info->device), info); + return ret; } -- 2.51.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 6.12.y] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup 2025-12-01 22:10 ` [PATCH 6.12.y] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup Sasha Levin @ 2025-12-02 7:40 ` Thomas Zimmermann 2025-12-02 15:52 ` Greg KH 0 siblings, 1 reply; 7+ messages in thread From: Thomas Zimmermann @ 2025-12-02 7:40 UTC (permalink / raw) To: Sasha Levin, stable Cc: Javier Martinez Canillas, Alex Deucher, dri-devel, nouveau, amd-gfx, linux-fbdev Hi, thanks for backporting. You also have to remove the calls to vga_switcheroo_client_fb_set() from these files https://elixir.bootlin.com/linux/v6.12/source/drivers/gpu/drm/i915/display/intel_fbdev.c https://elixir.bootlin.com/linux/v6.12/source/drivers/gpu/drm/radeon/radeon_fbdev.c Best regards Thomas Am 01.12.25 um 23:10 schrieb Sasha Levin: > From: Thomas Zimmermann <tzimmermann@suse.de> > > [ Upstream commit eb76d0f5553575599561010f24c277cc5b31d003 ] > > Protect vga_switcheroo_client_fb_set() with console lock. Avoids OOB > access in fbcon_remap_all(). Without holding the console lock the call > races with switching outputs. > > VGA switcheroo calls fbcon_remap_all() when switching clients. The fbcon > function uses struct fb_info.node, which is set by register_framebuffer(). > As the fb-helper code currently sets up VGA switcheroo before registering > the framebuffer, the value of node is -1 and therefore not a legal value. > For example, fbcon uses the value within set_con2fb_map() [1] as an index > into an array. > > Moving vga_switcheroo_client_fb_set() after register_framebuffer() can > result in VGA switching that does not switch fbcon correctly. > > Therefore move vga_switcheroo_client_fb_set() under fbcon_fb_registered(), > which already holds the console lock. Fbdev calls fbcon_fb_registered() > from within register_framebuffer(). Serializes the helper with VGA > switcheroo's call to fbcon_remap_all(). > > Although vga_switcheroo_client_fb_set() takes an instance of struct fb_info > as parameter, it really only needs the contained fbcon state. Moving the > call to fbcon initialization is therefore cleaner than before. Only amdgpu, > i915, nouveau and radeon support vga_switcheroo. For all other drivers, > this change does nothing. > > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> > Link: https://elixir.bootlin.com/linux/v6.17/source/drivers/video/fbdev/core/fbcon.c#L2942 # [1] > Fixes: 6a9ee8af344e ("vga_switcheroo: initial implementation (v15)") > Acked-by: Javier Martinez Canillas <javierm@redhat.com> > Acked-by: Alex Deucher <alexander.deucher@amd.com> > Cc: dri-devel@lists.freedesktop.org > Cc: nouveau@lists.freedesktop.org > Cc: amd-gfx@lists.freedesktop.org > Cc: linux-fbdev@vger.kernel.org > Cc: <stable@vger.kernel.org> # v2.6.34+ > Link: https://patch.msgid.link/20251105161549.98836-1-tzimmermann@suse.de > [ adapted dev->dev variable access ] > Signed-off-by: Sasha Levin <sashal@kernel.org> > --- > drivers/gpu/drm/drm_fb_helper.c | 6 ------ > drivers/video/fbdev/core/fbcon.c | 9 +++++++++ > 2 files changed, 9 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c > index b15ddbd65e7b5..a8971c4eb9f05 100644 > --- a/drivers/gpu/drm/drm_fb_helper.c > +++ b/drivers/gpu/drm/drm_fb_helper.c > @@ -30,9 +30,7 @@ > #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > > #include <linux/console.h> > -#include <linux/pci.h> > #include <linux/sysrq.h> > -#include <linux/vga_switcheroo.h> > > #include <drm/drm_atomic.h> > #include <drm/drm_drv.h> > @@ -1637,10 +1635,6 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper) > > strcpy(fb_helper->fb->comm, "[fbcon]"); > > - /* Set the fb info for vgaswitcheroo clients. Does nothing otherwise. */ > - if (dev_is_pci(dev->dev)) > - vga_switcheroo_client_fb_set(to_pci_dev(dev->dev), fb_helper->info); > - > return 0; > } > > diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c > index 1fc1e47ae2b49..e681066736dea 100644 > --- a/drivers/video/fbdev/core/fbcon.c > +++ b/drivers/video/fbdev/core/fbcon.c > @@ -65,6 +65,7 @@ > #include <linux/string.h> > #include <linux/kd.h> > #include <linux/panic.h> > +#include <linux/pci.h> > #include <linux/printk.h> > #include <linux/slab.h> > #include <linux/fb.h> > @@ -77,6 +78,7 @@ > #include <linux/interrupt.h> > #include <linux/crc32.h> /* For counting font checksums */ > #include <linux/uaccess.h> > +#include <linux/vga_switcheroo.h> > #include <asm/irq.h> > > #include "fbcon.h" > @@ -2894,6 +2896,9 @@ void fbcon_fb_unregistered(struct fb_info *info) > > console_lock(); > > + if (info->device && dev_is_pci(info->device)) > + vga_switcheroo_client_fb_set(to_pci_dev(info->device), NULL); > + > fbcon_registered_fb[info->node] = NULL; > fbcon_num_registered_fb--; > > @@ -3027,6 +3032,10 @@ static int do_fb_registered(struct fb_info *info) > } > } > > + /* Set the fb info for vga_switcheroo clients. Does nothing otherwise. */ > + if (info->device && dev_is_pci(info->device)) > + vga_switcheroo_client_fb_set(to_pci_dev(info->device), info); > + > return ret; > } > -- -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com GF: Jochen Jaser, Andrew McDonald, Werner Knoblich, (HRB 36809, AG Nürnberg) ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 6.12.y] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup 2025-12-02 7:40 ` Thomas Zimmermann @ 2025-12-02 15:52 ` Greg KH 0 siblings, 0 replies; 7+ messages in thread From: Greg KH @ 2025-12-02 15:52 UTC (permalink / raw) To: Thomas Zimmermann Cc: Sasha Levin, stable, Javier Martinez Canillas, Alex Deucher, dri-devel, nouveau, amd-gfx, linux-fbdev On Tue, Dec 02, 2025 at 08:40:43AM +0100, Thomas Zimmermann wrote: > Hi, > > thanks for backporting. > > You also have to remove the calls to vga_switcheroo_client_fb_set() from > these files > > https://elixir.bootlin.com/linux/v6.12/source/drivers/gpu/drm/i915/display/intel_fbdev.c > https://elixir.bootlin.com/linux/v6.12/source/drivers/gpu/drm/radeon/radeon_fbdev.c Can you send a fixed up patch instead? thanks, greg k-h ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 6.12.y] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup 2025-12-01 16:01 FAILED: patch "[PATCH] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon" failed to apply to 6.12-stable tree gregkh 2025-12-01 22:10 ` [PATCH 6.12.y] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup Sasha Levin @ 2025-12-02 20:23 ` Sasha Levin 2025-12-03 13:19 ` Patch "drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup" has been added to the 6.12-stable tree gregkh 2025-12-03 16:50 ` [PATCH 6.12.y] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup Thomas Zimmermann 1 sibling, 2 replies; 7+ messages in thread From: Sasha Levin @ 2025-12-02 20:23 UTC (permalink / raw) To: stable Cc: Thomas Zimmermann, Javier Martinez Canillas, Alex Deucher, dri-devel, nouveau, amd-gfx, linux-fbdev, Sasha Levin From: Thomas Zimmermann <tzimmermann@suse.de> [ Upstream commit eb76d0f5553575599561010f24c277cc5b31d003 ] Protect vga_switcheroo_client_fb_set() with console lock. Avoids OOB access in fbcon_remap_all(). Without holding the console lock the call races with switching outputs. VGA switcheroo calls fbcon_remap_all() when switching clients. The fbcon function uses struct fb_info.node, which is set by register_framebuffer(). As the fb-helper code currently sets up VGA switcheroo before registering the framebuffer, the value of node is -1 and therefore not a legal value. For example, fbcon uses the value within set_con2fb_map() [1] as an index into an array. Moving vga_switcheroo_client_fb_set() after register_framebuffer() can result in VGA switching that does not switch fbcon correctly. Therefore move vga_switcheroo_client_fb_set() under fbcon_fb_registered(), which already holds the console lock. Fbdev calls fbcon_fb_registered() from within register_framebuffer(). Serializes the helper with VGA switcheroo's call to fbcon_remap_all(). Although vga_switcheroo_client_fb_set() takes an instance of struct fb_info as parameter, it really only needs the contained fbcon state. Moving the call to fbcon initialization is therefore cleaner than before. Only amdgpu, i915, nouveau and radeon support vga_switcheroo. For all other drivers, this change does nothing. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Link: https://elixir.bootlin.com/linux/v6.17/source/drivers/video/fbdev/core/fbcon.c#L2942 # [1] Fixes: 6a9ee8af344e ("vga_switcheroo: initial implementation (v15)") Acked-by: Javier Martinez Canillas <javierm@redhat.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Cc: dri-devel@lists.freedesktop.org Cc: nouveau@lists.freedesktop.org Cc: amd-gfx@lists.freedesktop.org Cc: linux-fbdev@vger.kernel.org Cc: <stable@vger.kernel.org> # v2.6.34+ Link: https://patch.msgid.link/20251105161549.98836-1-tzimmermann@suse.de Signed-off-by: Sasha Levin <sashal@kernel.org> --- drivers/gpu/drm/drm_fb_helper.c | 6 ------ drivers/gpu/drm/i915/display/intel_fbdev.c | 6 ------ drivers/gpu/drm/radeon/radeon_fbdev.c | 5 ----- drivers/video/fbdev/core/fbcon.c | 9 +++++++++ 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index b15ddbd65e7b5..a8971c4eb9f05 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -30,9 +30,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include <linux/console.h> -#include <linux/pci.h> #include <linux/sysrq.h> -#include <linux/vga_switcheroo.h> #include <drm/drm_atomic.h> #include <drm/drm_drv.h> @@ -1637,10 +1635,6 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper) strcpy(fb_helper->fb->comm, "[fbcon]"); - /* Set the fb info for vgaswitcheroo clients. Does nothing otherwise. */ - if (dev_is_pci(dev->dev)) - vga_switcheroo_client_fb_set(to_pci_dev(dev->dev), fb_helper->info); - return 0; } diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c index 49a1ac4f54919..337cc9fc31b19 100644 --- a/drivers/gpu/drm/i915/display/intel_fbdev.c +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c @@ -589,11 +589,8 @@ static int intel_fbdev_restore_mode(struct drm_i915_private *dev_priv) static void intel_fbdev_client_unregister(struct drm_client_dev *client) { struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); - struct drm_device *dev = fb_helper->dev; - struct pci_dev *pdev = to_pci_dev(dev->dev); if (fb_helper->info) { - vga_switcheroo_client_fb_set(pdev, NULL); drm_fb_helper_unregister_info(fb_helper); } else { drm_fb_helper_unprepare(fb_helper); @@ -620,7 +617,6 @@ static int intel_fbdev_client_hotplug(struct drm_client_dev *client) { struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); struct drm_device *dev = client->dev; - struct pci_dev *pdev = to_pci_dev(dev->dev); int ret; if (dev->fb_helper) @@ -634,8 +630,6 @@ static int intel_fbdev_client_hotplug(struct drm_client_dev *client) if (ret) goto err_drm_fb_helper_fini; - vga_switcheroo_client_fb_set(pdev, fb_helper->info); - return 0; err_drm_fb_helper_fini: diff --git a/drivers/gpu/drm/radeon/radeon_fbdev.c b/drivers/gpu/drm/radeon/radeon_fbdev.c index fb70de29545c6..a197ba2f2717b 100644 --- a/drivers/gpu/drm/radeon/radeon_fbdev.c +++ b/drivers/gpu/drm/radeon/radeon_fbdev.c @@ -300,10 +300,8 @@ static void radeon_fbdev_client_unregister(struct drm_client_dev *client) { struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); struct drm_device *dev = fb_helper->dev; - struct radeon_device *rdev = dev->dev_private; if (fb_helper->info) { - vga_switcheroo_client_fb_set(rdev->pdev, NULL); drm_helper_force_disable_all(dev); drm_fb_helper_unregister_info(fb_helper); } else { @@ -325,7 +323,6 @@ static int radeon_fbdev_client_hotplug(struct drm_client_dev *client) { struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); struct drm_device *dev = client->dev; - struct radeon_device *rdev = dev->dev_private; int ret; if (dev->fb_helper) @@ -342,8 +339,6 @@ static int radeon_fbdev_client_hotplug(struct drm_client_dev *client) if (ret) goto err_drm_fb_helper_fini; - vga_switcheroo_client_fb_set(rdev->pdev, fb_helper->info); - return 0; err_drm_fb_helper_fini: diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c index 1fc1e47ae2b49..e681066736dea 100644 --- a/drivers/video/fbdev/core/fbcon.c +++ b/drivers/video/fbdev/core/fbcon.c @@ -65,6 +65,7 @@ #include <linux/string.h> #include <linux/kd.h> #include <linux/panic.h> +#include <linux/pci.h> #include <linux/printk.h> #include <linux/slab.h> #include <linux/fb.h> @@ -77,6 +78,7 @@ #include <linux/interrupt.h> #include <linux/crc32.h> /* For counting font checksums */ #include <linux/uaccess.h> +#include <linux/vga_switcheroo.h> #include <asm/irq.h> #include "fbcon.h" @@ -2894,6 +2896,9 @@ void fbcon_fb_unregistered(struct fb_info *info) console_lock(); + if (info->device && dev_is_pci(info->device)) + vga_switcheroo_client_fb_set(to_pci_dev(info->device), NULL); + fbcon_registered_fb[info->node] = NULL; fbcon_num_registered_fb--; @@ -3027,6 +3032,10 @@ static int do_fb_registered(struct fb_info *info) } } + /* Set the fb info for vga_switcheroo clients. Does nothing otherwise. */ + if (info->device && dev_is_pci(info->device)) + vga_switcheroo_client_fb_set(to_pci_dev(info->device), info); + return ret; } -- 2.51.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Patch "drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup" has been added to the 6.12-stable tree 2025-12-02 20:23 ` Sasha Levin @ 2025-12-03 13:19 ` gregkh 2025-12-03 16:50 ` [PATCH 6.12.y] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup Thomas Zimmermann 1 sibling, 0 replies; 7+ messages in thread From: gregkh @ 2025-12-03 13:19 UTC (permalink / raw) To: alexander.deucher, amd-gfx, dri-devel, gregkh, javierm, nouveau, sashal, tzimmermann Cc: stable-commits This is a note to let you know that I've just added the patch titled drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup to the 6.12-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: drm-fbcon-vga_switcheroo-avoid-race-condition-in-fbcon-setup.patch and it can be found in the queue-6.12 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@vger.kernel.org> know about it. From stable+bounces-198144-greg=kroah.com@vger.kernel.org Tue Dec 2 21:23:22 2025 From: Sasha Levin <sashal@kernel.org> Date: Tue, 2 Dec 2025 15:23:12 -0500 Subject: drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup To: stable@vger.kernel.org Cc: Thomas Zimmermann <tzimmermann@suse.de>, Javier Martinez Canillas <javierm@redhat.com>, Alex Deucher <alexander.deucher@amd.com>, dri-devel@lists.freedesktop.org, nouveau@lists.freedesktop.org, amd-gfx@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Sasha Levin <sashal@kernel.org> Message-ID: <20251202202312.2505097-1-sashal@kernel.org> From: Thomas Zimmermann <tzimmermann@suse.de> [ Upstream commit eb76d0f5553575599561010f24c277cc5b31d003 ] Protect vga_switcheroo_client_fb_set() with console lock. Avoids OOB access in fbcon_remap_all(). Without holding the console lock the call races with switching outputs. VGA switcheroo calls fbcon_remap_all() when switching clients. The fbcon function uses struct fb_info.node, which is set by register_framebuffer(). As the fb-helper code currently sets up VGA switcheroo before registering the framebuffer, the value of node is -1 and therefore not a legal value. For example, fbcon uses the value within set_con2fb_map() [1] as an index into an array. Moving vga_switcheroo_client_fb_set() after register_framebuffer() can result in VGA switching that does not switch fbcon correctly. Therefore move vga_switcheroo_client_fb_set() under fbcon_fb_registered(), which already holds the console lock. Fbdev calls fbcon_fb_registered() from within register_framebuffer(). Serializes the helper with VGA switcheroo's call to fbcon_remap_all(). Although vga_switcheroo_client_fb_set() takes an instance of struct fb_info as parameter, it really only needs the contained fbcon state. Moving the call to fbcon initialization is therefore cleaner than before. Only amdgpu, i915, nouveau and radeon support vga_switcheroo. For all other drivers, this change does nothing. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Link: https://elixir.bootlin.com/linux/v6.17/source/drivers/video/fbdev/core/fbcon.c#L2942 # [1] Fixes: 6a9ee8af344e ("vga_switcheroo: initial implementation (v15)") Acked-by: Javier Martinez Canillas <javierm@redhat.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Cc: dri-devel@lists.freedesktop.org Cc: nouveau@lists.freedesktop.org Cc: amd-gfx@lists.freedesktop.org Cc: linux-fbdev@vger.kernel.org Cc: <stable@vger.kernel.org> # v2.6.34+ Link: https://patch.msgid.link/20251105161549.98836-1-tzimmermann@suse.de Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> --- drivers/gpu/drm/drm_fb_helper.c | 6 ------ drivers/gpu/drm/i915/display/intel_fbdev.c | 6 ------ drivers/gpu/drm/radeon/radeon_fbdev.c | 5 ----- drivers/video/fbdev/core/fbcon.c | 9 +++++++++ 4 files changed, 9 insertions(+), 17 deletions(-) --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -30,9 +30,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include <linux/console.h> -#include <linux/pci.h> #include <linux/sysrq.h> -#include <linux/vga_switcheroo.h> #include <drm/drm_atomic.h> #include <drm/drm_drv.h> @@ -1637,10 +1635,6 @@ static int drm_fb_helper_single_fb_probe strcpy(fb_helper->fb->comm, "[fbcon]"); - /* Set the fb info for vgaswitcheroo clients. Does nothing otherwise. */ - if (dev_is_pci(dev->dev)) - vga_switcheroo_client_fb_set(to_pci_dev(dev->dev), fb_helper->info); - return 0; } --- a/drivers/gpu/drm/i915/display/intel_fbdev.c +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c @@ -589,11 +589,8 @@ static int intel_fbdev_restore_mode(stru static void intel_fbdev_client_unregister(struct drm_client_dev *client) { struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); - struct drm_device *dev = fb_helper->dev; - struct pci_dev *pdev = to_pci_dev(dev->dev); if (fb_helper->info) { - vga_switcheroo_client_fb_set(pdev, NULL); drm_fb_helper_unregister_info(fb_helper); } else { drm_fb_helper_unprepare(fb_helper); @@ -620,7 +617,6 @@ static int intel_fbdev_client_hotplug(st { struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); struct drm_device *dev = client->dev; - struct pci_dev *pdev = to_pci_dev(dev->dev); int ret; if (dev->fb_helper) @@ -634,8 +630,6 @@ static int intel_fbdev_client_hotplug(st if (ret) goto err_drm_fb_helper_fini; - vga_switcheroo_client_fb_set(pdev, fb_helper->info); - return 0; err_drm_fb_helper_fini: --- a/drivers/gpu/drm/radeon/radeon_fbdev.c +++ b/drivers/gpu/drm/radeon/radeon_fbdev.c @@ -300,10 +300,8 @@ static void radeon_fbdev_client_unregist { struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); struct drm_device *dev = fb_helper->dev; - struct radeon_device *rdev = dev->dev_private; if (fb_helper->info) { - vga_switcheroo_client_fb_set(rdev->pdev, NULL); drm_helper_force_disable_all(dev); drm_fb_helper_unregister_info(fb_helper); } else { @@ -325,7 +323,6 @@ static int radeon_fbdev_client_hotplug(s { struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); struct drm_device *dev = client->dev; - struct radeon_device *rdev = dev->dev_private; int ret; if (dev->fb_helper) @@ -342,8 +339,6 @@ static int radeon_fbdev_client_hotplug(s if (ret) goto err_drm_fb_helper_fini; - vga_switcheroo_client_fb_set(rdev->pdev, fb_helper->info); - return 0; err_drm_fb_helper_fini: --- a/drivers/video/fbdev/core/fbcon.c +++ b/drivers/video/fbdev/core/fbcon.c @@ -65,6 +65,7 @@ #include <linux/string.h> #include <linux/kd.h> #include <linux/panic.h> +#include <linux/pci.h> #include <linux/printk.h> #include <linux/slab.h> #include <linux/fb.h> @@ -77,6 +78,7 @@ #include <linux/interrupt.h> #include <linux/crc32.h> /* For counting font checksums */ #include <linux/uaccess.h> +#include <linux/vga_switcheroo.h> #include <asm/irq.h> #include "fbcon.h" @@ -2894,6 +2896,9 @@ void fbcon_fb_unregistered(struct fb_inf console_lock(); + if (info->device && dev_is_pci(info->device)) + vga_switcheroo_client_fb_set(to_pci_dev(info->device), NULL); + fbcon_registered_fb[info->node] = NULL; fbcon_num_registered_fb--; @@ -3027,6 +3032,10 @@ static int do_fb_registered(struct fb_in } } + /* Set the fb info for vga_switcheroo clients. Does nothing otherwise. */ + if (info->device && dev_is_pci(info->device)) + vga_switcheroo_client_fb_set(to_pci_dev(info->device), info); + return ret; } Patches currently in stable-queue which might be from sashal@kernel.org are queue-6.12/usb-typec-ucsi-psy-set-max-current-to-zero-when-disconnected.patch queue-6.12/net-fec-do-not-update-perout-if-it-is-enabled.patch queue-6.12/spi-nxp-fspi-propagate-fwnode-in-acpi-case-as-well.patch queue-6.12/spi-amlogic-spifc-a1-handle-devm_pm_runtime_enable-e.patch queue-6.12/can-gs_usb-gs_usb_receive_bulk_callback-check-actual.patch queue-6.12/drm-xe-fix-conversion-from-clock-ticks-to-millisecon.patch queue-6.12/mm-huge_memory-fix-null-pointer-deference-when-splitting-folio.patch queue-6.12/usb-gadget-udc-fix-use-after-free-in-usb_gadget_state_work.patch queue-6.12/spi-spi-nxp-fspi-remove-the-goto-in-probe.patch queue-6.12/net-atlantic-fix-fragment-overflow-handling-in-rx-pa.patch queue-6.12/bluetooth-btusb-mediatek-fix-kernel-crash-when-relea.patch queue-6.12/mailbox-mtk-cmdq-refine-dma-address-handling-for-the.patch queue-6.12/bluetooth-hci_core-fix-triggering-cmd_timer-for-hci_.patch queue-6.12/platform-x86-intel-punit_ipc-fix-memory-corruption.patch queue-6.12/veth-reduce-xdp-no_direct-return-section-to-fix-race.patch queue-6.12/net-sched-generalize-check-for-no-queue-qdisc-on-tx-.patch queue-6.12/iio-st_lsm6dsx-fixed-calibrated-timestamp-calculatio.patch queue-6.12/net-lan966x-fix-the-initialization-of-taprio.patch queue-6.12/net-phy-mxl-gpy-fix-bogus-error-on-usxgmii-and-integ.patch queue-6.12/can-rcar_canfd-fix-can-fd-mode-as-default.patch queue-6.12/net-dsa-sja1105-simplify-static-configuration-reload.patch queue-6.12/veth-apply-qdisc-backpressure-on-full-ptr_ring-to-re.patch queue-6.12/bluetooth-hci_sock-prevent-race-in-socket-write-iter.patch queue-6.12/net-fec-do-not-allow-enabling-pps-and-perout-simulta.patch queue-6.12/net-sxgbe-fix-potential-null-dereference-in-sxgbe_rx.patch queue-6.12/net-dsa-microchip-do-not-execute-ptp-driver-code-for-unsupported-switches.patch queue-6.12/spi-spi-mem-add-a-new-controller-capability.patch queue-6.12/net-dsa-sja1105-fix-sgmii-linking-at-10m-or-100m-but.patch queue-6.12/fs-namespace-fix-reference-leak-in-grab_requested_mn.patch queue-6.12/usb-gadget-renesas_usbf-handle-devm_pm_runtime_enabl.patch queue-6.12/veth-prevent-null-pointer-dereference-in-veth_xdp_rc.patch queue-6.12/drm-amdgpu-fix-cyan_skillfish2-gpu-info-fw-handling.patch queue-6.12/mailbox-pcc-refactor-error-handling-in-irq-handler-i.patch queue-6.12/net-fec-cancel-perout_timer-when-perout-is-disabled.patch queue-6.12/net-mlx5e-fix-validation-logic-in-rate-limiting.patch queue-6.12/eth-fbnic-fix-counter-roll-over-issue.patch queue-6.12/net-fec-do-not-register-pps-event-for-perout.patch queue-6.12/spi-spi-mem-allow-specifying-the-byte-order-in-octal.patch queue-6.12/net-wwan-mhi-keep-modem-name-match-with-foxconn-t99w.patch queue-6.12/can-kvaser_usb-leaf-fix-potential-infinite-loop-in-c.patch queue-6.12/mailbox-mailbox-test-fix-debugfs_create_dir-error-ch.patch queue-6.12/veth-more-robust-handing-of-race-to-avoid-txq-gettin.patch queue-6.12/usb-udc-add-trace-event-for-usb_gadget_set_state.patch queue-6.12/spi-spi-mem-extend-spi-mem-operations-with-a-per-ope.patch queue-6.12/net-dsa-microchip-free-previously-initialized-ports-on-init-failures.patch queue-6.12/drm-fbcon-vga_switcheroo-avoid-race-condition-in-fbcon-setup.patch queue-6.12/spi-bcm63xx-fix-premature-cs-deassertion-on-rx-only-.patch queue-6.12/spi-nxp-fspi-support-per-spi-mem-operation-frequency.patch queue-6.12/spi-spi-nxp-fspi-add-oct-dtr-mode-support.patch queue-6.12/net-dsa-microchip-fix-symetry-in-ksz_ptp_msg_irq_-setup-free.patch queue-6.12/spi-tegra114-remove-kconfig-dependency-on-tegra20_ap.patch queue-6.12/can-gs_usb-gs_usb_xmit_callback-fix-handling-of-fail.patch queue-6.12/team-move-team-device-type-change-at-the-end-of-team.patch queue-6.12/net-aquantia-add-missing-descriptor-cache-invalidati.patch queue-6.12/bluetooth-smp-fix-not-generating-mackey-and-ltk-when.patch queue-6.12/mailbox-pcc-don-t-zero-error-register.patch queue-6.12/can-gs_usb-gs_usb_receive_bulk_callback-check-actual.patch-29525 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 6.12.y] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup 2025-12-02 20:23 ` Sasha Levin 2025-12-03 13:19 ` Patch "drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup" has been added to the 6.12-stable tree gregkh @ 2025-12-03 16:50 ` Thomas Zimmermann 1 sibling, 0 replies; 7+ messages in thread From: Thomas Zimmermann @ 2025-12-03 16:50 UTC (permalink / raw) To: Sasha Levin, stable Cc: Javier Martinez Canillas, Alex Deucher, dri-devel, nouveau, amd-gfx, linux-fbdev Hi, thank you for providing an updated patch. Am 02.12.25 um 21:23 schrieb Sasha Levin: > From: Thomas Zimmermann <tzimmermann@suse.de> > > [ Upstream commit eb76d0f5553575599561010f24c277cc5b31d003 ] > > Protect vga_switcheroo_client_fb_set() with console lock. Avoids OOB > access in fbcon_remap_all(). Without holding the console lock the call > races with switching outputs. > > VGA switcheroo calls fbcon_remap_all() when switching clients. The fbcon > function uses struct fb_info.node, which is set by register_framebuffer(). > As the fb-helper code currently sets up VGA switcheroo before registering > the framebuffer, the value of node is -1 and therefore not a legal value. > For example, fbcon uses the value within set_con2fb_map() [1] as an index > into an array. > > Moving vga_switcheroo_client_fb_set() after register_framebuffer() can > result in VGA switching that does not switch fbcon correctly. > > Therefore move vga_switcheroo_client_fb_set() under fbcon_fb_registered(), > which already holds the console lock. Fbdev calls fbcon_fb_registered() > from within register_framebuffer(). Serializes the helper with VGA > switcheroo's call to fbcon_remap_all(). > > Although vga_switcheroo_client_fb_set() takes an instance of struct fb_info > as parameter, it really only needs the contained fbcon state. Moving the > call to fbcon initialization is therefore cleaner than before. Only amdgpu, > i915, nouveau and radeon support vga_switcheroo. For all other drivers, > this change does nothing. > > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> > Link: https://elixir.bootlin.com/linux/v6.17/source/drivers/video/fbdev/core/fbcon.c#L2942 # [1] > Fixes: 6a9ee8af344e ("vga_switcheroo: initial implementation (v15)") > Acked-by: Javier Martinez Canillas <javierm@redhat.com> > Acked-by: Alex Deucher <alexander.deucher@amd.com> > Cc: dri-devel@lists.freedesktop.org > Cc: nouveau@lists.freedesktop.org > Cc: amd-gfx@lists.freedesktop.org > Cc: linux-fbdev@vger.kernel.org > Cc: <stable@vger.kernel.org> # v2.6.34+ > Link: https://patch.msgid.link/20251105161549.98836-1-tzimmermann@suse.de > Signed-off-by: Sasha Levin <sashal@kernel.org> Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de> > --- > drivers/gpu/drm/drm_fb_helper.c | 6 ------ > drivers/gpu/drm/i915/display/intel_fbdev.c | 6 ------ > drivers/gpu/drm/radeon/radeon_fbdev.c | 5 ----- > drivers/video/fbdev/core/fbcon.c | 9 +++++++++ > 4 files changed, 9 insertions(+), 17 deletions(-) > > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c > index b15ddbd65e7b5..a8971c4eb9f05 100644 > --- a/drivers/gpu/drm/drm_fb_helper.c > +++ b/drivers/gpu/drm/drm_fb_helper.c > @@ -30,9 +30,7 @@ > #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > > #include <linux/console.h> > -#include <linux/pci.h> > #include <linux/sysrq.h> > -#include <linux/vga_switcheroo.h> > > #include <drm/drm_atomic.h> > #include <drm/drm_drv.h> > @@ -1637,10 +1635,6 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper) > > strcpy(fb_helper->fb->comm, "[fbcon]"); > > - /* Set the fb info for vgaswitcheroo clients. Does nothing otherwise. */ > - if (dev_is_pci(dev->dev)) > - vga_switcheroo_client_fb_set(to_pci_dev(dev->dev), fb_helper->info); > - > return 0; > } > > diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c > index 49a1ac4f54919..337cc9fc31b19 100644 > --- a/drivers/gpu/drm/i915/display/intel_fbdev.c > +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c > @@ -589,11 +589,8 @@ static int intel_fbdev_restore_mode(struct drm_i915_private *dev_priv) > static void intel_fbdev_client_unregister(struct drm_client_dev *client) > { > struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); > - struct drm_device *dev = fb_helper->dev; > - struct pci_dev *pdev = to_pci_dev(dev->dev); > > if (fb_helper->info) { > - vga_switcheroo_client_fb_set(pdev, NULL); > drm_fb_helper_unregister_info(fb_helper); > } else { > drm_fb_helper_unprepare(fb_helper); > @@ -620,7 +617,6 @@ static int intel_fbdev_client_hotplug(struct drm_client_dev *client) > { > struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); > struct drm_device *dev = client->dev; > - struct pci_dev *pdev = to_pci_dev(dev->dev); > int ret; > > if (dev->fb_helper) > @@ -634,8 +630,6 @@ static int intel_fbdev_client_hotplug(struct drm_client_dev *client) > if (ret) > goto err_drm_fb_helper_fini; > > - vga_switcheroo_client_fb_set(pdev, fb_helper->info); > - > return 0; > > err_drm_fb_helper_fini: > diff --git a/drivers/gpu/drm/radeon/radeon_fbdev.c b/drivers/gpu/drm/radeon/radeon_fbdev.c > index fb70de29545c6..a197ba2f2717b 100644 > --- a/drivers/gpu/drm/radeon/radeon_fbdev.c > +++ b/drivers/gpu/drm/radeon/radeon_fbdev.c > @@ -300,10 +300,8 @@ static void radeon_fbdev_client_unregister(struct drm_client_dev *client) > { > struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); > struct drm_device *dev = fb_helper->dev; > - struct radeon_device *rdev = dev->dev_private; > > if (fb_helper->info) { > - vga_switcheroo_client_fb_set(rdev->pdev, NULL); > drm_helper_force_disable_all(dev); > drm_fb_helper_unregister_info(fb_helper); > } else { > @@ -325,7 +323,6 @@ static int radeon_fbdev_client_hotplug(struct drm_client_dev *client) > { > struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); > struct drm_device *dev = client->dev; > - struct radeon_device *rdev = dev->dev_private; > int ret; > > if (dev->fb_helper) > @@ -342,8 +339,6 @@ static int radeon_fbdev_client_hotplug(struct drm_client_dev *client) > if (ret) > goto err_drm_fb_helper_fini; > > - vga_switcheroo_client_fb_set(rdev->pdev, fb_helper->info); > - > return 0; > > err_drm_fb_helper_fini: > diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c > index 1fc1e47ae2b49..e681066736dea 100644 > --- a/drivers/video/fbdev/core/fbcon.c > +++ b/drivers/video/fbdev/core/fbcon.c > @@ -65,6 +65,7 @@ > #include <linux/string.h> > #include <linux/kd.h> > #include <linux/panic.h> > +#include <linux/pci.h> > #include <linux/printk.h> > #include <linux/slab.h> > #include <linux/fb.h> > @@ -77,6 +78,7 @@ > #include <linux/interrupt.h> > #include <linux/crc32.h> /* For counting font checksums */ > #include <linux/uaccess.h> > +#include <linux/vga_switcheroo.h> > #include <asm/irq.h> > > #include "fbcon.h" > @@ -2894,6 +2896,9 @@ void fbcon_fb_unregistered(struct fb_info *info) > > console_lock(); > > + if (info->device && dev_is_pci(info->device)) > + vga_switcheroo_client_fb_set(to_pci_dev(info->device), NULL); > + > fbcon_registered_fb[info->node] = NULL; > fbcon_num_registered_fb--; > > @@ -3027,6 +3032,10 @@ static int do_fb_registered(struct fb_info *info) > } > } > > + /* Set the fb info for vga_switcheroo clients. Does nothing otherwise. */ > + if (info->device && dev_is_pci(info->device)) > + vga_switcheroo_client_fb_set(to_pci_dev(info->device), info); > + > return ret; > } > -- -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com GF: Jochen Jaser, Andrew McDonald, Werner Knoblich, (HRB 36809, AG Nürnberg) ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-12-03 16:50 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-12-01 16:01 FAILED: patch "[PATCH] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon" failed to apply to 6.12-stable tree gregkh 2025-12-01 22:10 ` [PATCH 6.12.y] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup Sasha Levin 2025-12-02 7:40 ` Thomas Zimmermann 2025-12-02 15:52 ` Greg KH 2025-12-02 20:23 ` Sasha Levin 2025-12-03 13:19 ` Patch "drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup" has been added to the 6.12-stable tree gregkh 2025-12-03 16:50 ` [PATCH 6.12.y] drm, fbcon, vga_switcheroo: Avoid race condition in fbcon setup Thomas Zimmermann
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.