I'll need to rework the patch. I see there are some inadvertant bugs ..
but somehow it did pass testing. I'll fix these up and redo the patch.
Thanks for the feedback.

On Fri, 2007-01-26 at 14:05 -0500, Jimi Xenidis wrote:
> 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 <[EMAIL PROTECTED]>
> > + *          Jerone Young <[EMAIL PROTECTED]>
> >   */
> > #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@lists.xensource.com
http://lists.xensource.com/xen-ppc-devel

Reply via email to