All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Ian.Campbell@eu.citrix.com, xen-devel@lists.xensource.com,
	Olivier NOEL <ONOEL@tetra-info.com>,
	keir.fraser@eu.citrix.com, JBeulich@novell.com
Subject: Re: mm.c:777:d2 Non-privileged (2) attempt to map I/O space	000f995a + (XEN) mm.c:845:d20 Error getting mfn jd (pfn 84fd) from	L1 entry 800000000246d467 for l1e_owner=20, pg_owner=32753
Date: Mon, 30 Nov 2009 22:40:21 -0800	[thread overview]
Message-ID: <4B14BA55.80503@goop.org> (raw)
In-Reply-To: <20091201031120.GA11230@phenom.dumpdata.com>

On 11/30/09 19:11, Konrad Rzeszutek Wilk wrote:
> next in the user space we do:
>  handle[i] = 'a';
>
> which causes a page_fault and we jump to the kernel:
> page_fault ->
> 	handle_mm_fault ->
> 		__do_fault()
> 		    |-----vm_ops->fault (fb_deferred_io_fault):
> 		    |   	fb_deferred_io_page:
> 		    |   		vmalloc_to_page [We now have a page]
> 		    |           vmf->page = page [page attached to the user address, good]
>                     |----mk_pte( .. ), sets PAGE_IOMAP
>                     |
>                     |----xen_set_pte_at ():
> 			[ This is the fun part ]
> 			  |----if (xen_iomap_pte(pteval)) [ checks if _PAGE_IOMAP is set]
>                                   |----xen_set_domain_pte():
> 					[which makes the PTE belong to DOMID_IO]
>
> And at that point the Xen Hypervisor is called, and spits out:
> (XEN) mm.c:845:d20 Error getting mfn jd (pfn 84fd) from L1 entry 800000000246d467 for l1e_owner=20, pg_owner=32753
>
> as it interprets the PFN as the MFN.
>   

OK, that makes sense.  Thanks for tracking it down.

> This is incorrect as the page is vmalloc-ed and has no IO backing.
>
> Poking around I've come up with three ideas to solve this:
>
> 1). Inhibit xen_fb_deferred_io_map from setting VM_IO. That fixes the issue, but
>     there are drivers (sh_mobile_lcdcfb.c) that have the fb be backed up by a physical
>     page, in which case VM_IO is correct. So this is a no go.
>   

1a) add a flag to avoid setting VM_IO?  (uncompiled, untested, uneverything)

diff --git a/drivers/video/fb_defio.c b/drivers/video/fb_defio.c
index 0a7a667..dd03822 100644
--- a/drivers/video/fb_defio.c
+++ b/drivers/video/fb_defio.c
@@ -144,7 +144,9 @@ static const struct address_space_operations fb_deferred_io_aops = {
 static int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma)
 {
 	vma->vm_ops = &fb_deferred_io_vm_ops;
-	vma->vm_flags |= ( VM_IO | VM_RESERVED | VM_DONTEXPAND );
+	vma->vm_flags |= ( VM_RESERVED | VM_DONTEXPAND );
+	if (!(info->flags & FBINFO_VIRTFB))
+	  vma->vm_flags |= VM_IO;
 	vma->vm_private_data = info;
 	return 0;
 }
diff --git a/drivers/video/xen-fbfront.c b/drivers/video/xen-fbfront.c
index 0c6b1c6..60d9d61 100644
--- a/drivers/video/xen-fbfront.c
+++ b/drivers/video/xen-fbfront.c
@@ -440,7 +440,7 @@ static int __devinit xenfb_probe(struct xenbus_device *dev,
 	fb_info->fix.type = FB_TYPE_PACKED_PIXELS;
 	fb_info->fix.accel = FB_ACCEL_NONE;
 
-	fb_info->flags = FBINFO_FLAG_DEFAULT;
+	fb_info->flags = FBINFO_DEFAULT | FBINFO_VIRTFB;
 
 	ret = fb_alloc_cmap(&fb_info->cmap, 256, 0);
 	if (ret < 0) {
diff --git a/include/linux/fb.h b/include/linux/fb.h
index f847df9..65134b5 100644
--- a/include/linux/fb.h
+++ b/include/linux/fb.h
@@ -766,6 +766,7 @@ struct fb_tile_ops {
 	 *  Hardware acceleration is turned off.  Software implementations
 	 *  of required functions (copyarea(), fillrect(), and imageblit())
 	 *  takes over; acceleration engine should be in a quiescent state */
+#define FBINFO_VIRTFB		0x0004	/* FB is in system RAM, not device */
 
 /* hints */
 #define FBINFO_PARTIAL_PAN_OK	0x0040 /* otw use pan only for double-buffering */

	J

  reply	other threads:[~2009-12-01  6:40 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-08-03  9:44 kernel BUG at arch/x86/xen/multicalls.c:103! Olivier NOEL
2009-08-04 23:55 ` Jeremy Fitzhardinge
2009-08-05  7:10   ` Olivier NOEL
2009-08-06  6:50     ` Olivier NOEL
2009-08-06 19:35       ` Jeremy Fitzhardinge
2009-11-09 23:50         ` mm.c:777:d2 Non-privileged (2) attempt to map I/O space 000f995a Konrad Rzeszutek Wilk
2009-11-10  0:20           ` Jeremy Fitzhardinge
2009-12-01  3:11           ` mm.c:777:d2 Non-privileged (2) attempt to map I/O space 000f995a + (XEN) mm.c:845:d20 Error getting mfn jd (pfn 84fd) from L1 entry 800000000246d467 for l1e_owner=20, pg_owner=32753 Konrad Rzeszutek Wilk
2009-12-01  6:40             ` Jeremy Fitzhardinge [this message]
2009-12-01 21:57               ` Konrad Rzeszutek Wilk
2009-12-01 22:44                 ` Jeremy Fitzhardinge
2009-12-01 23:05                   ` Konrad Rzeszutek Wilk
2009-12-01  9:26             ` Markus Armbruster
2009-12-01 16:14               ` Konrad Rzeszutek Wilk

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=4B14BA55.80503@goop.org \
    --to=jeremy@goop.org \
    --cc=Ian.Campbell@eu.citrix.com \
    --cc=JBeulich@novell.com \
    --cc=ONOEL@tetra-info.com \
    --cc=keir.fraser@eu.citrix.com \
    --cc=konrad.wilk@oracle.com \
    --cc=xen-devel@lists.xensource.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.