Hi tesla-dev,
Please review this suggested fix for 6819156.
If we store less cstates than in the _CST object, then re-allocate the
ss_state buffer to the proper size to match the count. When the
buffer is later freed in cpu_acpi_free_cstate_data() it is of the
proper size to match the count.
Regards,
Bill
-bash-3.2$ more 6819156.patch
--- old/usr/src/uts/i86pc/os/cpupm/cpu_acpi.c Wed Mar 18 18:57:36 2009
+++ new/usr/src/uts/i86pc/os/cpupm/cpu_acpi.c Wed Mar 18 18:57:35 2009
@@ -688,6 +688,7 @@
ACPI_OBJECT *obj;
ACPI_INTEGER cnt;
cpu_acpi_cstate_t *cstate, *p;
+ size_t orig_size;
int i, count;
CPU_ACPI_OBJ_IS_NOT_CACHED(handle, CPU_ACPI_CST_CACHED);
@@ -721,8 +722,8 @@
}
CPU_ACPI_CSTATES_COUNT(handle) = (uint32_t)cnt;
- CPU_ACPI_CSTATES(handle) = kmem_zalloc(CPU_ACPI_CSTATES_SIZE(cnt),
- KM_SLEEP);
+ size = CPU_ACPI_CSTATES_SIZE(cnt);
+ CPU_ACPI_CSTATES(handle) = kmem_zalloc(size, KM_SLEEP);
CPU_ACPI_BM_INFO(handle) = 0;
cstate = (cpu_acpi_cstate_t *)CPU_ACPI_CSTATES(handle);
p = cstate;
@@ -775,6 +776,7 @@
if (count < 2) {
cmn_err(CE_NOTE, "!cpu_acpi: _CST invalid count %d < 2",
count);
+ kmem_free(CPU_ACPI_CSTATES(handle), size);
AcpiOsFree(abuf.Pointer);
return (-1);
}
@@ -782,12 +784,21 @@
if (cstate[0].cs_type != CPU_ACPI_C1) {
cmn_err(CE_NOTE, "!cpu_acpi: _CST first element type not
C1: "
"%d", (int)cstate->cs_type);
+ kmem_free(CPU_ACPI_CSTATES(handle), size);
AcpiOsFree(abuf.Pointer);
return (-1);
}
- if (count != cnt)
+ if (count != cnt) {
+ void *orig = CPU_ACPI_CSTATES(handle);
+
CPU_ACPI_CSTATES_COUNT(handle) = (uint32_t)count;
+ CPU_ACPI_CSTATES(handle) = kmem_zalloc(
+ CPU_ACPI_CSTATES_SIZE(count), KM_SLEEP);
+ (void) memcpy(CPU_ACPI_CSTATES(handle), orig,
+ CPU_ACPI_CSTATES_SIZE(count));
+ kmem_free(orig, size);
+ }
AcpiOsFree(abuf.Pointer);
CPU_ACPI_OBJ_IS_CACHED(handle, CPU_ACPI_CST_CACHED);
On 03/18/09 19:04, Bill.Holler at Sun.COM wrote:
> Sun Confidential: Internal only
>
> *Synopsis*: cpu_acpi_free_cstate_data can free the wrong size
>
> CrPrint: http://bt2ws.central.sun.com/CrPrint?id=6819156
> Monaco: http://monaco.sfbay.sun.com/detail.jsf?cr=6819156
>
> CR 6819156 changed on Mar 19 2009 by bill.holler at sun.com
>
> === Field ============ === New Value ============= === Old Value
> =============
>
> Description New
> Note
> Evaluation New
> Note Interest
> List Michael.Corcoran at Sun.COM
> Introduced in Build
> snv_110 Introduced in
> Release solaris_nevada
> Status 6-Fix Understood
> 1-Dispatched ======================
> =========================== ===========================
>
> *Change Request ID*: 6819156
>
> *Synopsis*: cpu_acpi_free_cstate_data can free the wrong size
>
> Product: solaris
> Category: kernel
> Subcategory: sched
> Type: Defect
> Subtype: Functionality
> Status: 6-Fix Understood
> Substatus: Priority: 2-High
> Introduced In Release: solaris_nevada
> Introduced In Build: snv_110
> Responsible Manager: darrin.johnson at sun.com
> Responsible Engineer: bill.holler at sun.com
> Initial Evaluator: kernel-sched-ie at sun.com
> Keywords:
> === *Description*
> ============================================================
> cpu_acpi_free_cstate_data() frees memory kmem_zalloc'ed in
> cpu_acpi_cache_cst.
> The size to free is calculated with:
> kmem_free(CPU_ACPI_CSTATES(handle),
> CPU_ACPI_CSTATES_SIZE(CPU_ACPI_CSTATES_COUNT(handle)));
>
> Unfortunately the cstate count can be less than what was allocated for.
> cpu_acpi_cache_cst() sets cstate count to be that provided by _CST
> object:
> cnt = obj->Package.Elements[0].Integer.Value;
> ...
> CPU_ACPI_CSTATES_COUNT(handle) = (uint32_t)cnt;
> CPU_ACPI_CSTATES(handle) =
> kmem_zalloc(CPU_ACPI_CSTATES_SIZE(cnt),
> KM_SLEEP);
> The function then eliminates duplicate cstates. Each discarded cstate
> causes the cstate count to be one less than what was allocated for.
>
>
> One possilble fix when cstate entries have been discarded in
> cpu_acpi_cache_cst() is to: reallocate a smaller buffer of just the
> right size
> to hold the csates as indicated in the cstate count.
>
> *** (#1 of 2): 2009-03-18 21:08:19 GMT+00:00 bill.holler at sun.com
>
> Here is an untested fix. re-allocate the ss_state buffer to the
> corrected size:
>
> -bash-3.2$ more 6819156.patch
> --- old/usr/src/uts/i86pc/os/cpupm/cpu_acpi.c Wed Mar 18 18:57:36 2009
> +++ new/usr/src/uts/i86pc/os/cpupm/cpu_acpi.c Wed Mar 18 18:57:35 2009
> @@ -688,6 +688,7 @@
> ACPI_OBJECT *obj;
> ACPI_INTEGER cnt;
> cpu_acpi_cstate_t *cstate, *p;
> + size_t orig_size;
> int i, count;
>
> CPU_ACPI_OBJ_IS_NOT_CACHED(handle, CPU_ACPI_CST_CACHED);
> @@ -721,8 +722,8 @@
> }
>
> CPU_ACPI_CSTATES_COUNT(handle) = (uint32_t)cnt;
> - CPU_ACPI_CSTATES(handle) =
> kmem_zalloc(CPU_ACPI_CSTATES_SIZE(cnt),
> - KM_SLEEP);
> + size = CPU_ACPI_CSTATES_SIZE(cnt);
> + CPU_ACPI_CSTATES(handle) = kmem_zalloc(size, KM_SLEEP);
> CPU_ACPI_BM_INFO(handle) = 0;
> cstate = (cpu_acpi_cstate_t *)CPU_ACPI_CSTATES(handle);
> p = cstate;
> @@ -775,6 +776,7 @@
> if (count < 2) {
> cmn_err(CE_NOTE, "!cpu_acpi: _CST invalid count %d < 2",
> count);
> + kmem_free(CPU_ACPI_CSTATES(handle), size);
> AcpiOsFree(abuf.Pointer);
> return (-1);
> }
> @@ -782,12 +784,21 @@
> if (cstate[0].cs_type != CPU_ACPI_C1) {
> cmn_err(CE_NOTE, "!cpu_acpi: _CST first element type
> not C1: "
> "%d", (int)cstate->cs_type);
> + kmem_free(CPU_ACPI_CSTATES(handle), size);
> AcpiOsFree(abuf.Pointer);
> return (-1);
> }
>
> - if (count != cnt)
> + if (count != cnt) {
> + void *orig = CPU_ACPI_CSTATES(handle);
> +
> CPU_ACPI_CSTATES_COUNT(handle) = (uint32_t)count;
> + CPU_ACPI_CSTATES(handle) = kmem_zalloc(
> + CPU_ACPI_CSTATES_SIZE(count), KM_SLEEP);
> + (void) memcpy(CPU_ACPI_CSTATES(handle), orig,
> + CPU_ACPI_CSTATES_SIZE(count));
> + kmem_free(orig, size);
> + }
>
> AcpiOsFree(abuf.Pointer);
> CPU_ACPI_OBJ_IS_CACHED(handle, CPU_ACPI_CST_CACHED);
>
> *** (#2 of 2): 2009-03-19 02:00:44 GMT+00:00 bill.holler at sun.com
>
>
> === *Public Comments*
> ========================================================
>
> === *Comments*
> ===============================================================
>
> === *Evaluation*
> =============================================================
> See public Decription.
>
> *** (#1 of 1): 2009-03-19 02:00:44 GMT+00:00 bill.holler at sun.com
>
>
> === *Suggested Fix*
> ==========================================================
>
> === *Workaround*
> =============================================================
>
> === *Justification*
> ==========================================================
> Priority changed from [] to [2-High]
> Machine can panic.
> bill.holler at sun.com 2009-03-18 21:08:19 GMT
>
> *** (#1 of 1): 2009-03-18 21:08:19 GMT+00:00 bill.holler at sun.com
>
>
> === *Additional Details*
> =====================================================
> Targeted Release: Commit To Fix In Build:
> Fixed In Build: Integrated In Build: Verified In
> Build: See Also: 6819124
> Duplicate of: Hooks:
> Hook1: Hook2: Hook3: Hook4:
> Hook5: Hook6: Interest List: Michael.Corcoran at Sun.COM,
> tesla-dev at sun.com
> Program Management: Root Cause: Is a Security Vulnerability?: No
> Fix Affects Documentation: No
> Fix Affects Localization: No
> Reported by:
> === *History*
> ================================================================
> Date Submitted: 2009-03-18 21:08:18 GMT+00:00
> Submitted By: bill.holler at sun.com
>
> Status Changed Date Updated Updated By
> 6-Fix Understood 2009-03-19 02:00:44 GMT+00:00
> bill.holler at sun.com
>
>
> === *Solution*
> ===============================================================
>
>
> === *Service Request*
> ========================================================
> ID: 1-527843205
> Customer:
> Account Name: sun
> Customer Contact: Customer Contact Role: F-Functional
> Test
> Customer Contact Type: I-Internal (SMI) Customer
> Impact: Critical
> Functionality: Secondary
> Severity: 2
> Synopsis: Product Name: solaris
> Product Release: solaris_nevada
> Product Build: snv_110
> Operating System: snv_110
> Hardware: intel
> Reference Number: Sun Contact: bill.holler at sun.com
> Status: Open
> Source: BugTraq2
> Reproducible: Submitted By: bill.holler at sun.com
> Submitted Date: 2009-03-18 21:08:19 GMT+00:00
> Description:
>
> === *Activity*
> ===============================================================
>
>
> === *Multiple Release (MR) Cluster* - 0
> ======================================
>
>
> === *Escalations*
> ============================================================
>
>