Module Name: src
Committed By: pooka
Date: Mon Feb 8 18:18:19 UTC 2016
Modified Files:
src/sys/rump/include/rump-sys: kern.h
src/sys/rump/librump/rumpkern: lwproc.c rump.c scheduler.c
Log Message:
Allocate struct cpu_info dynamically. Saves quite a lot of BSS in the
common case and reduces rump kernel memory requirements by 10% or more
in really tiny deployments.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/rump/include/rump-sys/kern.h
cvs rdiff -u -r1.37 -r1.38 src/sys/rump/librump/rumpkern/lwproc.c
cvs rdiff -u -r1.327 -r1.328 src/sys/rump/librump/rumpkern/rump.c
cvs rdiff -u -r1.42 -r1.43 src/sys/rump/librump/rumpkern/scheduler.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/rump/include/rump-sys/kern.h
diff -u src/sys/rump/include/rump-sys/kern.h:1.2 src/sys/rump/include/rump-sys/kern.h:1.3
--- src/sys/rump/include/rump-sys/kern.h:1.2 Tue Feb 2 13:07:30 2016
+++ src/sys/rump/include/rump-sys/kern.h Mon Feb 8 18:18:19 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: kern.h,v 1.2 2016/02/02 13:07:30 pooka Exp $ */
+/* $NetBSD: kern.h,v 1.3 2016/02/08 18:18:19 pooka Exp $ */
/*
* Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved.
@@ -144,7 +144,7 @@ typedef void (*rump_proc_vfs_release_fn)
extern rump_proc_vfs_init_fn rump_proc_vfs_init;
extern rump_proc_vfs_release_fn rump_proc_vfs_release;
-extern struct cpu_info *rump_cpu;
+extern struct cpu_info rump_bootcpu;
extern bool rump_ttycomponent;
Index: src/sys/rump/librump/rumpkern/lwproc.c
diff -u src/sys/rump/librump/rumpkern/lwproc.c:1.37 src/sys/rump/librump/rumpkern/lwproc.c:1.38
--- src/sys/rump/librump/rumpkern/lwproc.c:1.37 Tue Jan 26 23:12:17 2016
+++ src/sys/rump/librump/rumpkern/lwproc.c Mon Feb 8 18:18:19 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: lwproc.c,v 1.37 2016/01/26 23:12:17 pooka Exp $ */
+/* $NetBSD: lwproc.c,v 1.38 2016/02/08 18:18:19 pooka Exp $ */
/*
* Copyright (c) 2010, 2011 Antti Kantee. All Rights Reserved.
@@ -28,7 +28,7 @@
#define RUMP__CURLWP_PRIVATE
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lwproc.c,v 1.37 2016/01/26 23:12:17 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lwproc.c,v 1.38 2016/02/08 18:18:19 pooka Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -334,8 +334,8 @@ lwproc_makelwp(struct proc *p, struct lw
LIST_INSERT_HEAD(&p->p_lwps, l, l_sibling);
l->l_fd = p->p_fd;
- l->l_cpu = rump_cpu;
- l->l_target_cpu = rump_cpu; /* Initial target CPU always the same */
+ l->l_cpu = &rump_bootcpu;
+ l->l_target_cpu = &rump_bootcpu; /* Initial target CPU always same */
l->l_stat = LSRUN;
l->l_mutex = &unruntime_lock;
TAILQ_INIT(&l->l_ld_locks);
Index: src/sys/rump/librump/rumpkern/rump.c
diff -u src/sys/rump/librump/rumpkern/rump.c:1.327 src/sys/rump/librump/rumpkern/rump.c:1.328
--- src/sys/rump/librump/rumpkern/rump.c:1.327 Tue Jan 26 23:12:17 2016
+++ src/sys/rump/librump/rumpkern/rump.c Mon Feb 8 18:18:19 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: rump.c,v 1.327 2016/01/26 23:12:17 pooka Exp $ */
+/* $NetBSD: rump.c,v 1.328 2016/02/08 18:18:19 pooka Exp $ */
/*
* Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.327 2016/01/26 23:12:17 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.328 2016/02/08 18:18:19 pooka Exp $");
#include <sys/systm.h>
#define ELFSIZE ARCH_ELFSIZE
@@ -246,7 +246,7 @@ rump_init(void)
/* init minimal lwp/cpu context */
rump_lwproc_init();
l = &lwp0;
- l->l_cpu = l->l_target_cpu = rump_cpu;
+ l->l_cpu = l->l_target_cpu = &rump_bootcpu;
rump_lwproc_curlwp_set(l);
/* retrieve env vars which affect the early stage of bootstrap */
Index: src/sys/rump/librump/rumpkern/scheduler.c
diff -u src/sys/rump/librump/rumpkern/scheduler.c:1.42 src/sys/rump/librump/rumpkern/scheduler.c:1.43
--- src/sys/rump/librump/rumpkern/scheduler.c:1.42 Tue Jan 26 23:12:18 2016
+++ src/sys/rump/librump/rumpkern/scheduler.c Mon Feb 8 18:18:19 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: scheduler.c,v 1.42 2016/01/26 23:12:18 pooka Exp $ */
+/* $NetBSD: scheduler.c,v 1.43 2016/02/08 18:18:19 pooka Exp $ */
/*
* Copyright (c) 2010, 2011 Antti Kantee. All Rights Reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: scheduler.c,v 1.42 2016/01/26 23:12:18 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: scheduler.c,v 1.43 2016/02/08 18:18:19 pooka Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -42,7 +42,6 @@ __KERNEL_RCSID(0, "$NetBSD: scheduler.c,
#include <rump/rumpuser.h>
-static struct cpu_info rump_cpus[MAXCPUS];
static struct rumpcpu {
/* needed in fastpath */
struct cpu_info *rcpu_ci;
@@ -69,7 +68,14 @@ static struct rumpcpu {
int rcpu_align[0] __aligned(CACHE_LINE_SIZE);
} rcpu_storage[MAXCPUS];
-struct cpu_info *rump_cpu = &rump_cpus[0];
+static inline struct rumpcpu *
+cpuinfo_to_rumpcpu(struct cpu_info *ci)
+{
+
+ return &rcpu_storage[cpu_index(ci)];
+}
+
+struct cpu_info rump_bootcpu;
kcpuset_t *kcpuset_attached = NULL;
kcpuset_t *kcpuset_running = NULL;
int ncpu, ncpuonline;
@@ -107,7 +113,7 @@ struct cpu_info *
cpu_lookup(u_int index)
{
- return &rump_cpus[index];
+ return rcpu_storage[index].rcpu_ci;
}
static inline struct rumpcpu *
@@ -127,9 +133,7 @@ getnextcpu(void)
void
rump_cpus_bootstrap(int *nump)
{
- struct cpu_info *ci;
int num = *nump;
- int i;
if (num > MAXCPUS) {
aprint_verbose("CPU limit: %d wanted, %d (MAXCPUS) "
@@ -137,16 +141,11 @@ rump_cpus_bootstrap(int *nump)
num = MAXCPUS;
}
- for (i = 0; i < num; i++) {
- ci = &rump_cpus[i];
- ci->ci_index = i;
- }
-
kcpuset_create(&kcpuset_attached, true);
kcpuset_create(&kcpuset_running, true);
/* attach first cpu for bootstrap */
- rump_cpu_attach(&rump_cpus[0]);
+ rump_cpu_attach(&rump_bootcpu);
ncpu = 1;
*nump = num;
}
@@ -161,15 +160,22 @@ rump_scheduler_init(int numcpu)
rumpuser_mutex_init(&lwp0mtx, RUMPUSER_MTX_SPIN);
rumpuser_cv_init(&lwp0cv);
for (i = 0; i < numcpu; i++) {
+ if (i == 0) {
+ ci = &rump_bootcpu;
+ } else {
+ ci = kmem_zalloc(sizeof(*ci), KM_SLEEP);
+ ci->ci_index = i;
+ }
+
rcpu = &rcpu_storage[i];
- ci = &rump_cpus[i];
rcpu->rcpu_ci = ci;
- ci->ci_schedstate.spc_mutex =
- mutex_obj_alloc(MUTEX_DEFAULT, IPL_SCHED);
- ci->ci_schedstate.spc_flags = SPCF_RUNNING;
rcpu->rcpu_wanted = 0;
rumpuser_cv_init(&rcpu->rcpu_cv);
rumpuser_mutex_init(&rcpu->rcpu_mtx, RUMPUSER_MTX_SPIN);
+
+ ci->ci_schedstate.spc_mutex =
+ mutex_obj_alloc(MUTEX_DEFAULT, IPL_SCHED);
+ ci->ci_schedstate.spc_flags = SPCF_RUNNING;
}
mutex_init(&unruntime_lock, MUTEX_DEFAULT, IPL_SCHED);
@@ -182,7 +188,7 @@ void
rump_schedlock_cv_wait(struct rumpuser_cv *cv)
{
struct lwp *l = curlwp;
- struct rumpcpu *rcpu = &rcpu_storage[l->l_cpu-&rump_cpus[0]];
+ struct rumpcpu *rcpu = cpuinfo_to_rumpcpu(l->l_cpu);
/* mutex will be taken and released in cpu schedule/unschedule */
rumpuser_cv_wait(cv, rcpu->rcpu_mtx);
@@ -192,7 +198,7 @@ int
rump_schedlock_cv_timedwait(struct rumpuser_cv *cv, const struct timespec *ts)
{
struct lwp *l = curlwp;
- struct rumpcpu *rcpu = &rcpu_storage[l->l_cpu-&rump_cpus[0]];
+ struct rumpcpu *rcpu = cpuinfo_to_rumpcpu(l->l_cpu);
/* mutex will be taken and released in cpu schedule/unschedule */
return rumpuser_cv_timedwait(cv, rcpu->rcpu_mtx,
@@ -298,7 +304,7 @@ rump_schedule_cpu_interlock(struct lwp *
*/
KASSERT(l->l_target_cpu != NULL);
- rcpu = &rcpu_storage[l->l_target_cpu-&rump_cpus[0]];
+ rcpu = cpuinfo_to_rumpcpu(l->l_target_cpu);
if (atomic_cas_ptr(&rcpu->rcpu_prevlwp, l, RCPULWP_BUSY) == l) {
if (interlock == rcpu->rcpu_mtx)
rumpuser_mutex_exit(rcpu->rcpu_mtx);
@@ -440,7 +446,7 @@ rump_unschedule_cpu1(struct lwp *l, void
ci = l->l_cpu;
ci->ci_curlwp = ci->ci_data.cpu_onproc = NULL;
- rcpu = &rcpu_storage[ci-&rump_cpus[0]];
+ rcpu = cpuinfo_to_rumpcpu(ci);
KASSERT(rcpu->rcpu_ci == ci);