WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [linux-2.6.18-xen] [linux, xencomm] Various fixes common

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [linux-2.6.18-xen] [linux, xencomm] Various fixes common xencomm.c for ia64 xencomm consolidation
From: "Xen patchbot-linux-2.6.18-xen" <patchbot-linux-2.6.18-xen@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 16 Aug 2007 07:40:43 -0700
Delivery-date: Thu, 16 Aug 2007 07:43:43 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# 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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [linux-2.6.18-xen] [linux, xencomm] Various fixes common xencomm.c for ia64 xencomm consolidation, Xen patchbot-linux-2.6.18-xen <=