On Thu, Nov 25, 2010 at 06:04:23PM -0500, Kenneth R Westerback wrote:
> Index: amd64/cpu.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/amd64/cpu.c,v
> retrieving revision 1.38
> diff -u -p -r1.38 cpu.c
> --- amd64/cpu.c       13 Nov 2010 04:16:42 -0000      1.38
> +++ amd64/cpu.c       25 Nov 2010 23:00:44 -0000
> @@ -135,8 +135,6 @@ struct cpu_info cpu_info_primary = { 0, 
>  
>  struct cpu_info *cpu_info_list = &cpu_info_primary;
>  
> -u_int32_t cpus_attached = 0;
> -
>  #ifdef MULTIPROCESSOR
>  /*
>   * Array of CPU info structures.  Must be statically-allocated because
> @@ -345,8 +343,6 @@ cpu_attach(struct device *parent, struct
>               panic("unknown processor type??");
>       }
>       cpu_vm_init(ci);
> -
> -     cpus_attached |= (1 << ci->ci_cpuid);
>  
>  #if defined(MULTIPROCESSOR)
>       if (mp_verbose) {
> Index: include/cpu.h
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/include/cpu.h,v
> retrieving revision 1.60
> diff -u -p -r1.60 cpu.h
> --- include/cpu.h     22 Nov 2010 21:07:18 -0000      1.60
> +++ include/cpu.h     25 Nov 2010 23:00:44 -0000
> @@ -211,8 +211,6 @@ extern struct cpu_info cpu_info_primary;
>  
>  #define aston(p)     ((p)->p_md.md_astpending = 1)
>  
> -extern u_int32_t cpus_attached;
> -
>  #define curpcb               curcpu()->ci_curpcb
>  
>  /*

this should follow krws diff above.

information about each cpu is stored in a statically sized array.
if we have more physical cpus than entries in that array, we currently
start storing cpu_info structures in unowned memory after that
array. this leads to Bad Things(tm).

MAXCPUs should be bumped up on amd64, but we should also avoid
panicking on ridiculously overspecced boxes. i am sure i will regret
claiming that a 48core machine is overspecced in the very near
future though.

Index: amd64/cpu.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/cpu.c,v
retrieving revision 1.38
diff -u -p -r1.38 cpu.c
--- amd64/cpu.c 13 Nov 2010 04:16:42 -0000      1.38
+++ amd64/cpu.c 26 Nov 2010 06:31:53 -0000
@@ -167,10 +165,24 @@ cpu_match(struct device *parent, void *m
 {
        struct cfdata *cf = match;
        struct cpu_attach_args *caa = aux;
+       int cpunum;
 
-       if (strcmp(caa->caa_name, cf->cf_driver->cd_name) == 0)
+       /*
+        * we cannot attach more cpus than we are set up to store in the
+        * cpu_info array, so fail to match if we have more cpus than slots
+        * in the array.
+        */
+
+       for (cpunum = 0; cpunum < nitems(cpu_info); cpunum++) {
+               if (cpu_info[cpunum] == NULL)
+                       break;
+       }
+
+       if (cpunum < nitems(cpu_info) &&
+           strcmp(caa->caa_name, cf->cf_driver->cd_name) == 0)
                return 1;
-       return 0;
+
+       return (0);
 }
 
 static void

Reply via email to