[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/2] [xencomm, linux] linux xencomm consolidation
NOTE: This patch touches powerpc code. I tested it with cross compilation, but didn't run it on a powerpc machine. I don't have any access to it. # HG changeset patch # User yamahata@xxxxxxxxxxxxx # Date 1186063791 -32400 # Node ID 5aebf2a66a51b953bfc2c5e502d214ce2f35a0a7 # Parent 8d5ae51a09a66ff450b46ebb09ff99475604ed91 various fixes xencomm.c for ia64 xencomm consolidation - move xen_guest_handle() macro into include/xen/xencomm.h It is also ia64 code. - is_kern_addr() is powerpc specific. 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 on ia64 doesn't handle properly auto variables with align attribute. PATCHNAME: fix_xencomm_create_in_common_code Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>) diff -r 8d5ae51a09a6 -r 5aebf2a66a51 arch/powerpc/platforms/xen/setup.h --- a/arch/powerpc/platforms/xen/setup.h Wed Aug 01 15:16:46 2007 +0100 +++ b/arch/powerpc/platforms/xen/setup.h Thu Aug 02 23:09:51 2007 +0900 @@ -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 8d5ae51a09a6 -r 5aebf2a66a51 drivers/xen/core/xencomm.c --- a/drivers/xen/core/xencomm.c Wed Aug 01 15:16:46 2007 +0100 +++ b/drivers/xen/core/xencomm.c Thu Aug 02 23:09:51 2007 +0900 @@ -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 8d5ae51a09a6 -r 5aebf2a66a51 include/xen/xencomm.h --- a/include/xen/xencomm.h Wed Aug 01 15:16:46 2007 +0100 +++ b/include/xen/xencomm.h Thu Aug 02 23:09:51 2007 +0900 @@ -35,10 +35,29 @@ 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);}) +#ifdef __ia64__ +/* + * workaround: + * gcc 4.1.2 on ia64 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))); +#else +#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]; +#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 +67,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_ */ -- yamahata _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |