[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.