X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=kitten%2Finclude%2Flwk%2Fpercpu.h;fp=kitten%2Finclude%2Flwk%2Fpercpu.h;h=2e31649b5cd05c9788117f2a938b2f57ebe54e11;hb=66a1a4c7a9edcd7d8bc207aca093d694a6e6b5b2;hp=0000000000000000000000000000000000000000;hpb=f7cf9c19ecb0a589dd45ae0d2c91814bd3c2acc2;p=palacios.git diff --git a/kitten/include/lwk/percpu.h b/kitten/include/lwk/percpu.h new file mode 100644 index 0000000..2e31649 --- /dev/null +++ b/kitten/include/lwk/percpu.h @@ -0,0 +1,39 @@ +#ifndef _LWK_PERCPU_H +#define _LWK_PERCPU_H +#include +#include +#include + +/* Enough to cover all DEFINE_PER_CPU()'s in kernel. */ +#ifndef PERCPU_ENOUGH_ROOM +#define PERCPU_ENOUGH_ROOM 32768 +#endif + +/* Must be an lvalue. */ +#define get_cpu_var(var) __get_cpu_var(var) +#define put_cpu_var(var) + +struct percpu_data { + void *ptrs[NR_CPUS]; +}; + +/* + * Use this to get to a cpu's version of the per-cpu object allocated using + * alloc_percpu. Non-atomic access to the current CPU's version should + * probably be combined with get_cpu()/put_cpu(). + */ +#define per_cpu_ptr(ptr, cpu) \ +({ \ + struct percpu_data *__p = (struct percpu_data *)~(unsigned long)(ptr); \ + (__typeof__(ptr))__p->ptrs[(cpu)]; \ +}) + +extern void *__alloc_percpu(size_t size); +extern void free_percpu(const void *); + +/* Simple wrapper for the common case: zeros memory. */ +#define alloc_percpu(type) ((type *)(__alloc_percpu(sizeof(type)))) + +extern void setup_per_cpu_areas(void); + +#endif /* _LWK_PERCPU_H */