summaryrefslogtreecommitdiffstats
path: root/runtime/user/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/user/alloc.c')
-rw-r--r--runtime/user/alloc.c35
1 files changed, 35 insertions, 0 deletions
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_ */