Re: 2.6.30-rc8 Oops whilst booting

Jaswinder Singh Rajput
2009-06-08T17:05:36Z

On Mon, 2009-06-08 at 16:51 +0000, James Bottomley wrote:
> On Mon, 2009-06-08 at 09:21 -0700, Linus Torvalds wrote:
> >
> > On Mon, 8 Jun 2009, Chris Clayton wrote:
> > >
> > > OK. I reversed that change and built and installed the kernel. It has
> > > withstood 100 reboots without a panic. Additionally, I pulled the
> > > latest changes (that will be rc8-git5, I think) from kernel.org,
> > > reversed the change to that kernel and built and installed it. That
> > > too withstood 100 reboots without a panic.
> > >
> > > Let me know if there's anything else I can do to help fix this.
> >
> > That's already pretty convincing.
> >
> > James, Arjan? The original oops message is here (a jpg screen capture,
> > unable to open initial console):
> >
> > http://lkml.org/lkml/2009/6/6/142
> >
> > and it's this bug entry:
> >
> > Bug-Entry : http://bugzilla.kernel.org/show_bug.cgi?id=13474
> > Subject : Oops whilst booting
> > Submitter : Chris Clayton <chris2553@googlemail.com>
> > Date : 2009-06-06 18:59 (2 days old)
> > References : http://marc.info/?l=linux-kernel&m=124431487924254&w=4
> >
> > and now bisected down to
> >
> > >> commit d5a877e8dd409d8c702986d06485c374b705d340
> > >> Author: James Bottomley <James.Bottomley@HansenPartnership.com>
> > >> Date: Sun May 24 13:03:43 2009 -0700
> > >>
> > >> async: make sure independent async domains can't accidentally entangle
> >
> > please advice. Otherwise I'll have to revert.
>
> The root cause is a reordering of the devices caused by the async code.
>
> I suspect it's a bug in async that was obscured by the old behaviour of
> async_synchronize.. (or it's a bug in the new code) ... how long do I
> have to find out which?
>

But reverting your patch Or if we return like this also fix chris
problem :

diff --git a/kernel/async.c b/kernel/async.c
index 94dd36f..3b492cb 100644
--- a/kernel/async.c
+++ b/kernel/async.c
@@ -96,15 +96,13 @@ static async_cookie_t __lowest_in_progress(struct list_head *running)
if (!list_empty(running)) {
entry = list_first_entry(running,
struct async_entry, list);
- ret = entry->cookie;
+ return entry->cookie;
}

if (!list_empty(&async_pending)) {
list_for_each_entry(entry, &async_pending, list)
- if (entry->running == running) {
- ret = entry->cookie;
- break;
- }
+ if (entry->running == running)
+ return entry->cookie;
}

return ret;