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-changelog

[Xen-changelog] [linux-2.6.18-xen] xenoprof: dynamic buffer array alloca

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [linux-2.6.18-xen] xenoprof: dynamic buffer array allocation
From: "Xen patchbot-linux-2.6.18-xen" <patchbot-linux-2.6.18-xen@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 06 Jan 2010 01:45:17 -0800
Delivery-date: Wed, 06 Jan 2010 01:46:22 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1262765735 0
# Node ID 2b2d888e5a804c81dc5a1dcd0de4cf5e83106bf4
# Parent  f6017e7c6615687365ae7e66dd673898285d884d
xenoprof: dynamic buffer array allocation

The recent change to locally define MAX_VIRT_CPUS wasn't really
appropriate - with there not being a hard limit on the number of
vCPU-s anymore, these arrays should be allocated dynamically.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
---
 drivers/xen/xenoprof/xenoprofile.c |   57 +++++++++++++++++++++++++++++++------
 1 files changed, 49 insertions(+), 8 deletions(-)

diff -r f6017e7c6615 -r 2b2d888e5a80 drivers/xen/xenoprof/xenoprofile.c
--- a/drivers/xen/xenoprof/xenoprofile.c        Wed Jan 06 08:14:10 2010 +0000
+++ b/drivers/xen/xenoprof/xenoprofile.c        Wed Jan 06 08:15:35 2010 +0000
@@ -33,15 +33,14 @@
 #include "../../../drivers/oprofile/event_buffer.h"
 
 #define MAX_XENOPROF_SAMPLES 16
-#define MAX_VIRT_CPUS 128
 
 /* sample buffers shared with Xen */
-static xenoprof_buf_t *xenoprof_buf[MAX_VIRT_CPUS];
+static xenoprof_buf_t **__read_mostly xenoprof_buf;
 /* Shared buffer area */
 static struct xenoprof_shared_buffer shared_buffer;
 
 /* Passive sample buffers shared with Xen */
-static xenoprof_buf_t *p_xenoprof_buf[MAX_OPROF_DOMAINS][MAX_VIRT_CPUS];
+static xenoprof_buf_t **__read_mostly p_xenoprof_buf[MAX_OPROF_DOMAINS];
 /* Passive shared buffer area */
 static struct xenoprof_shared_buffer p_shared_buffer[MAX_OPROF_DOMAINS];
 
@@ -253,11 +252,32 @@ static int bind_virq(void)
 }
 
 
+static xenoprof_buf_t **get_buffer_array(unsigned int nbuf)
+{
+       size_t size = nbuf * sizeof(xenoprof_buf_t);
+
+       if (size <= PAGE_SIZE)
+               return kmalloc(size, GFP_KERNEL);
+       return vmalloc(size);
+}
+
+static void release_buffer_array(xenoprof_buf_t **buf, unsigned int nbuf)
+{
+       if (nbuf * sizeof(xenoprof_buf_t) <= PAGE_SIZE)
+               kfree(buf);
+       else
+               vfree(buf);
+}
+
+
 static void unmap_passive_list(void)
 {
        int i;
-       for (i = 0; i < pdomains; i++)
+       for (i = 0; i < pdomains; i++) {
                xenoprof_arch_unmap_shared_buffer(&p_shared_buffer[i]);
+               release_buffer_array(p_xenoprof_buf[i],
+                                    passive_domains[i].nbuf);
+       }
        pdomains = 0;
 }
 
@@ -277,10 +297,16 @@ static int map_xenoprof_buffer(int max_s
                return ret;
        nbuf = get_buffer.nbuf;
 
+       xenoprof_buf = get_buffer_array(nbuf);
+       if (!xenoprof_buf) {
+               xenoprof_arch_unmap_shared_buffer(&shared_buffer);
+               return -ENOMEM;
+       }
+
        for (i=0; i< nbuf; i++) {
                buf = (struct xenoprof_buf*) 
                        &shared_buffer.buffer[i * get_buffer.bufsize];
-               BUG_ON(buf->vcpu_id >= MAX_VIRT_CPUS);
+               BUG_ON(buf->vcpu_id >= nbuf);
                xenoprof_buf[buf->vcpu_id] = buf;
        }
 
@@ -295,8 +321,10 @@ static int xenoprof_setup(void)
        if ( (ret = map_xenoprof_buffer(MAX_XENOPROF_SAMPLES)) )
                return ret;
 
-       if ( (ret = bind_virq()) )
+       if ( (ret = bind_virq()) ) {
+               release_buffer_array(xenoprof_buf, nbuf);
                return ret;
+       }
 
        if (xenoprof_is_primary) {
                /* Define dom0 as an active domain if not done yet */
@@ -339,6 +367,7 @@ static int xenoprof_setup(void)
        return 0;
  err:
        unbind_virq();
+       release_buffer_array(xenoprof_buf, nbuf);
        return ret;
 }
 
@@ -360,6 +389,7 @@ static void xenoprof_shutdown(void)
        xenoprof_arch_unmap_shared_buffer(&shared_buffer);
        if (xenoprof_is_primary)
                unmap_passive_list();
+       release_buffer_array(xenoprof_buf, nbuf);
 }
 
 
@@ -452,11 +482,19 @@ static int xenoprof_set_passive(int * p_
                                                &p_shared_buffer[i]);
                if (ret)
                        goto out;
+
+               p_xenoprof_buf[i] = get_buffer_array(passive_domains[i].nbuf);
+               if (!p_xenoprof_buf[i]) {
+                       ++i;
+                       ret = -ENOMEM;
+                       goto out;
+               }
+
                for (j = 0; j < passive_domains[i].nbuf; j++) {
                        buf = (struct xenoprof_buf *)
                                &p_shared_buffer[i].buffer[
                                j * passive_domains[i].bufsize];
-                       BUG_ON(buf->vcpu_id >= MAX_VIRT_CPUS);
+                       BUG_ON(buf->vcpu_id >= passive_domains[i].nbuf);
                        p_xenoprof_buf[i][buf->vcpu_id] = buf;
                }
        }
@@ -465,8 +503,11 @@ static int xenoprof_set_passive(int * p_
        return 0;
 
 out:
-       for (j = 0; j < i; j++)
+       for (j = 0; j < i; j++) {
                xenoprof_arch_unmap_shared_buffer(&p_shared_buffer[i]);
+               release_buffer_array(p_xenoprof_buf[i],
+                                    passive_domains[i].nbuf);
+       }
 
        return ret;
 }

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [linux-2.6.18-xen] xenoprof: dynamic buffer array allocation, Xen patchbot-linux-2.6.18-xen <=