On Fri, Nov 26, 2010 at 04:13:28PM +0100, Mark Kettenis wrote: > > Date: Fri, 26 Nov 2010 16:35:28 +1000 > > From: David Gwynne <l...@animata.net> > > > > 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 > > > > Sorry, but I think it is better to do this the same way it's done on > hppa. The changes to i386 are a bit arger than strictly necessary to > make the code identical to amd64. Only tested on i386, artificially > limiting MAXCPUS to 1. > > > Index: amd64/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/amd64/cpu.c 13 Nov 2010 04:16:42 -0000 1.38 > +++ amd64/amd64/cpu.c 26 Nov 2010 15:00:49 -0000 > @@ -168,9 +168,13 @@ cpu_match(struct device *parent, void *m > struct cfdata *cf = match; > struct cpu_attach_args *caa = aux; > > - if (strcmp(caa->caa_name, cf->cf_driver->cd_name) == 0) > - return 1; > - return 0; > + if (strcmp(caa->caa_name, cf->cf_driver->cd_name) != 0) > + return 0; > + > + if (cf->cf_unit >= MAXCPUS) > + return 0; > + > + return 1; > } > > static void > Index: i386/i386/cpu.c > =================================================================== > RCS file: /cvs/src/sys/arch/i386/i386/cpu.c,v > retrieving revision 1.41 > diff -u -p -r1.41 cpu.c > --- i386/i386/cpu.c 25 Jul 2010 21:43:35 -0000 1.41 > +++ i386/i386/cpu.c 26 Nov 2010 15:00:53 -0000 > @@ -157,14 +157,18 @@ struct cfdriver cpu_cd = { > }; > > int > -cpu_match(struct device *parent, void *matchv, void *aux) > +cpu_match(struct device *parent, void *match, void *aux) > { > - struct cfdata *match = (struct cfdata *)matchv; > - struct cpu_attach_args *caa = (struct cpu_attach_args *)aux; > + struct cfdata *cf = match; > + struct cpu_attach_args *caa = aux; > > - if (strcmp(caa->caa_name, match->cf_driver->cd_name) == 0) > - return (1); > - return (0); > + if (strcmp(caa->caa_name, cf->cf_driver->cd_name) != 0) > + return 0; > + > + if (cf->cf_unit >= MAXCPUS) > + return 0; > + > + return 1; > } > > void
Seems to work on my 6-core amd64 box. I'm all for consistency, so this is ok k...@. .... Ken