2 files changed, 111 insertions(+)
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
-index 369d7f3f63cb..92f35bf44f49 100644
+index 9b448ff43c4d..259fce98a308 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
-@@ -3908,6 +3908,15 @@
+@@ -3907,6 +3907,15 @@
Also, it enforces the PCI Local Bus spec
rule that those bits should be 0 in system reset
events (useful for kexec/kdump cases).
Safety option to keep boot IRQs enabled. This
should never be necessary.
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
-index bf3af7d81bdc..04ef248fb1af 100644
+index 1c566b0cbee9..d49c54c579bb 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -193,6 +193,106 @@ static int __init pci_apply_final_quirks(void)
/*
* Decoding should be disabled for a PCI device during BAR sizing to avoid
* conflict. But doing so may cause problems on host bridge and perhaps other
-@@ -4915,6 +5015,8 @@ static const struct pci_dev_acs_enabled {
+@@ -4927,6 +5027,8 @@ static const struct pci_dev_acs_enabled {
{ PCI_VENDOR_ID_CAVIUM, 0xA060, pci_quirk_mf_endpoint_acs },
/* APM X-Gene */
{ PCI_VENDOR_ID_AMCC, 0xE004, pci_quirk_xgene_acs },
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
-index fcceb8443aa9..f26717dea65f 100644
+index fefdf3a6dae3..b1f35bc88be5 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -79,7 +79,7 @@ module_param(halt_poll_ns, uint, 0644);
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/core/dev.c b/net/core/dev.c
-index 33dc2a3ff7d7..b797bc32a088 100644
+index 804aba2228c2..72bcbef321a8 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -10524,7 +10524,7 @@ static void netdev_wait_allrefs(struct net_device *dev)
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
-index 12649e4c2b29..7c2d1c272c9d 100644
+index 5d5f53f242da..790b372e6fd0 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -325,7 +325,7 @@ config PAHOLE_HAS_SPLIT_BTF
4 files changed, 8 insertions(+), 16 deletions(-)
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
-index 0eec59e4df65..38c62a44905a 100644
+index 07a2524e6efd..fd09c20a5543 100644
--- a/block/blk-cgroup.c
+++ b/block/blk-cgroup.c
@@ -887,7 +887,6 @@ static void blkcg_print_one_stat(struct blkcg_gq *blkg, struct seq_file *s)
static struct blkg_policy_data *iolatency_pd_alloc(gfp_t gfp,
diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h
-index b4de2010fba5..132e05ed6935 100644
+index bc5c04d711bb..618359e3beca 100644
--- a/include/linux/blk-cgroup.h
+++ b/include/linux/blk-cgroup.h
-@@ -152,7 +152,7 @@ typedef void (blkcg_pol_online_pd_fn)(struct blkg_policy_data *pd);
+@@ -153,7 +153,7 @@ typedef void (blkcg_pol_online_pd_fn)(struct blkg_policy_data *pd);
typedef void (blkcg_pol_offline_pd_fn)(struct blkg_policy_data *pd);
typedef void (blkcg_pol_free_pd_fn)(struct blkg_policy_data *pd);
typedef void (blkcg_pol_reset_pd_stats_fn)(struct blkg_policy_data *pd);
--- /dev/null
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Javier Martinez Canillas <javierm@redhat.com>
+Date: Tue, 25 Jan 2022 10:12:19 +0100
+Subject: [PATCH] drivers/firmware: Don't mark as busy the simple-framebuffer
+ IO resource
+
+The sysfb_create_simplefb() function requests a IO memory resource for the
+simple-framebuffer platform device, but it also marks it as busy which can
+lead to drivers requesting the same memory resource to fail.
+
+Let's drop the IORESOURCE_BUSY flag and let drivers to request it as busy
+instead.
+
+Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
+Reviewed-by: Zack Rusin <zackr@vmware.com>
+Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
+Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
+---
+ drivers/firmware/sysfb_simplefb.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firmware/sysfb_simplefb.c b/drivers/firmware/sysfb_simplefb.c
+index 757cc8b9f3de..bda8712bfd8c 100644
+--- a/drivers/firmware/sysfb_simplefb.c
++++ b/drivers/firmware/sysfb_simplefb.c
+@@ -99,7 +99,7 @@ __init int sysfb_create_simplefb(const struct screen_info *si,
+
+ /* setup IORESOURCE_MEM as framebuffer memory */
+ memset(&res, 0, sizeof(res));
+- res.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
++ res.flags = IORESOURCE_MEM;
+ res.name = simplefb_resname;
+ res.start = base;
+ res.end = res.start + length - 1;
+++ /dev/null
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Thomas Zimmermann <tzimmermann@suse.de>
-Date: Tue, 25 Jan 2022 10:12:18 +0100
-Subject: [PATCH] fbdev: Hot-unplug firmware fb devices on forced removal
-
-Hot-unplug all firmware-framebuffer devices as part of removing
-them via remove_conflicting_framebuffers() et al. Releases all
-memory regions to be acquired by native drivers.
-
-Firmware, such as EFI, install a framebuffer while posting the
-computer. After removing the firmware-framebuffer device from fbdev,
-a native driver takes over the hardware and the firmware framebuffer
-becomes invalid.
-
-Firmware-framebuffer drivers, specifically simplefb, don't release
-their device from Linux' device hierarchy. It still owns the firmware
-framebuffer and blocks the native drivers from loading. This has been
-observed in the vmwgfx driver. [1]
-
-Initiating a device removal (i.e., hot unplug) as part of
-remove_conflicting_framebuffers() removes the underlying device and
-returns the memory range to the system.
-
-[1] https://lore.kernel.org/dri-devel/20220117180359.18114-1-zack@kde.org/
-
-v2:
- * rename variable 'dev' to 'device' (Javier)
-
-Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
-Reported-by: Zack Rusin <zackr@vmware.com>
-Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
-Reviewed-by: Zack Rusin <zackr@vmware.com>
-CC: stable@vger.kernel.org # v5.11+
-Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
----
- drivers/video/fbdev/core/fbmem.c | 29 ++++++++++++++++++++++++++---
- include/linux/fb.h | 1 +
- 2 files changed, 27 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
-index 7bd5e2a4a9da..91145d93990a 100644
---- a/drivers/video/fbdev/core/fbmem.c
-+++ b/drivers/video/fbdev/core/fbmem.c
-@@ -25,6 +25,7 @@
- #include <linux/init.h>
- #include <linux/linux_logo.h>
- #include <linux/proc_fs.h>
-+#include <linux/platform_device.h>
- #include <linux/seq_file.h>
- #include <linux/console.h>
- #include <linux/kmod.h>
-@@ -1557,18 +1558,36 @@ static void do_remove_conflicting_framebuffers(struct apertures_struct *a,
- /* check all firmware fbs and kick off if the base addr overlaps */
- for_each_registered_fb(i) {
- struct apertures_struct *gen_aper;
-+ struct device *device;
-
- if (!(registered_fb[i]->flags & FBINFO_MISC_FIRMWARE))
- continue;
-
- gen_aper = registered_fb[i]->apertures;
-+ device = registered_fb[i]->device;
- if (fb_do_apertures_overlap(gen_aper, a) ||
- (primary && gen_aper && gen_aper->count &&
- gen_aper->ranges[0].base == VGA_FB_PHYS)) {
-
- printk(KERN_INFO "fb%d: switching to %s from %s\n",
- i, name, registered_fb[i]->fix.id);
-- do_unregister_framebuffer(registered_fb[i]);
-+
-+ /*
-+ * If we kick-out a firmware driver, we also want to remove
-+ * the underlying platform device, such as simple-framebuffer,
-+ * VESA, EFI, etc. A native driver will then be able to
-+ * allocate the memory range.
-+ *
-+ * If it's not a platform device, at least print a warning. A
-+ * fix would add code to remove the device from the system.
-+ */
-+ if (dev_is_platform(device)) {
-+ registered_fb[i]->forced_out = true;
-+ platform_device_unregister(to_platform_device(device));
-+ } else {
-+ pr_warn("fb%d: cannot remove device\n", i);
-+ do_unregister_framebuffer(registered_fb[i]);
-+ }
- }
- }
- }
-@@ -1895,9 +1914,13 @@ EXPORT_SYMBOL(register_framebuffer);
- void
- unregister_framebuffer(struct fb_info *fb_info)
- {
-- mutex_lock(®istration_lock);
-+ bool forced_out = fb_info->forced_out;
-+
-+ if (!forced_out)
-+ mutex_lock(®istration_lock);
- do_unregister_framebuffer(fb_info);
-- mutex_unlock(®istration_lock);
-+ if (!forced_out)
-+ mutex_unlock(®istration_lock);
- }
- EXPORT_SYMBOL(unregister_framebuffer);
-
-diff --git a/include/linux/fb.h b/include/linux/fb.h
-index 02f362c661c8..3d7306c9a706 100644
---- a/include/linux/fb.h
-+++ b/include/linux/fb.h
-@@ -502,6 +502,7 @@ struct fb_info {
- } *apertures;
-
- bool skip_vt_switch; /* no VT switch on suspend/resume required */
-+ bool forced_out; /* set when being removed by another driver */
- };
-
- static inline struct apertures_struct *alloc_apertures(unsigned int max_num) {
+++ /dev/null
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Javier Martinez Canillas <javierm@redhat.com>
-Date: Tue, 25 Jan 2022 10:12:19 +0100
-Subject: [PATCH] drivers/firmware: Don't mark as busy the simple-framebuffer
- IO resource
-
-The sysfb_create_simplefb() function requests a IO memory resource for the
-simple-framebuffer platform device, but it also marks it as busy which can
-lead to drivers requesting the same memory resource to fail.
-
-Let's drop the IORESOURCE_BUSY flag and let drivers to request it as busy
-instead.
-
-Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
-Reviewed-by: Zack Rusin <zackr@vmware.com>
-Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
-Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
----
- drivers/firmware/sysfb_simplefb.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/drivers/firmware/sysfb_simplefb.c b/drivers/firmware/sysfb_simplefb.c
-index 303a491e520d..76c4abc42a30 100644
---- a/drivers/firmware/sysfb_simplefb.c
-+++ b/drivers/firmware/sysfb_simplefb.c
-@@ -99,7 +99,7 @@ __init int sysfb_create_simplefb(const struct screen_info *si,
-
- /* setup IORESOURCE_MEM as framebuffer memory */
- memset(&res, 0, sizeof(res));
-- res.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
-+ res.flags = IORESOURCE_MEM;
- res.name = simplefb_resname;
- res.start = base;
- res.end = res.start + length - 1;
--- /dev/null
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Thomas Zimmermann <tzimmermann@suse.de>
+Date: Tue, 25 Jan 2022 10:12:20 +0100
+Subject: [PATCH] drm/simpledrm: Request memory region in driver
+
+Requesting the framebuffer memory in simpledrm marks the memory
+range as busy. This used to be done by the firmware sysfb code,
+but the driver is the correct place.
+
+v2:
+ * use I/O memory if request_mem_region() fails (Jocelyn)
+
+Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
+Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
+Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
+Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
+---
+ drivers/gpu/drm/tiny/simpledrm.c | 22 +++++++++++++++++-----
+ 1 file changed, 17 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c
+index 3e3f9ba1e885..806fdc3237b3 100644
+--- a/drivers/gpu/drm/tiny/simpledrm.c
++++ b/drivers/gpu/drm/tiny/simpledrm.c
+@@ -525,21 +525,33 @@ static int simpledrm_device_init_mm(struct simpledrm_device *sdev)
+ {
+ struct drm_device *dev = &sdev->dev;
+ struct platform_device *pdev = sdev->pdev;
+- struct resource *mem;
++ struct resource *res, *mem;
+ void __iomem *screen_base;
+ int ret;
+
+- mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+- if (!mem)
++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ if (!res)
+ return -EINVAL;
+
+- ret = devm_aperture_acquire_from_firmware(dev, mem->start, resource_size(mem));
++ ret = devm_aperture_acquire_from_firmware(dev, res->start, resource_size(res));
+ if (ret) {
+ drm_err(dev, "could not acquire memory range %pr: error %d\n",
+- mem, ret);
++ res, ret);
+ return ret;
+ }
+
++ mem = devm_request_mem_region(&pdev->dev, res->start, resource_size(res),
++ sdev->dev.driver->name);
++ if (!mem) {
++ /*
++ * We cannot make this fatal. Sometimes this comes from magic
++ * spaces our resource handlers simply don't know about. Use
++ * the I/O-memory resource as-is and try to map that instead.
++ */
++ drm_warn(dev, "could not acquire memory region %pr\n", res);
++ mem = res;
++ }
++
+ screen_base = devm_ioremap_wc(&pdev->dev, mem->start,
+ resource_size(mem));
+ if (!screen_base)
+++ /dev/null
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Thomas Zimmermann <tzimmermann@suse.de>
-Date: Tue, 25 Jan 2022 10:12:20 +0100
-Subject: [PATCH] drm/simpledrm: Request memory region in driver
-
-Requesting the framebuffer memory in simpledrm marks the memory
-range as busy. This used to be done by the firmware sysfb code,
-but the driver is the correct place.
-
-v2:
- * use I/O memory if request_mem_region() fails (Jocelyn)
-
-Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
-Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
-Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
-Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
----
- drivers/gpu/drm/tiny/simpledrm.c | 22 +++++++++++++++++-----
- 1 file changed, 17 insertions(+), 5 deletions(-)
-
-diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c
-index 5a6e89825bc2..6da507960af6 100644
---- a/drivers/gpu/drm/tiny/simpledrm.c
-+++ b/drivers/gpu/drm/tiny/simpledrm.c
-@@ -525,21 +525,33 @@ static int simpledrm_device_init_mm(struct simpledrm_device *sdev)
- {
- struct drm_device *dev = &sdev->dev;
- struct platform_device *pdev = sdev->pdev;
-- struct resource *mem;
-+ struct resource *res, *mem;
- void __iomem *screen_base;
- int ret;
-
-- mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-- if (!mem)
-+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ if (!res)
- return -EINVAL;
-
-- ret = devm_aperture_acquire_from_firmware(dev, mem->start, resource_size(mem));
-+ ret = devm_aperture_acquire_from_firmware(dev, res->start, resource_size(res));
- if (ret) {
- drm_err(dev, "could not acquire memory range %pr: error %d\n",
-- mem, ret);
-+ res, ret);
- return ret;
- }
-
-+ mem = devm_request_mem_region(&pdev->dev, res->start, resource_size(res),
-+ sdev->dev.driver->name);
-+ if (!mem) {
-+ /*
-+ * We cannot make this fatal. Sometimes this comes from magic
-+ * spaces our resource handlers simply don't know about. Use
-+ * the I/O-memory resource as-is and try to map that instead.
-+ */
-+ drm_warn(dev, "could not acquire memory region %pr\n", res);
-+ mem = res;
-+ }
-+
- screen_base = devm_ioremap_wc(&pdev->dev, mem->start,
- resource_size(mem));
- if (!screen_base)
--- /dev/null
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Thomas Zimmermann <tzimmermann@suse.de>
+Date: Tue, 25 Jan 2022 10:12:21 +0100
+Subject: [PATCH] fbdev/simplefb: Request memory region in driver
+
+Requesting the framebuffer memory in simpledrm marks the memory
+range as busy. This used to be done by the firmware sysfb code,
+but the driver is the correct place.
+
+v2:
+ * store memory region in struct for later cleanup (Javier)
+
+Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
+Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
+Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
+---
+ drivers/video/fbdev/simplefb.c | 65 +++++++++++++++++++++++-----------
+ 1 file changed, 45 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c
+index b63074fd892e..6885ac0203de 100644
+--- a/drivers/video/fbdev/simplefb.c
++++ b/drivers/video/fbdev/simplefb.c
+@@ -66,16 +66,36 @@ static int simplefb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
+ return 0;
+ }
+
+-struct simplefb_par;
++struct simplefb_par {
++ u32 palette[PSEUDO_PALETTE_SIZE];
++ struct resource *mem;
++#if defined CONFIG_OF && defined CONFIG_COMMON_CLK
++ bool clks_enabled;
++ unsigned int clk_count;
++ struct clk **clks;
++#endif
++#if defined CONFIG_OF && defined CONFIG_REGULATOR
++ bool regulators_enabled;
++ u32 regulator_count;
++ struct regulator **regulators;
++#endif
++};
++
+ static void simplefb_clocks_destroy(struct simplefb_par *par);
+ static void simplefb_regulators_destroy(struct simplefb_par *par);
+
+ static void simplefb_destroy(struct fb_info *info)
+ {
++ struct simplefb_par *par = info->par;
++ struct resource *mem = par->mem;
++
+ simplefb_regulators_destroy(info->par);
+ simplefb_clocks_destroy(info->par);
+ if (info->screen_base)
+ iounmap(info->screen_base);
++
++ if (mem)
++ release_mem_region(mem->start, resource_size(mem));
+ }
+
+ static const struct fb_ops simplefb_ops = {
+@@ -169,20 +189,6 @@ static int simplefb_parse_pd(struct platform_device *pdev,
+ return 0;
+ }
+
+-struct simplefb_par {
+- u32 palette[PSEUDO_PALETTE_SIZE];
+-#if defined CONFIG_OF && defined CONFIG_COMMON_CLK
+- bool clks_enabled;
+- unsigned int clk_count;
+- struct clk **clks;
+-#endif
+-#if defined CONFIG_OF && defined CONFIG_REGULATOR
+- bool regulators_enabled;
+- u32 regulator_count;
+- struct regulator **regulators;
+-#endif
+-};
+-
+ #if defined CONFIG_OF && defined CONFIG_COMMON_CLK
+ /*
+ * Clock handling code.
+@@ -405,7 +411,7 @@ static int simplefb_probe(struct platform_device *pdev)
+ struct simplefb_params params;
+ struct fb_info *info;
+ struct simplefb_par *par;
+- struct resource *mem;
++ struct resource *res, *mem;
+
+ /*
+ * Generic drivers must not be registered if a framebuffer exists.
+@@ -430,15 +436,28 @@ static int simplefb_probe(struct platform_device *pdev)
+ if (ret)
+ return ret;
+
+- mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+- if (!mem) {
++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ if (!res) {
+ dev_err(&pdev->dev, "No memory resource\n");
+ return -EINVAL;
+ }
+
++ mem = request_mem_region(res->start, resource_size(res), "simplefb");
++ if (!mem) {
++ /*
++ * We cannot make this fatal. Sometimes this comes from magic
++ * spaces our resource handlers simply don't know about. Use
++ * the I/O-memory resource as-is and try to map that instead.
++ */
++ dev_warn(&pdev->dev, "simplefb: cannot reserve video memory at %pR\n", res);
++ mem = res;
++ }
++
+ info = framebuffer_alloc(sizeof(struct simplefb_par), &pdev->dev);
+- if (!info)
+- return -ENOMEM;
++ if (!info) {
++ ret = -ENOMEM;
++ goto error_release_mem_region;
++ }
+ platform_set_drvdata(pdev, info);
+
+ par = info->par;
+@@ -495,6 +514,9 @@ static int simplefb_probe(struct platform_device *pdev)
+ info->var.xres, info->var.yres,
+ info->var.bits_per_pixel, info->fix.line_length);
+
++ if (mem != res)
++ par->mem = mem; /* release in clean-up handler */
++
+ ret = register_framebuffer(info);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "Unable to register simplefb: %d\n", ret);
+@@ -513,6 +535,9 @@ static int simplefb_probe(struct platform_device *pdev)
+ iounmap(info->screen_base);
+ error_fb_release:
+ framebuffer_release(info);
++error_release_mem_region:
++ if (mem != res)
++ release_mem_region(mem->start, resource_size(mem));
+ return ret;
+ }
+
+++ /dev/null
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Thomas Zimmermann <tzimmermann@suse.de>
-Date: Tue, 25 Jan 2022 10:12:21 +0100
-Subject: [PATCH] fbdev/simplefb: Request memory region in driver
-
-Requesting the framebuffer memory in simpledrm marks the memory
-range as busy. This used to be done by the firmware sysfb code,
-but the driver is the correct place.
-
-v2:
- * store memory region in struct for later cleanup (Javier)
-
-Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
-Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
-Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
----
- drivers/video/fbdev/simplefb.c | 65 +++++++++++++++++++++++-----------
- 1 file changed, 45 insertions(+), 20 deletions(-)
-
-diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c
-index b63074fd892e..6885ac0203de 100644
---- a/drivers/video/fbdev/simplefb.c
-+++ b/drivers/video/fbdev/simplefb.c
-@@ -66,16 +66,36 @@ static int simplefb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
- return 0;
- }
-
--struct simplefb_par;
-+struct simplefb_par {
-+ u32 palette[PSEUDO_PALETTE_SIZE];
-+ struct resource *mem;
-+#if defined CONFIG_OF && defined CONFIG_COMMON_CLK
-+ bool clks_enabled;
-+ unsigned int clk_count;
-+ struct clk **clks;
-+#endif
-+#if defined CONFIG_OF && defined CONFIG_REGULATOR
-+ bool regulators_enabled;
-+ u32 regulator_count;
-+ struct regulator **regulators;
-+#endif
-+};
-+
- static void simplefb_clocks_destroy(struct simplefb_par *par);
- static void simplefb_regulators_destroy(struct simplefb_par *par);
-
- static void simplefb_destroy(struct fb_info *info)
- {
-+ struct simplefb_par *par = info->par;
-+ struct resource *mem = par->mem;
-+
- simplefb_regulators_destroy(info->par);
- simplefb_clocks_destroy(info->par);
- if (info->screen_base)
- iounmap(info->screen_base);
-+
-+ if (mem)
-+ release_mem_region(mem->start, resource_size(mem));
- }
-
- static const struct fb_ops simplefb_ops = {
-@@ -169,20 +189,6 @@ static int simplefb_parse_pd(struct platform_device *pdev,
- return 0;
- }
-
--struct simplefb_par {
-- u32 palette[PSEUDO_PALETTE_SIZE];
--#if defined CONFIG_OF && defined CONFIG_COMMON_CLK
-- bool clks_enabled;
-- unsigned int clk_count;
-- struct clk **clks;
--#endif
--#if defined CONFIG_OF && defined CONFIG_REGULATOR
-- bool regulators_enabled;
-- u32 regulator_count;
-- struct regulator **regulators;
--#endif
--};
--
- #if defined CONFIG_OF && defined CONFIG_COMMON_CLK
- /*
- * Clock handling code.
-@@ -405,7 +411,7 @@ static int simplefb_probe(struct platform_device *pdev)
- struct simplefb_params params;
- struct fb_info *info;
- struct simplefb_par *par;
-- struct resource *mem;
-+ struct resource *res, *mem;
-
- /*
- * Generic drivers must not be registered if a framebuffer exists.
-@@ -430,15 +436,28 @@ static int simplefb_probe(struct platform_device *pdev)
- if (ret)
- return ret;
-
-- mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-- if (!mem) {
-+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ if (!res) {
- dev_err(&pdev->dev, "No memory resource\n");
- return -EINVAL;
- }
-
-+ mem = request_mem_region(res->start, resource_size(res), "simplefb");
-+ if (!mem) {
-+ /*
-+ * We cannot make this fatal. Sometimes this comes from magic
-+ * spaces our resource handlers simply don't know about. Use
-+ * the I/O-memory resource as-is and try to map that instead.
-+ */
-+ dev_warn(&pdev->dev, "simplefb: cannot reserve video memory at %pR\n", res);
-+ mem = res;
-+ }
-+
- info = framebuffer_alloc(sizeof(struct simplefb_par), &pdev->dev);
-- if (!info)
-- return -ENOMEM;
-+ if (!info) {
-+ ret = -ENOMEM;
-+ goto error_release_mem_region;
-+ }
- platform_set_drvdata(pdev, info);
-
- par = info->par;
-@@ -495,6 +514,9 @@ static int simplefb_probe(struct platform_device *pdev)
- info->var.xres, info->var.yres,
- info->var.bits_per_pixel, info->fix.line_length);
-
-+ if (mem != res)
-+ par->mem = mem; /* release in clean-up handler */
-+
- ret = register_framebuffer(info);
- if (ret < 0) {
- dev_err(&pdev->dev, "Unable to register simplefb: %d\n", ret);
-@@ -513,6 +535,9 @@ static int simplefb_probe(struct platform_device *pdev)
- iounmap(info->screen_base);
- error_fb_release:
- framebuffer_release(info);
-+error_release_mem_region:
-+ if (mem != res)
-+ release_mem_region(mem->start, resource_size(mem));
- return ret;
- }
-
+++ /dev/null
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jens Axboe <axboe@kernel.dk>
-Date: Fri, 8 Apr 2022 11:08:58 -0600
-Subject: [PATCH] io_uring: fix race between timeout flush and removal
-
-commit e677edbcabee849bfdd43f1602bccbecf736a646 upstream.
-
-io_flush_timeouts() assumes the timeout isn't in progress of triggering
-or being removed/canceled, so it unconditionally removes it from the
-timeout list and attempts to cancel it.
-
-Leave it on the list and let the normal timeout cancelation take care
-of it.
-
-Cc: stable@vger.kernel.org # 5.5+
-Signed-off-by: Jens Axboe <axboe@kernel.dk>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
----
- fs/io_uring.c | 7 +++----
- 1 file changed, 3 insertions(+), 4 deletions(-)
-
-diff --git a/fs/io_uring.c b/fs/io_uring.c
-index 156c54ebb62b..367b7ba2fcb0 100644
---- a/fs/io_uring.c
-+++ b/fs/io_uring.c
-@@ -1546,12 +1546,11 @@ static void io_flush_timeouts(struct io_ring_ctx *ctx)
- __must_hold(&ctx->completion_lock)
- {
- u32 seq = ctx->cached_cq_tail - atomic_read(&ctx->cq_timeouts);
-+ struct io_kiocb *req, *tmp;
-
- spin_lock_irq(&ctx->timeout_lock);
-- while (!list_empty(&ctx->timeout_list)) {
-+ list_for_each_entry_safe(req, tmp, &ctx->timeout_list, timeout.list) {
- u32 events_needed, events_got;
-- struct io_kiocb *req = list_first_entry(&ctx->timeout_list,
-- struct io_kiocb, timeout.list);
-
- if (io_is_timeout_noseq(req))
- break;
-@@ -1568,7 +1567,6 @@ static void io_flush_timeouts(struct io_ring_ctx *ctx)
- if (events_got < events_needed)
- break;
-
-- list_del_init(&req->timeout.list);
- io_kill_timeout(req, 0);
- }
- ctx->cq_last_tm_flush = seq;
-@@ -6209,6 +6207,7 @@ static int io_timeout_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe,
- if (get_timespec64(&data->ts, u64_to_user_ptr(sqe->addr)))
- return -EFAULT;
-
-+ INIT_LIST_HEAD(&req->timeout.list);
- data->mode = io_translate_timeout_mode(flags);
- hrtimer_init(&data->timer, io_timeout_get_clock(data), data->mode);
-