From: Daniel Vetter <daniel.vetter@ffwll.ch> To: LKML <linux-kernel@vger.kernel.org> Cc: "DRI Development" <dri-devel@lists.freedesktop.org>, "Intel Graphics Development" <intel-gfx@lists.freedesktop.org>, linux-fbdev@vger.kernel.org, "Daniel Thompson" <daniel.thompson@linaro.org>, "Bartlomiej Zolnierkiewicz" <b.zolnierkie@samsung.com>, "Daniel Vetter" <daniel.vetter@ffwll.ch>, "Daniel Vetter" <daniel.vetter@intel.com>, "Sam Ravnborg" <sam@ravnborg.org>, "Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>, "Michał Mirosław" <mirq-linux@rere.qmqm.pl>, "Peter Rosin" <peda@axentia.se>, "Hans de Goede" <hdegoede@redhat.com>, "Mikulas Patocka" <mpatocka@redhat.com>, "Rob Clark" <robdclark@gmail.com> Subject: [PATCH 25/33] fbmem: pull fbcon_fb_blanked out of fb_blank Date: Tue, 28 May 2019 11:02:56 +0200 [thread overview] Message-ID: <20190528090304.9388-26-daniel.vetter@ffwll.ch> (raw) In-Reply-To: <20190528090304.9388-1-daniel.vetter@ffwll.ch> There's a callchain of: fbcon_fb_blanked -> do_(un)blank_screen -> consw->con_blank -> fbcon_blank -> fb_blank Things don't go horribly wrong because the BKL console_lock safes the day, but that's about it. And the seeming recursion is broken in 2 ways: - Starting from the fbdev ioctl we set FBINFO_MISC_USEREVENT, which tells the fbcon_blank code to not call fb_blank. This was required to not deadlock when recursing on the fb_notifier_chain mutex. - Starting from the con_blank hook we're getting saved by the console_blanked checks in do_blank/unblank_screen. Or at least that's my theory. Anyway, recursion isn't awesome, so let's stop it. Breaking the recursion avoids the need to be in the FBINFO_MISC_USEREVENT critical section, so lets move it out of that too. The astute reader will notice that fb_blank seems to require lock_fb_info(), which the fbcon code seems to ignore. I have no idea how to fix that problem, so let's keep ignoring it. v2: I forgot the sysfs blanking code. v3: Fix typo in callchain in the commmit message (Sam). Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Reviewed-by: Sam Ravnborg <sam@ravnborg.org> Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: Sam Ravnborg <sam@ravnborg.org> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> Cc: "Michał Mirosław" <mirq-linux@rere.qmqm.pl> Cc: Peter Rosin <peda@axentia.se> Cc: Hans de Goede <hdegoede@redhat.com> Cc: Mikulas Patocka <mpatocka@redhat.com> Cc: Rob Clark <robdclark@gmail.com> --- drivers/video/fbdev/core/fbmem.c | 4 +++- drivers/video/fbdev/core/fbsysfs.c | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index 9366fbe99a58..d6713dce9e31 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -1068,7 +1068,6 @@ fb_blank(struct fb_info *info, int blank) event.data = ␣ early_ret = fb_notifier_call_chain(FB_EARLY_EVENT_BLANK, &event); - fbcon_fb_blanked(info, blank); if (info->fbops->fb_blank) ret = info->fbops->fb_blank(blank, info); @@ -1198,6 +1197,9 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd, info->flags |= FBINFO_MISC_USEREVENT; ret = fb_blank(info, arg); info->flags &= ~FBINFO_MISC_USEREVENT; + + /* might again call into fb_blank */ + fbcon_fb_blanked(info, arg); unlock_fb_info(info); console_unlock(); break; diff --git a/drivers/video/fbdev/core/fbsysfs.c b/drivers/video/fbdev/core/fbsysfs.c index 5f329278e55f..252d4f52d2a5 100644 --- a/drivers/video/fbdev/core/fbsysfs.c +++ b/drivers/video/fbdev/core/fbsysfs.c @@ -18,6 +18,7 @@ #include <linux/kernel.h> #include <linux/slab.h> #include <linux/fb.h> +#include <linux/fbcon.h> #include <linux/console.h> #include <linux/module.h> @@ -305,12 +306,15 @@ static ssize_t store_blank(struct device *device, { struct fb_info *fb_info = dev_get_drvdata(device); char *last = NULL; - int err; + int err, arg; + arg = simple_strtoul(buf, &last, 0); console_lock(); fb_info->flags |= FBINFO_MISC_USEREVENT; - err = fb_blank(fb_info, simple_strtoul(buf, &last, 0)); + err = fb_blank(fb_info, arg); fb_info->flags &= ~FBINFO_MISC_USEREVENT; + /* might again call into fb_blank */ + fbcon_fb_blanked(fb_info, arg); console_unlock(); if (err < 0) return err; -- 2.20.1
WARNING: multiple messages have this Message-ID (diff)
From: Daniel Vetter <daniel.vetter@ffwll.ch> To: LKML <linux-kernel@vger.kernel.org> Cc: "DRI Development" <dri-devel@lists.freedesktop.org>, "Intel Graphics Development" <intel-gfx@lists.freedesktop.org>, linux-fbdev@vger.kernel.org, "Daniel Thompson" <daniel.thompson@linaro.org>, "Bartlomiej Zolnierkiewicz" <b.zolnierkie@samsung.com>, "Daniel Vetter" <daniel.vetter@ffwll.ch>, "Daniel Vetter" <daniel.vetter@intel.com>, "Sam Ravnborg" <sam@ravnborg.org>, "Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>, "Michał Mirosław" <mirq-linux@rere.qmqm.pl>, "Peter Rosin" <peda@axentia.se>, "Hans de Goede" <hdegoede@redhat.com>, "Mikulas Patocka" <mpatocka@redhat.com>, "Rob Clark" <robdclark@gmail.com> Subject: [PATCH 25/33] fbmem: pull fbcon_fb_blanked out of fb_blank Date: Tue, 28 May 2019 09:02:56 +0000 [thread overview] Message-ID: <20190528090304.9388-26-daniel.vetter@ffwll.ch> (raw) In-Reply-To: <20190528090304.9388-1-daniel.vetter@ffwll.ch> There's a callchain of: fbcon_fb_blanked -> do_(un)blank_screen -> consw->con_blank -> fbcon_blank -> fb_blank Things don't go horribly wrong because the BKL console_lock safes the day, but that's about it. And the seeming recursion is broken in 2 ways: - Starting from the fbdev ioctl we set FBINFO_MISC_USEREVENT, which tells the fbcon_blank code to not call fb_blank. This was required to not deadlock when recursing on the fb_notifier_chain mutex. - Starting from the con_blank hook we're getting saved by the console_blanked checks in do_blank/unblank_screen. Or at least that's my theory. Anyway, recursion isn't awesome, so let's stop it. Breaking the recursion avoids the need to be in the FBINFO_MISC_USEREVENT critical section, so lets move it out of that too. The astute reader will notice that fb_blank seems to require lock_fb_info(), which the fbcon code seems to ignore. I have no idea how to fix that problem, so let's keep ignoring it. v2: I forgot the sysfs blanking code. v3: Fix typo in callchain in the commmit message (Sam). Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Reviewed-by: Sam Ravnborg <sam@ravnborg.org> Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: Sam Ravnborg <sam@ravnborg.org> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> Cc: "Michał Mirosław" <mirq-linux@rere.qmqm.pl> Cc: Peter Rosin <peda@axentia.se> Cc: Hans de Goede <hdegoede@redhat.com> Cc: Mikulas Patocka <mpatocka@redhat.com> Cc: Rob Clark <robdclark@gmail.com> --- drivers/video/fbdev/core/fbmem.c | 4 +++- drivers/video/fbdev/core/fbsysfs.c | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index 9366fbe99a58..d6713dce9e31 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -1068,7 +1068,6 @@ fb_blank(struct fb_info *info, int blank) event.data = ␣ early_ret = fb_notifier_call_chain(FB_EARLY_EVENT_BLANK, &event); - fbcon_fb_blanked(info, blank); if (info->fbops->fb_blank) ret = info->fbops->fb_blank(blank, info); @@ -1198,6 +1197,9 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd, info->flags |= FBINFO_MISC_USEREVENT; ret = fb_blank(info, arg); info->flags &= ~FBINFO_MISC_USEREVENT; + + /* might again call into fb_blank */ + fbcon_fb_blanked(info, arg); unlock_fb_info(info); console_unlock(); break; diff --git a/drivers/video/fbdev/core/fbsysfs.c b/drivers/video/fbdev/core/fbsysfs.c index 5f329278e55f..252d4f52d2a5 100644 --- a/drivers/video/fbdev/core/fbsysfs.c +++ b/drivers/video/fbdev/core/fbsysfs.c @@ -18,6 +18,7 @@ #include <linux/kernel.h> #include <linux/slab.h> #include <linux/fb.h> +#include <linux/fbcon.h> #include <linux/console.h> #include <linux/module.h> @@ -305,12 +306,15 @@ static ssize_t store_blank(struct device *device, { struct fb_info *fb_info = dev_get_drvdata(device); char *last = NULL; - int err; + int err, arg; + arg = simple_strtoul(buf, &last, 0); console_lock(); fb_info->flags |= FBINFO_MISC_USEREVENT; - err = fb_blank(fb_info, simple_strtoul(buf, &last, 0)); + err = fb_blank(fb_info, arg); fb_info->flags &= ~FBINFO_MISC_USEREVENT; + /* might again call into fb_blank */ + fbcon_fb_blanked(fb_info, arg); console_unlock(); if (err < 0) return err; -- 2.20.1
next prev parent reply other threads:[~2019-05-28 9:04 UTC|newest] Thread overview: 118+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-05-28 9:02 [PATCH 00/33] fbcon notifier begone v3! Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 01/33] dummycon: Sprinkle locking checks Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 02/33] fbdev: locking check for fb_set_suspend Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 03/33] vt: might_sleep() annotation for do_blank_screen Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 04/33] vt: More locking checks Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 05/33] fbdev/sa1100fb: Remove dead code Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 06/33] fbdev/cyber2000: Remove struct display Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 07/33] fbdev/aty128fb: Remove dead code Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 08/33] fbcon: s/struct display/struct fbcon_display/ Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 09/33] fbcon: Remove fbcon_has_exited Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 10/33] fbcon: call fbcon_fb_(un)registered directly Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 11/33] fbdev/sh_mobile: remove sh_mobile_lcdc_display_notify Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 12/33] fbdev/omap: sysfs files can't disappear before the device is gone Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 13/33] fbdev: " Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 14/33] staging/olpc: lock_fb_info can't fail Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 15/33] fbdev/atyfb: " Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 16/33] fbdev: lock_fb_info cannot fail Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 17/33] fbcon: call fbcon_fb_bind directly Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 18/33] fbdev: make unregister/unlink functions not fail Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 19/33] fbdev: unify unlink_framebuffer paths Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 20/33] fbdev/sh_mob: Remove fb notifier callback Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 21/33] fbdev: directly call fbcon_suspended/resumed Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 22/33] fbcon: Call fbcon_mode_deleted/new_modelist directly Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 23/33] fbdev: Call fbcon_get_requirement directly Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 24/33] Revert "backlight/fbcon: Add FB_EVENT_CONBLANK" Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-06-11 14:09 ` Daniel Thompson 2019-06-11 14:09 ` Daniel Thompson 2019-06-11 14:09 ` Daniel Thompson 2019-06-11 15:39 ` Daniel Vetter 2019-06-11 15:39 ` Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter [this message] 2019-05-28 9:02 ` [PATCH 25/33] fbmem: pull fbcon_fb_blanked out of fb_blank Daniel Vetter 2019-05-28 9:02 ` [PATCH 26/33] fbdev: remove FBINFO_MISC_USEREVENT around fb_blank Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 27/33] fb: Flatten control flow in fb_set_var Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-05-28 9:02 ` [PATCH 28/33] fbcon: replace FB_EVENT_MODE_CHANGE/_ALL with direct calls Daniel Vetter 2019-05-28 9:02 ` Daniel Vetter 2019-06-11 14:11 ` Daniel Thompson 2019-06-11 14:11 ` Daniel Thompson 2019-06-11 14:11 ` Daniel Thompson 2019-05-28 9:03 ` [PATCH 29/33] vgaswitcheroo: call fbcon_remap_all directly Daniel Vetter 2019-05-28 9:03 ` Daniel Vetter 2019-05-28 9:03 ` [PATCH 30/33] fbcon: Call con2fb_map functions directly Daniel Vetter 2019-05-28 9:03 ` Daniel Vetter 2019-05-28 9:03 ` [PATCH 31/33] fbcon: Document what I learned about fbcon locking Daniel Vetter 2019-05-28 9:03 ` Daniel Vetter 2019-05-28 9:03 ` [PATCH 32/33] staging/olpc_dcon: Add drm conversion to TODO Daniel Vetter 2019-05-28 9:03 ` Daniel Vetter 2019-05-28 9:03 ` [PATCH 33/33] backlight: simplify lcd notifier Daniel Vetter 2019-05-28 9:03 ` Daniel Vetter 2019-06-11 14:11 ` Daniel Thompson 2019-06-11 14:11 ` Daniel Thompson 2019-06-11 14:11 ` Daniel Thompson 2019-05-28 12:22 ` ✗ Fi.CI.CHECKPATCH: warning for fbcon notifier begone v3! Patchwork 2019-05-28 12:36 ` ✗ Fi.CI.SPARSE: " Patchwork 2019-05-28 12:41 ` ✓ Fi.CI.BAT: success " Patchwork 2019-05-28 18:11 ` ✓ Fi.CI.IGT: " Patchwork 2019-06-06 7:38 ` [PATCH 00/33] " Daniel Vetter 2019-06-06 7:38 ` Daniel Vetter 2019-06-07 10:07 ` Bartlomiej Zolnierkiewicz 2019-06-07 10:07 ` Bartlomiej Zolnierkiewicz 2019-06-07 14:43 ` Daniel Vetter 2019-06-07 14:43 ` Daniel Vetter 2019-06-07 14:43 ` Daniel Vetter 2019-06-11 14:16 ` Daniel Thompson 2019-06-11 14:16 ` Daniel Thompson 2019-06-11 14:16 ` Daniel Thompson 2019-06-11 15:50 ` Daniel Vetter 2019-06-11 15:50 ` Daniel Vetter 2019-06-11 15:50 ` Daniel Vetter 2019-06-12 6:09 ` Lee Jones 2019-06-12 6:09 ` Lee Jones -- strict thread matches above, loose matches on Subject: below -- 2019-05-24 8:53 [PATCH 00/33] fbcon notifier begone! Daniel Vetter 2019-05-24 8:53 ` [PATCH 25/33] fbmem: pull fbcon_fb_blanked out of fb_blank Daniel Vetter 2019-05-25 17:00 ` Sam Ravnborg 2019-05-25 17:00 ` Sam Ravnborg
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190528090304.9388-26-daniel.vetter@ffwll.ch \ --to=daniel.vetter@ffwll.ch \ --cc=b.zolnierkie@samsung.com \ --cc=daniel.thompson@linaro.org \ --cc=daniel.vetter@intel.com \ --cc=dri-devel@lists.freedesktop.org \ --cc=hdegoede@redhat.com \ --cc=intel-gfx@lists.freedesktop.org \ --cc=linux-fbdev@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=maarten.lankhorst@linux.intel.com \ --cc=mirq-linux@rere.qmqm.pl \ --cc=mpatocka@redhat.com \ --cc=peda@axentia.se \ --cc=robdclark@gmail.com \ --cc=sam@ravnborg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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.