From: Matt Mackall <mpm@selenic.com>
To: "Randy.Dunlap" <rddunlap@osdl.org>
Cc: davej@redhat.com, akpm@osdl.org, linux-kernel@vger.kernel.org
Subject: Re: Debug: sleeping function called from invalid context
Date: Mon, 18 Aug 2003 16:26:01 -0500 [thread overview]
Message-ID: <20030818212601.GE16387@waste.org> (raw)
In-Reply-To: <20030818140729.2e3b02f2.rddunlap@osdl.org>
On Mon, Aug 18, 2003 at 02:07:29PM -0700, Randy.Dunlap wrote:
> On Sat, 16 Aug 2003 02:06:52 -0500 Matt Mackall <mpm@selenic.com> wrote:
>
> | On Fri, Aug 15, 2003 at 12:30:53PM -0700, Randy.Dunlap wrote:
> | > On Fri, 15 Aug 2003 18:32:47 +0100 Dave Jones <davej@redhat.com> wrote:
> | >
> | > | On Fri, Aug 15, 2003 at 10:18:56AM -0700, Randy.Dunlap wrote:
> | > |
> | > | > Debug: sleeping function called from invalid context at include/asm/uaccess.h:473
> | > | > Call Trace:
> | > | > [<c0120d94>] __might_sleep+0x54/0x5b
> | > | > [<c010d001>] save_v86_state+0x71/0x1f0
> | > | > [<c010dbd5>] handle_vm86_fault+0xc5/0xa90
> | > | > [<c019cab8>] ext3_file_write+0x28/0xc0
> | > | > [<c011cd96>] __change_page_attr+0x26/0x220
> | > | > [<c010b310>] do_general_protection+0x0/0x90
> | > | > [<c010a69d>] error_code+0x2d/0x40
> | > | > [<c0109657>] syscall_call+0x7/0xb
> | > |
> | > | That's one really wierd looking backtrace. What else was that
> | > | machine up to at the time ?
> | >
> | > Some parts of it are explainable (to me), some not.
> | > I don't know what caused a GP fault or why ext3 shows up.
> | >
> | > But I can follow from do_general_protection() to handle_vm86_fault()
> | > to [inline] return_to_32bit() to save_v86_state() to __might_sleep().
> | >
> | > And __might_sleep() is correct if change_page_attr() was called,
> | > since it takes a spinlock. I just can't connect quite all of the dots.
> |
> | Ok, there's some stack noise here with the ext3_file_write and
> | __change_page_attr.
> |
> | Here's what I've figured out so far. You probably have something like
> | X running with a driver that calls an image of its own 16-bit BIOS to
> | get something done (I think Matrox does this) via sys_vm86. One of the
> | arguments to sys_vm86 is a pointer to a vm86plus_struct in userspace
> | that gets stashed away in tsk->thread.vm86_info.
> |
> | When, for whatever reason, a fixup is needed in vm86 mode, we find
> | ourselves in handle_vm86_fault and save_v86_state copied various junk
> | out to this userspace struct we've kept a pointer to. Now as far as I
> | can tell, there's nothing guaranteeing this struct is pinned down or
> | in any way guaranteed to be around when the fault occurs. If the page
> | with the struct _does_ get swapped out, we can be in trouble when we
> | hit this fault.
> |
> | If this is actually a valid analysis, we should probably just pin the
> | page for the duration of vm86 as it's already bordering on magical.
> |
> | If there's some reason this whole thing is safe, let me know and I'll
> | try to get might_sleep to stop complaining about these.
> |
> | I suppose we could test it by hacking a program guaranteed to fault in
> | vm86 mode and hacking the syscall to force the page out before calling
> | do_sys_vm86.
>
> I had another occurrence of this yesterday. It doesn't seem to be
> an error condition AFAICT.
No, it's only a warning (which I recently added to the copy_* path)
that something is used in a suspicious context. The question is "is
the warning bogus or is there something that can actually go wrong
here?".
As far as I can tell, the answer is "yes, there's a good chance this
could blow up under load". We need two things to happen: the caller's
page containing the vm86plus_struct to get swapped out, and to take
any sort of fault (including using virtualized instructions) in vm86
mode. Result: you'll hit the double-fault handler and the system will
loop forever with interrupts disabled after spitting out a few printks
that you won't see because you're in X.
--
Matt Mackall : http://www.selenic.com : of or relating to the moon
next prev parent reply other threads:[~2003-08-18 21:26 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-08-15 17:18 Debug: sleeping function called from invalid context Randy.Dunlap
2003-08-15 17:32 ` Dave Jones
2003-08-15 17:42 ` Randy.Dunlap
2003-08-15 19:30 ` Randy.Dunlap
2003-08-16 7:06 ` Matt Mackall
2003-08-18 21:07 ` Randy.Dunlap
2003-08-18 21:26 ` Matt Mackall [this message]
2003-08-19 0:13 ` Dave Jones
2003-08-19 0:15 ` Randy.Dunlap
2003-08-19 1:02 ` Zwane Mwaikambo
2003-08-19 0:15 ` Andrew Morton
2003-08-19 1:27 ` Matt Mackall
2003-08-19 3:24 ` Randy.Dunlap
2003-08-19 3:35 ` Andrew Morton
2003-08-19 3:39 ` Randy.Dunlap
2003-08-19 4:26 ` Matt Mackall
2003-08-19 4:29 ` Andrew Morton
2003-08-19 4:14 ` Matt Mackall
2003-08-19 5:14 ` Matt Mackall
2003-08-19 1:01 ` Matt Mackall
2003-08-19 1:04 ` Dave Jones
2003-08-19 1:09 ` Matt Mackall
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=20030818212601.GE16387@waste.org \
--to=mpm@selenic.com \
--cc=akpm@osdl.org \
--cc=davej@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=rddunlap@osdl.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: 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.