From: "Yang, Xiaowei" <xiaowei.yang@intel.com>
To: Jan Beulich <jbeulich@novell.com>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
Keir Fraser <keir.fraser@eu.citrix.com>
Subject: Re: [PATCH] Fix domheap structure allocation when NUMA=on
Date: Tue, 24 Mar 2009 18:48:31 +0800 [thread overview]
Message-ID: <49C8BA7F.5020405@intel.com> (raw)
In-Reply-To: <49C36646.76E4.0078.0@novell.com>
[-- Attachment #1: Type: text/plain, Size: 1354 bytes --]
Jan Beulich wrote:
>>>> "Yang, Xiaowei" <xiaowei.yang@intel.com> 20.03.09 09:34 >>>
>> Jan Beulich wrote:
>>>>>> "Yang, Xiaowei" <xiaowei.yang@intel.com> 20.03.09 06:05 >>>
>>>> DIRECTMAP_VIRT_END can't be passed to virt_to_mfn(), as it's just beyond
>>>> direct map boundary and triggers ASSERT very early at boot time.
>>> While I agree to the analysis, I would think that this
>>>
>>> + mfn + needed <= virt_to_mfn(DIRECTMAP_VIRT_END - PAGE_SIZE) )
>>>
>>> should rather be
>>>
>>> + mfn + needed <= virt_to_mfn(DIRECTMAP_VIRT_END - 1) + 1 )
>>>
>> virt_to_mfn(DIRECTMAP_VIRT_END - 1) is equal to
>
> Depending on whether DIRECTMAP_VIRT_END is the last byte or the first
> following byte. Using "- 1" avoids such a dependency.
>
>> virt_to_mfn(DIRECTMAP_VIRT_END - PAGE_SIZE). Why +1? We use '<=' here.
>
> Because on the left side of the comparison we also calculate the first
> following mfn, not the last included one.
>
Jan,
Thanks for the clarification!
Now I found another potential issue. Since mfn+needed could be equal to
virt_to_mfn(DIRECTMAP_VIRT_END-1)+1, it can't be passed to mfn_to_virt()
directly - the valid range is [0,DIRECT_MAP_BYTES>>PAGE_SHIFT).
Here is the patch to fix it. More assert and 32 bit counterpart are added.
Signed-off-by: Xiaowei Yang <xiaowei.yang@intel.com>
Thanks,
xiaowei
[-- Attachment #2: mfn_to_virt.patch --]
[-- Type: text/x-patch, Size: 2559 bytes --]
diff -r 0477f9061c8a xen/common/page_alloc.c
--- a/xen/common/page_alloc.c Fri Mar 20 17:42:46 2009 +0000
+++ b/xen/common/page_alloc.c Mon Mar 23 03:04:18 2009 +0800
@@ -302,7 +302,8 @@ static unsigned long init_node_heap(int
(mfn + needed) <= (virt_to_mfn(DIRECTMAP_VIRT_END - 1) + 1) )
{
_heap[node] = mfn_to_virt(mfn);
- avail[node] = mfn_to_virt(mfn + needed) - sizeof(**avail) * NR_ZONES;
+ avail[node] = mfn_to_virt(mfn + needed - 1) +
+ PAGE_SIZE - sizeof(**avail) * NR_ZONES;
}
#endif
else if ( get_order_from_bytes(sizeof(**_heap)) ==
diff -r 0477f9061c8a xen/include/asm-x86/x86_32/page.h
--- a/xen/include/asm-x86/x86_32/page.h Fri Mar 20 17:42:46 2009 +0000
+++ b/xen/include/asm-x86/x86_32/page.h Mon Mar 23 03:04:18 2009 +0800
@@ -27,9 +27,6 @@
#define __PAGE_OFFSET (0xFF000000)
#define __XEN_VIRT_START __PAGE_OFFSET
-#define virt_to_maddr(va) ((unsigned long)(va)-DIRECTMAP_VIRT_START)
-#define maddr_to_virt(ma) ((void *)((unsigned long)(ma)+DIRECTMAP_VIRT_START))
-
#define VADDR_BITS 32
#define VADDR_MASK (~0UL)
@@ -43,6 +40,22 @@
#include <xen/config.h>
#include <asm/types.h>
+
+static inline unsigned long __virt_to_maddr(unsigned long va)
+{
+ ASSERT(va >= DIRECTMAP_VIRT_START && va < DIRECTMAP_VIRT_END);
+ return va - DIRECTMAP_VIRT_START;
+}
+#define virt_to_maddr(va) \
+ (__virt_to_maddr((unsigned long)(va)))
+
+static inline void *__maddr_to_virt(unsigned long ma)
+{
+ ASSERT(ma < DIRECTMAP_VIRT_END - DIRECTMAP_VIRT_START);
+ return (void *)(ma + DIRECTMAP_VIRT_START);
+}
+#define maddr_to_virt(ma) \
+ (__maddr_to_virt((unsigned long)(ma)))
/* read access (should only be used for debug printk's) */
typedef u64 intpte_t;
diff -r 0477f9061c8a xen/include/asm-x86/x86_64/page.h
--- a/xen/include/asm-x86/x86_64/page.h Fri Mar 20 17:42:46 2009 +0000
+++ b/xen/include/asm-x86/x86_64/page.h Mon Mar 23 03:04:42 2009 +0800
@@ -46,8 +46,14 @@ static inline unsigned long __virt_to_ma
}
#define virt_to_maddr(va) \
(__virt_to_maddr((unsigned long)(va)))
+
+static inline void *__maddr_to_virt(unsigned long ma)
+{
+ ASSERT(ma < DIRECTMAP_VIRT_END - DIRECTMAP_VIRT_START);
+ return (void *)(ma + DIRECTMAP_VIRT_START);
+}
#define maddr_to_virt(ma) \
- ((void *)((unsigned long)(ma)+DIRECTMAP_VIRT_START))
+ (__maddr_to_virt((unsigned long)(ma)))
/* read access (should only be used for debug printk's) */
typedef u64 intpte_t;
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
next prev parent reply other threads:[~2009-03-24 10:48 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-20 5:05 [PATCH] Fix domheap structure allocation when NUMA=on Yang, Xiaowei
2009-03-20 8:15 ` Jan Beulich
2009-03-20 8:34 ` Yang, Xiaowei
2009-03-20 8:47 ` Jan Beulich
2009-03-20 8:56 ` Keir Fraser
2009-03-20 9:27 ` Jan Beulich
2009-03-20 9:32 ` Keir Fraser
2009-03-24 10:48 ` Yang, Xiaowei [this message]
2009-03-24 10:55 ` Jan Beulich
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=49C8BA7F.5020405@intel.com \
--to=xiaowei.yang@intel.com \
--cc=jbeulich@novell.com \
--cc=keir.fraser@eu.citrix.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.