summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--runtime/user/ChangeLog5
-rw-r--r--runtime/user/alloc.c35
2 files changed, 40 insertions, 0 deletions
diff --git a/runtime/user/ChangeLog b/runtime/user/ChangeLog
index b9a3f1fe..82585425 100644
--- a/runtime/user/ChangeLog
+++ b/runtime/user/ChangeLog
@@ -1,3 +1,8 @@
+2006-01-25 Martin Hunt <hunt@redhat.com>
+
+ * alloc.c (_stp_alloc_percpu): New function.
+ (_stp_free_percpu): New function.
+
2005-12-14 Martin Hunt <hunt@redhat.com>
* emul.h: Add fake spinlock funcs.
diff --git a/runtime/user/alloc.c b/runtime/user/alloc.c
index 9ba720ab..361e7d98 100644
--- a/runtime/user/alloc.c
+++ b/runtime/user/alloc.c
@@ -14,4 +14,39 @@ void *__kmalloc(size_t size, gfp_t flags)
return malloc(size);
}
+void *_stp_alloc_percpu(size_t size)
+{
+ int i;
+ struct percpu_data *pdata = malloc(sizeof (*pdata));
+ if (!pdata)
+ return NULL;
+
+ for_each_cpu(i) {
+ pdata->ptrs[i] = malloc(size);
+ 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) {
+ free(pdata->ptrs[i]);
+ }
+ free(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)
+ free(p->ptrs[i]);
+ free(p);
+}
+
#endif /* _ALLOC_C_ */