[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 |
Lists.xenproject.org is hosted with RackSpace, monitoring our |