]> sourceware.org Git - systemtap.git/commitdiff
2006-01-25 Martin Hunt <hunt@redhat.com>
authorhunt <hunt>
Wed, 25 Jan 2006 09:15:15 +0000 (09:15 +0000)
committerhunt <hunt>
Wed, 25 Jan 2006 09:15:15 +0000 (09:15 +0000)
* stat.c (_stp_stat_init): Use _stp_alloc_percpu().
(_stp_stat_del): New function.

* alloc.c (_stp_alloc_percpu): New function.
(_stp_free_percpu): New function.

runtime/ChangeLog
runtime/alloc.c
runtime/stat.c

index bb04363cd3001cd9c6610bfe3ac059646444ebc1..546b907e6ce900a767722b7771785c2651f66c69 100644 (file)
@@ -1,3 +1,11 @@
+2006-01-25  Martin Hunt  <hunt@redhat.com>
+
+       * stat.c (_stp_stat_init): Use _stp_alloc_percpu().
+       (_stp_stat_del): New function.
+
+       * alloc.c (_stp_alloc_percpu): New function.
+       (_stp_free_percpu): New function.
+
 2006-01-19  Martin Hunt  <hunt@redhat.com>
 
        * pmap-gen.c (_stp_pmap_get): Fix bug where old data
index d52c6080f0792e133965a44a73a1d3d70d094b79..a09a515deb4c7ec5e324db848c7b40a8d5fee279 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- linux-c -*- 
  * Memory allocation functions
- * Copyright (C) 2005 Red Hat Inc.
+ * Copyright (C) 2005, 2006 Red Hat Inc.
  *
  * This file is part of systemtap, and is free software.  You can
  * redistribute it and/or modify it under the terms of the GNU General
 #ifndef _ALLOC_C_
 #define _ALLOC_C_
 
-/* does this file really need to exist? */
+/* This file exists because all the NUMA-compatible allocators keep
+   changing in 2.6 */
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12)
 #define kmalloc_node(size,flags,node) kmalloc(size,flags)
 #endif /* LINUX_VERSION_CODE */
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
+#define _stp_alloc_percpu(size) __alloc_percpu(size, 8)
+#else
+#ifdef CONFIG_SMP
+/* This is like alloc_percpu() except it simply takes a size, instead of a type. */
+void *_stp_alloc_percpu(size_t size)
+{
+       int i;
+       struct percpu_data *pdata = kmalloc(sizeof (*pdata), GFP_KERNEL);
 
+       if (!pdata)
+               return NULL;
+
+       for_each_cpu(i) {
+               int node = cpu_to_node(i);
+
+               if (node_online(node))
+                       pdata->ptrs[i] = kmalloc_node(size, GFP_KERNEL, node);
+               else
+                       pdata->ptrs[i] = kmalloc(size, GFP_KERNEL);
+
+               if (!pdata->ptrs[i])
+                       goto unwind_oom;
+               memset(pdata->ptrs[i], 0, size);
+       }
+
+       /* Catch derefs w/o wrappers */
+       return (void *) (~(unsigned long) pdata);
+
+unwind_oom:
+       while (--i >= 0) {
+               if (!cpu_possible(i))
+                       continue;
+               kfree(pdata->ptrs[i]);
+       }
+       kfree(pdata);
+       return NULL;
+}
+
+void _stp_free_percpu(const void *objp)
+{
+       int i;
+       struct percpu_data *p = (struct percpu_data *) (~(unsigned long) objp);
+
+       for_each_cpu(i)
+               kfree(p->ptrs[i]);
+       kfree(p);
+}
+#else
+void *_stp_alloc_percpu(size_t size)
+{
+        void *ret = kmalloc(size, GFP_KERNEL);
+        if (ret)
+                memset(ret, 0, size);
+        return ret;
+}
+#define _stp_free_percpu(ptr) kfree(ptr)
+
+#endif /* CONFIG_SMP */
+#endif /* LINUX_VERSION_CODE */
 #endif /* _ALLOC_C_ */
index 29dcef9b871f8be653d6a90d89d7c17140b49c2e..d9eff2c38e2fccb65d966f06c88bac0eb82280e4 100644 (file)
@@ -101,7 +101,7 @@ Stat _stp_stat_init (int type, ...)
                return NULL;
        
        size = buckets * sizeof(int64_t) + sizeof(stat);        
-       sd = (stat *) __alloc_percpu (size, 8);
+       sd = (stat *) _stp_alloc_percpu (size);
        if (sd == NULL)
                goto exit1;
 
@@ -135,6 +135,20 @@ exit1:
        return NULL;
 }
 
+/** Delete Stat.
+ * Call this to free all memory allocated during initialization.
+ *
+ * @param st Stat
+ */
+void _stp_stat_del (Stat st)
+{
+       if (st) {
+               _stp_free_percpu (st->sd);
+               kfree (st->agg);
+               kfree (st);
+       }
+}
+       
 /** Add to a Stat.
  * Add an int64 to a Stat.
  *
This page took 0.031815 seconds and 5 git commands to generate.