Webrev has been uploaded:
http://cr.opensolaris.org/~bholler/6819156/
Regards,
Bill
On 03/18/09 19:28, Bill Holler wrote:
> 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*
>> ============================================================
>>
>>
> _______________________________________________
> tesla-dev mailing list
> tesla-dev at opensolaris.org
> http://mail.opensolaris.org/mailman/listinfo/tesla-dev