Hello -

This diff is more involved.

In est_acpi_pss_changed, a new table is allocated but n isn't updated,
which keep tracks of the number allocated.  Set it.

In est_init, fake_table was being allocated with 3.  Change that to
allocate exactly what is need by setting n earlier.


Regarding the isa/ section, in _isa_bus_dmamap_create, cookiesize is:
  cookiesize = sizeof(struct isa_dma_cookie);
  ...
  if ((avail_end > ISA_DMA_BOUNCE_THRESHOLD &&
      (flags & ISABUS_DMA_32BIT) == 0) ||
      ((map->_dm_size / NBPG) + 1) > map->_dm_segcnt) {
        cookieflags |= ID_MIGHT_NEED_BOUNCE;
        cookiesize += (sizeof(bus_dma_segment_t) * map->_dm_segcnt);
  }

so I am assuming if ID_MIGHT_NEED_BOUNCE is set, that cookiesize gets
they larger size.

OK?

Index: arch/amd64/amd64/est.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/est.c,v
retrieving revision 1.39
diff -u -p -r1.39 est.c
--- arch/amd64/amd64/est.c      6 Mar 2016 22:41:24 -0000       1.39
+++ arch/amd64/amd64/est.c      31 Mar 2018 19:11:48 -0000
@@ -284,6 +284,7 @@ est_acpi_pss_changed(struct acpicpu_pss 
                free(acpilist, M_DEVBUF, sizeof(struct fqlist));
                return;
        }
+       acpilist->n = npss;
 
        for (i = 0; i < npss; i++) {
                acpilist->table[i].mhz = pss[i].pss_core_freq;
@@ -377,10 +378,13 @@ est_init(struct cpu_info *ci)
                            "list\n", cpu_device);
                        return;
                }
+               if (cur == idhi || cur == idlo)
+                       fake_fqlist->n = 2; 
+               else
+                       fake_fqlist->n = 3;
 
-
-               if ((fake_table = mallocarray(3, sizeof(struct est_op),
-                   M_DEVBUF, M_NOWAIT)) == NULL) {
+               if ((fake_table = mallocarray(fake_fqlist->n,
+                   sizeof(struct est_op), M_DEVBUF, M_NOWAIT)) == NULL) {
                        free(fake_fqlist, M_DEVBUF, sizeof(struct fqlist));
                        printf("%s: EST: cannot allocate memory for fake "
                            "table\n", cpu_device);
@@ -388,13 +392,12 @@ est_init(struct cpu_info *ci)
                }
                fake_table[0].ctrl = idhi;
                fake_table[0].mhz = MSR2MHZ(idhi, bus_clock);
-               if (cur == idhi || cur == idlo) {
+               if (fake_fqlist->n == 2) {
                        printf("%s: using only highest and lowest power "
                               "states\n", cpu_device);
 
                        fake_table[1].ctrl = idlo;
                        fake_table[1].mhz = MSR2MHZ(idlo, bus_clock);
-                       fake_fqlist->n = 2;
                } else {
                        printf("%s: using only highest, current and lowest "
                            "power states\n", cpu_device);
@@ -404,7 +407,6 @@ est_init(struct cpu_info *ci)
 
                        fake_table[2].ctrl = idlo;
                        fake_table[2].mhz = MSR2MHZ(idlo, bus_clock);
-                       fake_fqlist->n = 3;
                }
 
                fake_fqlist->vendor = vendor;
@@ -441,7 +443,7 @@ est_init(struct cpu_info *ci)
        return;
 
 nospeedstep:
-       free(est_fqlist->table, M_DEVBUF, 0);
+       free(est_fqlist->table, M_DEVBUF, est_fqlist->n * sizeof(struct 
est_op));
        free(est_fqlist, M_DEVBUF, sizeof(*est_fqlist));
 }
 
Index: arch/amd64/isa/isa_machdep.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/isa/isa_machdep.c,v
retrieving revision 1.29
diff -u -p -r1.29 isa_machdep.c
--- arch/amd64/isa/isa_machdep.c        14 Oct 2017 04:44:43 -0000      1.29
+++ arch/amd64/isa/isa_machdep.c        31 Mar 2018 19:11:48 -0000
@@ -455,6 +455,7 @@ void
 _isa_bus_dmamap_destroy(bus_dma_tag_t t, bus_dmamap_t map)
 {
        struct isa_dma_cookie *cookie = map->_dm_cookie;
+       size_t cookiesize = sizeof(struct isa_dma_cookie);
 
        /*
         * Free any bounce pages this map might hold.
@@ -462,7 +463,10 @@ _isa_bus_dmamap_destroy(bus_dma_tag_t t,
        if (cookie->id_flags & ID_HAS_BOUNCE)
                _isa_dma_free_bouncebuf(t, map);
 
-       free(cookie, M_DEVBUF, 0);
+       if (cookie->id_flags & ID_MIGHT_NEED_BOUNCE)
+               cookiesize += (sizeof(bus_dma_segment_t) * map->_dm_segcnt);
+
+       free(cookie, M_DEVBUF, cookiesize);
        _bus_dmamap_destroy(t, map);
 }
 

Reply via email to