Bill Holler wrote:
> Webrev has been uploaded:
>
>    http://cr.opensolaris.org/~bholler/6819156/

Looks good.
>
> 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
>
> _______________________________________________
> tesla-dev mailing list
> tesla-dev at opensolaris.org
> http://mail.opensolaris.org/mailman/listinfo/tesla-dev


Reply via email to