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

[Xen-changelog] [linux-2.6.18-xen] [linux, xencomm] Various fixes common xencomm.c for ia64 xencomm consolidation



# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1187103849 -3600
# Node ID 98c2205a7455c2b07cd18ce1f4f39571897d1b28
# Parent  5027cbb9e3ebc5e00c7c4419370bce7a33dadb82
[linux, xencomm] Various fixes common xencomm.c for ia64 xencomm consolidation
  - move xen_guest_handle() macro into include/xen/xencomm.h
    ia64 also uses it.
  - is_kern_addr() is powerpc specific. and other arch doesn't
  implement it.
    It will be defined in linux/include/asm-ia64/xen/xencomm.h
  - fix error recovery path of xencomm_create()
    xencomm_free() requires pseudo physical address, not virtual
    address.
  - add one BUG_ON() to xencomm_create_mini() for alignment
  requirement
  - use xencomm_pa() instead of __pa() in xencomm_map() and
    xencomm_map_no_alloc().
    They should work for statically allocated area. On ia64 it isn't
    in
    straight mapping area so that xencomm_pa() is necessary.
  - add gcc bug work around. gcc 4.1.2 doesn't handle properly
    variables on stack with align attribute.
    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16660

Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>)
---
 arch/powerpc/platforms/xen/setup.h |    2 --
 drivers/xen/core/xencomm.c         |   10 +++++++---
 include/xen/xencomm.h              |   30 ++++++++++++++++++++++++++----
 3 files changed, 33 insertions(+), 9 deletions(-)

diff -r 5027cbb9e3eb -r 98c2205a7455 arch/powerpc/platforms/xen/setup.h
--- a/arch/powerpc/platforms/xen/setup.h        Mon Aug 13 16:40:36 2007 +0100
+++ b/arch/powerpc/platforms/xen/setup.h        Tue Aug 14 16:04:09 2007 +0100
@@ -40,8 +40,6 @@ static inline u64 jiffies_to_ns(unsigned
        return j * (1000000000UL / HZ);
 }
 
-#define xen_guest_handle(hnd)  ((hnd).p)
-
 extern struct page *alloc_foreign_page(void);
 extern void free_foreign_page(struct page *page);
 
diff -r 5027cbb9e3eb -r 98c2205a7455 drivers/xen/core/xencomm.c
--- a/drivers/xen/core/xencomm.c        Mon Aug 13 16:40:36 2007 +0100
+++ b/drivers/xen/core/xencomm.c        Tue Aug 14 16:04:09 2007 +0100
@@ -23,6 +23,9 @@
 #include <asm/page.h>
 #include <xen/xencomm.h>
 #include <xen/interface/xen.h>
+#ifdef __ia64__
+#include <asm/xen/xencomm.h>   /* for is_kern_addr() */
+#endif
 
 static int xencomm_init(struct xencomm_desc *desc,
                        void *buffer, unsigned long bytes)
@@ -111,7 +114,7 @@ static int xencomm_create(void *buffer, 
        rc = xencomm_init(desc, buffer, bytes);
        if (rc) {
                printk("%s failure: %d\n", "xencomm_init", rc);
-               xencomm_free(desc);
+               xencomm_free((void *)__pa(desc));
                return rc;
        }
 
@@ -146,6 +149,7 @@ static int xencomm_create_mini(void *buf
 {
        int rc = 0;
        struct xencomm_desc *desc;
+       BUG_ON(((unsigned long)xc_desc) % sizeof(*xc_desc) != 0);
 
        desc = (void *)xc_desc; 
 
@@ -170,7 +174,7 @@ void *xencomm_map(void *ptr, unsigned lo
        if (rc || desc == NULL)
                return NULL;
 
-       return (void *)__pa(desc);
+       return xencomm_pa(desc);
 }
 
 void *__xencomm_map_no_alloc(void *ptr, unsigned long bytes, 
@@ -188,5 +192,5 @@ void *__xencomm_map_no_alloc(void *ptr, 
        if (rc)
                return NULL;
  
-       return (void *)__pa(desc);
+       return xencomm_pa(desc);
 }
diff -r 5027cbb9e3eb -r 98c2205a7455 include/xen/xencomm.h
--- a/include/xen/xencomm.h     Mon Aug 13 16:40:36 2007 +0100
+++ b/include/xen/xencomm.h     Tue Aug 14 16:04:09 2007 +0100
@@ -35,10 +35,30 @@ extern void *__xencomm_map_no_alloc(void
 extern void *__xencomm_map_no_alloc(void *ptr, unsigned long bytes, 
                                struct xencomm_mini *xc_area);
 
-#define xencomm_map_no_alloc(ptr, bytes) \
-       ({struct xencomm_mini xc_desc\
-               __attribute__((__aligned__(sizeof(struct xencomm_mini))));\
-               __xencomm_map_no_alloc(ptr, bytes, &xc_desc);})
+#if 0
+#define XENCOMM_MINI_ALIGNED(xc_desc, n)                               \
+       struct xencomm_mini xc_desc ## _base[(n)]                       \
+       __attribute__((__aligned__(sizeof(struct xencomm_mini))));      \
+       struct xencomm_mini* xc_desc = &xc_desc ## _base[0];
+#else
+/*
+ * gcc bug workaround:
+ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16660
+ * gcc doesn't handle properly stack variable with
+ * __attribute__((__align__(sizeof(struct xencomm_mini))))
+ */
+#define XENCOMM_MINI_ALIGNED(xc_desc, n)                               \
+       unsigned char xc_desc ## _base[((n) + 1 ) *                     \
+                                      sizeof(struct xencomm_mini)];    \
+       struct xencomm_mini *xc_desc = (struct xencomm_mini*)           \
+               ((unsigned long)xc_desc ## _base +                      \
+                (sizeof(struct xencomm_mini) -                         \
+                 ((unsigned long)xc_desc ## _base) %                   \
+                 sizeof(struct xencomm_mini)));
+#endif
+#define xencomm_map_no_alloc(ptr, bytes)                       \
+       ({XENCOMM_MINI_ALIGNED(xc_desc, 1);                     \
+               __xencomm_map_no_alloc(ptr, bytes, xc_desc);})
 
 /* provided by architecture code: */
 extern unsigned long xencomm_vtop(unsigned long vaddr);
@@ -48,4 +68,6 @@ static inline void *xencomm_pa(void *ptr
        return (void *)xencomm_vtop((unsigned long)ptr);
 }
 
+#define xen_guest_handle(hnd)  ((hnd).p)
+
 #endif /* _LINUX_XENCOMM_H_ */

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


 


Rackspace

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