From 9a46e525c0f0c9615bbbf1a16272ee8b3b98d11f Mon Sep 17 00:00:00 2001 From: hunt Date: Wed, 25 Jan 2006 09:17:05 +0000 Subject: [PATCH] 2006-01-25 Martin Hunt * alloc.c (_stp_alloc_percpu): New function. (_stp_free_percpu): New function. --- runtime/user/ChangeLog | 5 +++++ runtime/user/alloc.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/runtime/user/ChangeLog b/runtime/user/ChangeLog index b9a3f1fe9..825854258 100644 --- a/runtime/user/ChangeLog +++ b/runtime/user/ChangeLog @@ -1,3 +1,8 @@ +2006-01-25 Martin Hunt + + * alloc.c (_stp_alloc_percpu): New function. + (_stp_free_percpu): New function. + 2005-12-14 Martin Hunt * emul.h: Add fake spinlock funcs. diff --git a/runtime/user/alloc.c b/runtime/user/alloc.c index 9ba720ab9..361e7d984 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_ */ -- 2.43.5