All of lore.kernel.org
 help / color / mirror / Atom feed
From: rui wang <ruiv.wang@gmail.com>
To: Borislav Petkov <bp@alien8.de>
Cc: linux-kernel@vger.kernel.org, tony.luck@intel.com,
	aris@redhat.com, rui.y.wang@intel.com
Subject: Re: Bug: Fatal errors result in infinite stream of error messages
Date: Thu, 4 Dec 2014 20:51:54 +0800	[thread overview]
Message-ID: <CANVTcTbaGxDPQx503m91KqUY1oGPMTQR3ZCXNrfC5LKs44pBmw@mail.gmail.com> (raw)
In-Reply-To: <20141203205237.GE31246@pd.tnic>

On 12/4/14, Borislav Petkov <bp@alien8.de> wrote:
> On Wed, Dec 03, 2014 at 05:11:49PM +0800, rui wang wrote:
>> The problem is because kdump fails to load a new kernel, and we're
>> executing past crash_kexec() in panic(). And it calls
>> bust_spinlocks(0) which calls into the GPU driver trying to unblank
>> the screen, which eventually calls __schedule() while waiting for a
>> mutex to be released. But we're still in the machine check context.
>> The infinite stream of errors is because there's a for(;;) loop in
>> __mutex_lock_common(), so we enter __schedule() again and again.
>
> Hmm, there's a bust_spinlocks(1) call in mce_panic() for which I have no
> idea what it is for? To stop us from scheduling?
>
> If so, why doesn't it stop us...?
>
> There's also this:
>
> void console_unblank(void)
> {
>         struct console *c;
>
>         /*
>          * console_unblank can no longer be called in interrupt context
> unless
> ====>    * oops_in_progress is set to 1..
>          */
>         if (oops_in_progress) {
>                 if (down_trylock_console_sem() != 0)
>                         return;
>         } else
>                 console_lock();
>

That points to the direction of a potential fix. There are places
under drivers/gpu/drm/ which should do this kind of check in order to
make it work in panic. An existing example is here :

void drm_warn_on_modeset_not_all_locked(struct drm_device *dev)
{
        struct drm_crtc *crtc;

        /* Locking is currently fubar in the panic handler. */
        if (oops_in_progress) <======
                return;

        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
                WARN_ON(!drm_modeset_is_locked(&crtc->mutex));

        WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
        WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
}

I'll send a patch later.

Thanks
Rui

      reply	other threads:[~2014-12-04 12:51 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-03  9:11 Bug: Fatal errors result in infinite stream of error messages rui wang
2014-12-03 20:52 ` Borislav Petkov
2014-12-04 12:51   ` rui wang [this message]

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=CANVTcTbaGxDPQx503m91KqUY1oGPMTQR3ZCXNrfC5LKs44pBmw@mail.gmail.com \
    --to=ruiv.wang@gmail.com \
    --cc=aris@redhat.com \
    --cc=bp@alien8.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rui.y.wang@intel.com \
    --cc=tony.luck@intel.com \
    /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: link
Be 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.