[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] Re: [RFC PATCH 08/35] Add Xen-specific memory management definitions



On Tue, 09 May 2006 00:00:08 -0700, Chris Wright <chrisw@xxxxxxxxxxxx> wrote:

I'm a little concerned with the code below being entirely too smart:

> +static inline unsigned long mfn_to_pfn(unsigned long mfn)
> +{
> +#ifndef CONFIG_XEN_SHADOW_MODE
> +     unsigned long pfn;
> +
> +     if (xen_feature(XENFEAT_auto_translated_physmap))
> +             return mfn;
> +
> +     /*
> +      * The array access can fail (e.g., device space beyond end of RAM).
> +      * In such cases it doesn't matter what we return (we return garbage),
> +      * but we must handle the fault without crashing!
> +      */
> +     asm (
> +             "1:     movl %1,%0\n"
> +             "2:\n"
> +             ".section __ex_table,\"a\"\n"
> +             "       .align 4\n"
> +             "       .long 1b,2b\n"
> +             ".previous"
> +             : "=r" (pfn) : "m" (machine_to_phys_mapping[mfn]) );
> +
> +     return pfn;
> +#else
> +     return mfn;
> +#endif
> +}

I found that if someone tries to use this too early, hypervisor terminates
the domain with a message like this:

(XEN) DOM0: (file=mm.c, line=486) Non-privileged attempt to map I/O space 
000fec00

Why can't we use something like this, only a proper number of machine
pages:

diff -urp -X dontdiff 
linux-2.6.15-1.2054_FC5/include/asm-x86_64/mach-xen/asm/page.h 
linux-2.6.15-1.2054_FC5.z3/include/asm-x86_64/mach-xen/asm/page.h
--- linux-2.6.15-1.2054_FC5/include/asm-x86_64/mach-xen/asm/page.h      
2006-03-17 17:52:38.000000000 -0800
+++ linux-2.6.15-1.2054_FC5.z3/include/asm-x86_64/mach-xen/asm/page.h   
2006-05-11 20:36:16.000000000 -0700
@@ -101,26 +101,11 @@ static inline int phys_to_machine_mappin
 
 static inline unsigned long mfn_to_pfn(unsigned long mfn)
 {
-       unsigned long pfn;
-
        if (xen_feature(XENFEAT_auto_translated_physmap))
                return mfn;
-
-       /*
-        * The array access can fail (e.g., device space beyond end of RAM).
-        * In such cases it doesn't matter what we return (we return garbage),
-        * but we must handle the fault without crashing!
-        */
-       asm (
-               "1:     movq %1,%0\n"
-               "2:\n"
-               ".section __ex_table,\"a\"\n"
-               "       .align 8\n"
-               "       .quad 1b,2b\n"
-               ".previous"
-               : "=r" (pfn) : "m" (machine_to_phys_mapping[mfn]) );
-
-       return pfn;
+       if (mfn >= 1048576)     /* 4GB _machine_ RAM. XXX How to find out? */
+               return ~0;
+       return machine_to_phys_mapping[mfn];
 }
 
 /*

I'm sure you considered this, but decided to be tricky. Why?
No way to find the safe number of machine pages in a guest?

-- Pete

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.