[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XenPPC] [PATCH] [UPDATE] Xencomm optimzation to work for modules
On Jan 25, 2007, at 8:06 PM, Jerone Young wrote: This patch should address all the issues Jimi has pointed out. yes it does... thank you. but still has a few issues.. Throughout the patch:1. xencomm_create_inline() could never fail, xencomm_map() can so you need to check ALL of them. 1. _inline() never allocates _map() can so you always have to call xencomm_free() 1. Please return a -ERRNO and not -1 all the time. 1. you made the descriptor void * but not everywhere. other specific issues: @@ -246,9 +244,9 @@ static int xenppc_privcmd_domctl(privcmd return -EACCES; }- ret = xencomm_create(&kern_op, sizeof(xen_domctl_t), &op_desc, GFP_KERNEL);- if (ret) - return ret; + op_desc = xencomm_map(&kern_op, sizeof(xen_domctl_t)); + if (op_desc) + return -1; if (op_desc) cannot be right.Can't see how domain creation could have possibly worked, did you test that? diff -r bbf2db4ddf54 drivers/xen/core/xencomm.c --- a/drivers/xen/core/xencomm.c Tue Dec 19 09:22:37 2006 -0500 +++ b/drivers/xen/core/xencomm.c Wed Jan 26 02:59:31 2028 -0600 @@ -82,11 +82,11 @@ static struct xencomm_desc *xencomm_allo void xencomm_free(struct xencomm_desc *desc) _map() returns a "void *" so _free() should take one. { - if (desc) + if (desc && !((ulong)desc & XENCOMM_INLINE_FLAG)) free_page((unsigned long)desc); }-int xencomm_create(void *buffer, unsigned long bytes, struct xencomm_desc **ret, gfp_t gfp_mask) +static int xencomm_create(void *buffer, unsigned long bytes, struct xencomm_desc **ret, gfp_t gfp_mask){ struct xencomm_desc *desc; int rc; @@ -119,13 +119,68 @@ int xencomm_create(void *buffer, unsigne return 0; } -void *xencomm_create_inline(void *ptr) +static void *xencomm_create_inline(void *ptr) { unsigned long paddr; - BUG_ON(!is_kernel_addr((unsigned long)ptr)); + BUG_ON(!is_phys_contiguous((unsigned long)ptr)); paddr = (unsigned long)xencomm_pa(ptr); BUG_ON(paddr & XENCOMM_INLINE_FLAG); return (void *)(paddr | XENCOMM_INLINE_FLAG); } + +/* "mini" routine, for stack-based communications: */ +static int xencomm_create_mini(int arealen, void *buffer, + unsigned long bytes, struct xencomm_desc **ret) +{ + struct xencomm_desc desc; You are returning a stack/auto variable here, thats a No No! + int rc = 0; + + desc.nr_addrs = XENCOMM_MINI_ADDRS; + + if (! (rc = xencomm_init(&desc, buffer, bytes))); + *ret = &desc; + + return rc; +} + +void *xencomm_map(void *ptr, unsigned long bytes) +{ + int rc; + struct xencomm_desc *desc; + + if (is_phys_contiguous((unsigned long)ptr)) + return xencomm_create_inline(ptr); + + rc = xencomm_create(ptr, bytes, &desc, GFP_KERNEL); + + if (rc) + return NULL; + + return xencomm_pa(desc); +} + +void *__xencomm_map_early(void *ptr, unsigned long bytes, + struct xencomm_mini *xc_area) +{ + int rc; + struct xencomm_desc *desc = NULL; + + if (is_phys_contiguous((unsigned long)ptr)) + return xencomm_create_inline(ptr); + + rc = xencomm_create_mini(XENCOMM_MINI_AREA,ptr, bytes, whitespace + &desc); + + if (rc) + return NULL; + + return (void*)__pa(desc); +} + +/* check if is physically contiguous memory */ +int is_phys_contiguous(unsigned long addr) Can we please make this static now! +{ + return (addr < VMALLOC_START) || (addr >= VMALLOC_END); +} diff -r bbf2db4ddf54 include/xen/xencomm.h --- a/include/xen/xencomm.h Tue Dec 19 09:22:37 2006 -0500 +++ b/include/xen/xencomm.h Wed Jan 26 02:17:31 2028 -0600 @@ -16,6 +16,7 @@ * Copyright (C) IBM Corp. 2006 * * Authors: Hollis Blanchard <hollisb@xxxxxxxxxx> + * Jerone Young <jyoung5@xxxxxxxxxx> */ #ifndef _LINUX_XENCOMM_H_ @@ -23,10 +24,23 @@ #include <xen/interface/xencomm.h> -extern int xencomm_create(void *buffer, unsigned long bytes, - struct xencomm_desc **desc, gfp_t type); +#define XENCOMM_MINI_ADDRS 3 +struct xencomm_mini { + struct xencomm_desc _desc; + uint64_t address[XENCOMM_MINI_ADDRS]; +}; +#define XENCOMM_MINI_AREA (sizeof(struct xencomm_mini) * 2) This is no longer used, right? + extern void xencomm_free(struct xencomm_desc *desc); -extern void *xencomm_create_inline(void *ptr); +extern void *xencomm_map(void *ptr, unsigned long bytes); +extern void *__xencomm_map_early(void *ptr, unsigned long bytes, + struct xencomm_mini *xc_area); +extern int is_phys_contiguous(unsigned long addr); begone + +#define xencomm_map_early(ptr, bytes) \ + ({struct xencomm_mini xc_area\ + __attribute__((__aligned__(sizeof(struct xencomm_mini))));\ + __xencomm_map_early(ptr, bytes, &xc_area);}) /* provided by architecture code: */ extern unsigned long xencomm_vtop(unsigned long vaddr); _______________________________________________ Xen-ppc-devel mailing list Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-ppc-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |