diff options
-rw-r--r-- | runtime/user/ChangeLog | 5 | ||||
-rw-r--r-- | runtime/user/alloc.c | 35 |
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_ */ |