[Intel-gfx] [PATCH 1/3] drm/fbdev: Return -EBUSY when oopsing

Rob Clark robdclark at gmail.com
Tue Jul 28 09:06:43 PDT 2015


On Tue, Jul 28, 2015 at 11:55 AM, Daniel Vetter <daniel at ffwll.ch> wrote:
> On Tue, Jul 28, 2015 at 10:30:08AM -0400, Rob Clark wrote:
>> On Tue, Jul 28, 2015 at 7:18 AM, Daniel Vetter <daniel.vetter at ffwll.ch> wrote:
>> > Trying to do anything with kms drivers when oopsing has become a
>> > failing proposition. But since we can end up in the fbdev code simply
>> > due to the console unblanking that's done unconditionally just
>> > removing our panic handler isn't enough. We need to block all fbdev
>> > callbacks when oopsing.
>> >
>> > There was already one in the blank handler, but it failed silently.
>> > That makes it impossible for drivers (like i915) who subclass these
>> > functions to figure this out.
>> >
>> > Instead consistently return -EBUSY so that everyone knows that we
>> > really don't want to be bothered right now. This also allows us to
>> > remove a pile of FIXMEs from the i915 fbdev code (since due to the
>> > failure code they now won't attempt to grab dangerous locks any more).
>>
>> I guess drivers that were keeping fbdev buffer pinned just for opps'
>> can stop doing that now..
>
> Well there's still the kgdb stuff, but we might want to nuke that too.
> Also fbdev assumes (at least afaik) that the mmap is always valid and it
> just writes to it. At least that's why we have the fbdev_set_suspend call
> to in suspend/resume to tell it that now it's really no longer cool to
> draw fbcon. But userspace doesn't have anything like that I think.

we couldn't put_pages but we could unpin from iommu/gtt/etc and unpin
the pages so they could be moved by mm at least.. but letting 'em get
swapped out, probably not..

BR,
-R

>> anyways, lgtm.. for the series:
>>
>> Reviewed-by: Rob Clark <robdclark at gmail.com>
>
> Thanks for the review, all merged.
> -Daniel
>
>>
>> > Cc: Dave Airlie <airlied at gmail.com>
>> > Cc: Rodrigo Vivi <rodrigo.vivi at gmail.com>
>> > Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
>> > ---
>> >  drivers/gpu/drm/drm_fb_helper.c    | 24 ++++++++++++------------
>> >  drivers/gpu/drm/i915/intel_fbdev.c | 21 ---------------------
>> >  2 files changed, 12 insertions(+), 33 deletions(-)
>> >
>> > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
>> > index 73f90f7e2f74..77f570a470da 100644
>> > --- a/drivers/gpu/drm/drm_fb_helper.c
>> > +++ b/drivers/gpu/drm/drm_fb_helper.c
>> > @@ -491,14 +491,6 @@ static void drm_fb_helper_dpms(struct fb_info *info, int dpms_mode)
>> >         int i, j;
>> >
>> >         /*
>> > -        * fbdev->blank can be called from irq context in case of a panic.
>> > -        * Since we already have our own special panic handler which will
>> > -        * restore the fbdev console mode completely, just bail out early.
>> > -        */
>> > -       if (oops_in_progress)
>> > -               return;
>> > -
>> > -       /*
>> >          * For each CRTC in this fb, turn the connectors on/off.
>> >          */
>> >         drm_modeset_lock_all(dev);
>> > @@ -531,6 +523,9 @@ static void drm_fb_helper_dpms(struct fb_info *info, int dpms_mode)
>> >   */
>> >  int drm_fb_helper_blank(int blank, struct fb_info *info)
>> >  {
>> > +       if (oops_in_progress)
>> > +               return -EBUSY;
>> > +
>> >         switch (blank) {
>> >         /* Display: On; HSync: On, VSync: On */
>> >         case FB_BLANK_UNBLANK:
>> > @@ -755,9 +750,10 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info)
>> >         int i, j, rc = 0;
>> >         int start;
>> >
>> > -       if (__drm_modeset_lock_all(dev, !!oops_in_progress)) {
>> > +       if (oops_in_progress)
>> >                 return -EBUSY;
>> > -       }
>> > +
>> > +       drm_modeset_lock_all(dev);
>> >         if (!drm_fb_helper_is_bound(fb_helper)) {
>> >                 drm_modeset_unlock_all(dev);
>> >                 return -EBUSY;
>> > @@ -906,6 +902,9 @@ int drm_fb_helper_set_par(struct fb_info *info)
>> >         struct drm_fb_helper *fb_helper = info->par;
>> >         struct fb_var_screeninfo *var = &info->var;
>> >
>> > +       if (oops_in_progress)
>> > +               return -EBUSY;
>> > +
>> >         if (var->pixclock != 0) {
>> >                 DRM_ERROR("PIXEL CLOCK SET\n");
>> >                 return -EINVAL;
>> > @@ -931,9 +930,10 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
>> >         int ret = 0;
>> >         int i;
>> >
>> > -       if (__drm_modeset_lock_all(dev, !!oops_in_progress)) {
>> > +       if (oops_in_progress)
>> >                 return -EBUSY;
>> > -       }
>> > +
>> > +       drm_modeset_lock_all(dev);
>> >         if (!drm_fb_helper_is_bound(fb_helper)) {
>> >                 drm_modeset_unlock_all(dev);
>> >                 return -EBUSY;
>> > diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
>> > index eef54feb7545..b763f24e20ef 100644
>> > --- a/drivers/gpu/drm/i915/intel_fbdev.c
>> > +++ b/drivers/gpu/drm/i915/intel_fbdev.c
>> > @@ -55,13 +55,6 @@ static int intel_fbdev_set_par(struct fb_info *info)
>> >         ret = drm_fb_helper_set_par(info);
>> >
>> >         if (ret == 0) {
>> > -               /*
>> > -                * FIXME: fbdev presumes that all callbacks also work from
>> > -                * atomic contexts and relies on that for emergency oops
>> > -                * printing. KMS totally doesn't do that and the locking here is
>> > -                * by far not the only place this goes wrong.  Ignore this for
>> > -                * now until we solve this for real.
>> > -                */
>> >                 mutex_lock(&fb_helper->dev->struct_mutex);
>> >                 intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
>> >                 mutex_unlock(&fb_helper->dev->struct_mutex);
>> > @@ -80,13 +73,6 @@ static int intel_fbdev_blank(int blank, struct fb_info *info)
>> >         ret = drm_fb_helper_blank(blank, info);
>> >
>> >         if (ret == 0) {
>> > -               /*
>> > -                * FIXME: fbdev presumes that all callbacks also work from
>> > -                * atomic contexts and relies on that for emergency oops
>> > -                * printing. KMS totally doesn't do that and the locking here is
>> > -                * by far not the only place this goes wrong.  Ignore this for
>> > -                * now until we solve this for real.
>> > -                */
>> >                 mutex_lock(&fb_helper->dev->struct_mutex);
>> >                 intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
>> >                 mutex_unlock(&fb_helper->dev->struct_mutex);
>> > @@ -106,13 +92,6 @@ static int intel_fbdev_pan_display(struct fb_var_screeninfo *var,
>> >         ret = drm_fb_helper_pan_display(var, info);
>> >
>> >         if (ret == 0) {
>> > -               /*
>> > -                * FIXME: fbdev presumes that all callbacks also work from
>> > -                * atomic contexts and relies on that for emergency oops
>> > -                * printing. KMS totally doesn't do that and the locking here is
>> > -                * by far not the only place this goes wrong.  Ignore this for
>> > -                * now until we solve this for real.
>> > -                */
>> >                 mutex_lock(&fb_helper->dev->struct_mutex);
>> >                 intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
>> >                 mutex_unlock(&fb_helper->dev->struct_mutex);
>> > --
>> > 2.1.4
>> >
>> > _______________________________________________
>> > dri-devel mailing list
>> > dri-devel at lists.freedesktop.org
>> > http://lists.freedesktop.org/mailman/listinfo/dri-devel
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> http://blog.ffwll.ch


More information about the dri-devel mailing list