WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ppc-devel

Re: [XenPPC] [PATCH] [UPDATE] Xencomm optimzation to work for modules

To: jyoung5@xxxxxxxxxx
Subject: Re: [XenPPC] [PATCH] [UPDATE] Xencomm optimzation to work for modules
From: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
Date: Fri, 26 Jan 2007 14:05:41 -0500
Cc: xen-ppc-devel <xen-ppc-devel@xxxxxxxxxxxxxxxxxxx>
Delivery-date: Fri, 26 Jan 2007 11:05:11 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <1169773610.5940.6.camel@thinkpad>
List-help: <mailto:xen-ppc-devel-request@lists.xensource.com?subject=help>
List-id: Xen PPC development <xen-ppc-devel.lists.xensource.com>
List-post: <mailto:xen-ppc-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=unsubscribe>
References: <1169773610.5940.6.camel@thinkpad>
Sender: xen-ppc-devel-bounces@xxxxxxxxxxxxxxxxxxx

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

<Prev in Thread] Current Thread [Next in Thread>