Module Name:    src
Committed By:   ad
Date:           Sun Apr 25 15:57:59 UTC 2010

Modified Files:
        src/sys/kern: kern_cpu.c

Log Message:
Allocate the cpu_infos array dynamically.


To generate a diff of this commit:
cvs rdiff -u -r1.43 -r1.44 src/sys/kern/kern_cpu.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/kern/kern_cpu.c
diff -u src/sys/kern/kern_cpu.c:1.43 src/sys/kern/kern_cpu.c:1.44
--- src/sys/kern/kern_cpu.c:1.43	Wed Jan 13 01:57:17 2010
+++ src/sys/kern/kern_cpu.c	Sun Apr 25 15:57:59 2010
@@ -1,7 +1,7 @@
-/*	$NetBSD: kern_cpu.c,v 1.43 2010/01/13 01:57:17 mrg Exp $	*/
+/*	$NetBSD: kern_cpu.c,v 1.44 2010/04/25 15:57:59 ad Exp $	*/
 
 /*-
- * Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc.
+ * Copyright (c) 2007, 2008, 2009, 2010 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -56,7 +56,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_cpu.c,v 1.43 2010/01/13 01:57:17 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_cpu.c,v 1.44 2010/04/25 15:57:59 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -98,22 +98,23 @@
 bool	mp_online;
 struct	cpuqueue cpu_queue = CIRCLEQ_HEAD_INITIALIZER(cpu_queue);
 
-static struct cpu_info *cpu_infos[MAXCPUS];
+static struct cpu_info **cpu_infos;
 
 int
 mi_cpu_attach(struct cpu_info *ci)
 {
 	int error;
 
+	KASSERT(maxcpus > 0);
+
 	ci->ci_index = ncpu;
-	cpu_infos[cpu_index(ci)] = ci;
 	CIRCLEQ_INSERT_TAIL(&cpu_queue, ci, ci_data.cpu_qchain);
 	TAILQ_INIT(&ci->ci_data.cpu_ld_locks);
 	__cpu_simple_lock_init(&ci->ci_data.cpu_ld_lock);
 
 	/* This is useful for eg, per-cpu evcnt */
 	snprintf(ci->ci_data.cpu_name, sizeof(ci->ci_data.cpu_name), "cpu%d",
-		 cpu_index(ci));
+	    cpu_index(ci));
 
 	sched_cpuattach(ci);
 
@@ -139,6 +140,12 @@
 	ncpu++;
 	ncpuonline++;
 
+	if (cpu_infos == NULL) {
+		cpu_infos =
+		    kmem_zalloc(sizeof(cpu_infos[0]) * maxcpus, KM_SLEEP);
+	}
+	cpu_infos[cpu_index(ci)] = ci;
+
 	return 0;
 }
 
@@ -146,6 +153,7 @@
 cpuctlattach(int dummy)
 {
 
+	KASSERT(cpu_infos != NULL);
 }
 
 int
@@ -169,7 +177,7 @@
 		    NULL);
 		if (error != 0)
 			break;
-		if (cs->cs_id >= __arraycount(cpu_infos) ||
+		if (cs->cs_id >= maxcpus ||
 		    (ci = cpu_lookup(cs->cs_id)) == NULL) {
 			error = ESRCH;
 			break;
@@ -184,7 +192,7 @@
 		id = cs->cs_id;
 		memset(cs, 0, sizeof(*cs));
 		cs->cs_id = id;
-		if (cs->cs_id >= __arraycount(cpu_infos) ||
+		if (cs->cs_id >= maxcpus ||
 		    (ci = cpu_lookup(id)) == NULL) {
 			error = ESRCH;
 			break;
@@ -231,9 +239,16 @@
 struct cpu_info *
 cpu_lookup(u_int idx)
 {
-	struct cpu_info *ci = cpu_infos[idx];
+	struct cpu_info *ci;
+
+	KASSERT(idx < maxcpus);
+
+	if (__predict_false(cpu_infos == NULL)) {
+		KASSERT(idx == 0);
+		return curcpu();
+	}
 
-	KASSERT(idx < __arraycount(cpu_infos));
+	ci = cpu_infos[idx];
 	KASSERT(ci == NULL || cpu_index(ci) == idx);
 
 	return ci;

Reply via email to