> Date: Wed, 5 Aug 2020 17:10:37 +1000 > From: Jonathan Matthew <jonat...@d14n.org> > > This came out of the work on supporting ACPI0007 devices in acpicpu(4), but > it's independent of that and I'd like to get it in the tree separately. > > Since it was first added, acpicpu stores instances of itself in an array, > which it uses to find the acpicpu device for a cpu. This runs into problems > when there are more than MAXCPUS acpicpu devices. Currently it overwrites > whatever's after the array, leading to varying crashes and hangs depending > on kernel link order. > > More recently, we've added a pointer to struct cpu_info that does this more > directly, and also has the advantage that it actually matches up the cpu ids > rather than assuming cpu3 maps to acpicpu3. > > This diff removes the acpicpu_sc array and uses the pointer from struct > cpu_info instead. Most of the accesses are just looking for the first > acpicpu, > so we can use cpu_info_primary to find that. > > I've tested this on a few different machines (including one with 128 acpicpu > devices) and everything still works. > > ok?
ok kettenis@ > Index: acpicpu.c > =================================================================== > RCS file: /cvs/src/sys/dev/acpi/acpicpu.c,v > retrieving revision 1.85 > diff -u -p -r1.85 acpicpu.c > --- acpicpu.c 27 May 2020 05:02:21 -0000 1.85 > +++ acpicpu.c 3 Aug 2020 05:10:45 -0000 > @@ -188,8 +188,6 @@ struct cfdriver acpicpu_cd = { > > extern int setperf_prio; > > -struct acpicpu_softc *acpicpu_sc[MAXCPUS]; > - > #if 0 > void > acpicpu_set_throttle(struct acpicpu_softc *sc, int level) > @@ -672,7 +670,6 @@ acpicpu_attach(struct device *parent, st > > sc->sc_acpi = (struct acpi_softc *)parent; > sc->sc_devnode = aa->aaa_node; > - acpicpu_sc[sc->sc_dev.dv_unit] = sc; > > SLIST_INIT(&sc->sc_cstates); > > @@ -979,7 +976,7 @@ acpicpu_fetch_pss(struct acpicpu_pss **p > * the bios ensures this... > */ > > - sc = acpicpu_sc[0]; > + sc = (struct acpicpu_softc *)cpu_info_primary.ci_acpicpudev; > if (!sc) > return 0; > *pss = sc->sc_pss; > @@ -1024,7 +1021,7 @@ acpicpu_set_notify(void (*func)(struct a > { > struct acpicpu_softc *sc; > > - sc = acpicpu_sc[0]; > + sc = (struct acpicpu_softc *)cpu_info_primary.ci_acpicpudev; > if (sc != NULL) > sc->sc_notify = func; > } > @@ -1034,7 +1031,7 @@ acpicpu_setperf_ppc_change(struct acpicp > { > struct acpicpu_softc *sc; > > - sc = acpicpu_sc[0]; > + sc = (struct acpicpu_softc *)cpu_info_primary.ci_acpicpudev; > > if (sc != NULL) > cpu_setperf(sc->sc_level); > @@ -1048,7 +1045,7 @@ acpicpu_setperf(int level) > int idx, len; > uint32_t status = 0; > > - sc = acpicpu_sc[cpu_number()]; > + sc = (struct acpicpu_softc *)curcpu()->ci_acpicpudev; > > dnprintf(10, "%s: acpicpu setperf level %d\n", > sc->sc_devnode->name, level); > >