Add support for dynamic per-cpu variables
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 4 May 2018 21:51:01 +0000 (17:51 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 22 May 2018 21:51:44 +0000 (17:51 -0400)
commit1789249d9f0f55bbafffe9d559cf53a677ec7701
tree68bd451ccad9ce82e598b5f03410f9c8456e96cf
parenteafc2443538c21a9f23353774ca061952022e57c
Add support for dynamic per-cpu variables

They are a little hokey.  You get a pointer back, which you have to
dereference each time you use it, even when you want to get a pointer to
a specific core's pointer.  That's different than Linux.  e.g.

u64 *foo = percpu_alloc(u64, MEM_WAIT);
u64 *core_3_ptr = _PERCPU_VARPTR(*foo, 3);

This is because __PERCPU_OFFSET computes &(var), which is how the static
stuff works.  We need to compute the offset from whatever our allocator got
back, which foo, so we need to balance the & with the *.  Not ideal.

Also, there is a limited amount of space - 1024 for now.  We could do
better with a virtual memory region:
- alloc vaddrs for the right size (2x previous)
- map that to the paddr of the previous, existing space
- map the new space (1x previous) above the existing space
- WRITE_ONCE percpu_base.
- maybe free old vaddr after a grace period, which would imply all per-cpu
  accessors are RCU read-side critical sections.

Not worth doing, for now.  It might be a pain to shrink it too.

The right approach might be to port more of Linux's percpu mechanisms.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/percpu.h
kern/src/ktest/Kconfig.postboot
kern/src/ktest/pb_ktests.c
kern/src/percpu.c