On 10/21/08 19:12, Li, Aubrey wrote:
> Bill Holler wrote:
>
>
>> Another group is working on system policy. They are thinking
>> of settings such as max-power-savings, max-performance,
>> elastic, etc. One way to implement these system policies may
>> be to ignore different processor groups similar to this.
>>
>> Do we want policy to be at the thread level or at the system level?
>>
>>
>
> AFAIK, the policy only takes effect in cmt_balance().
> There is an event driver in Eric's policy patch. My thoughts is, this event
> driver can exactly be used to employ both coalescence and load balance
> policy across the processor group. When performance is needed, we dispatch
> the next thread by max-performance policy, and when power is needed, we
> dispatch the next thread by max-power-savings policy. IMHO, this needs kthead
> to be policy sensitive.
>
> Are you suggesting we use one policy at the same time, and throw the setting
> out
> to the userland?
>
That sounds like the current direction, but I am not positive.
Eric has more contact with the group working on system-level
policy, but I did not see him respond to your email today.
Eric also mentioned the possibility of changing the per-cpu
load balancing lineages to reflect different system policies.
Regards,
Bill
> Regards,
> -Aubrey
>
>
>> On 10/20/08 23:43, Li, Aubrey wrote:
>>
>>> Eric.Saxe wrote:
>>>
>>>
>>>
>>>> Because it works top down, in this case, the coalescence policy will
>>>> be implemented until there's nothing more to do at that level,
>>>> before moving lower. This is the first time we've allowed different
>>>> policies to be implemented across the hierarchy, so i'm really
>>>> happy you are taking a look at this. I haven't looked at it closely
>>>> yet since I've still been focused on getting the nuts and bolts of
>>>> the dispatcher driven p-state changes to happen... :)
>>>>
>>>>
>>> Currently we have two kinds of cmt policy across the hierarchical
>>> processor group. So it's possible a thread want to be dispatched by
>>> the performance policy but there is only power related processor
>>> group avaiable.
>>>
>>> The following patch adds a member into kthread_t structure, and use
>>> the same event driver which is used to notify cpupm to change
>>> p-state, to make the next kernel thread sensitive to the cmt policy,
>>> so that in later cmt balance, we can choose cpu by searching the
>>> related target processor group, unrelated groups will be ignored.
>>>
>>> What do you think?
>>>
>>> Thanks,
>>> -Aubrey
>>>
>>> diff -r 7bc9bb1331de usr/src/uts/common/disp/cmt.c
>>> --- a/usr/src/uts/common/disp/cmt.c Tue Oct 21 10:17:20 2008
>>> +0800 +++ b/usr/src/uts/common/disp/cmt.c Tue Oct 21 14:24:01
>>> 2008 +0800 @@ -951,6 +951,7 @@ {
>>> pg_cmt_t *cmt = (pg_cmt_t *)pg;
>>> cpupm_domain_t *dom;
>>> + pghw_type_t pghw_hw = ((pghw_t *)pg)->pghw_hw;
>>> uint32_t u;
>>>
>>> if (old == cp->cpu_idle_thread) {
>>> @@ -960,7 +961,6 @@
>>> * significant increase in utiliation unless the
>>> thread makes
>>> * it through one time slice expiration.
>>> */ - ASSERT((cp->cpu_disp_flags & CPU_DISP_CMT_TRANS)
>>> == 0); cp->cpu_disp_flags |= CPU_DISP_CMT_TRANS;
>>>
>>> } else if (new == cp->cpu_idle_thread) {
>>> @@ -984,8 +984,16 @@
>>> * zero, so we should notify the CPUPM
>>> subsystem. */ if (u
>>> == 1) {
>>> - dom = (cpupm_domain_t
>>> *)cmt->cmt_pg.pghw_handle;
>>> - cpupm_utilization_change(cp, dom, 0);
>>> + if (pghw_hw == PGHW_POW_ACTIVE) {
>>> + dom = (cpupm_domain_t *)
>>> + cmt->cmt_pg.pghw_handle;
>>> +
>>>
>> cpupm_utilization_change(cp, dom, 0);
>>
>>> + }
>>> + /*
>>> + * next thread will be dispatched by
>>> power + * policy
>>> + */
>>> + new->t_cmt_policy = CMT_COALESCE;
>>> } }
>>> } else {
>>> @@ -1004,6 +1012,7 @@
>>> {
>>> pg_cmt_t *cmt = (pg_cmt_t *)pg;
>>> cpupm_domain_t *dom;
>>> + pghw_type_t pghw_hw = ((pghw_t *)pg)->pghw_hw;
>>> uint32_t u;
>>>
>>> /*
>>> @@ -1029,8 +1038,15 @@
>>> * the CPUPM subsystem.
>>> */
>>> if (u == 0) {
>>> - dom = (cpupm_domain_t
>>> *)cmt->cmt_pg.pghw_handle;
>>> - cpupm_utilization_change(cp, dom, 1);
>>> + if (pghw_hw == PGHW_POW_ACTIVE) {
>>> + dom = (cpupm_domain_t
>>> *)cmt->cmt_pg.pghw_handle; +
>>> cpupm_utilization_change(cp, dom, 1); + } +
>>> /* + * next thread will be dispatched by the
>>> performance + * policy
>>> + */
>>> + t->t_cmt_policy = CMT_BALANCE;
>>> } }
>>> }
>>> diff -r 7bc9bb1331de usr/src/uts/common/disp/cmt_policy.c
>>> --- a/usr/src/uts/common/disp/cmt_policy.c Tue Oct 21 10:17:20
>>> 2008 +0800 +++ b/usr/src/uts/common/disp/cmt_policy.c Tue Oct
>>> 21 14:24:01 2008 +0800 @@ -140,6 +140,26 @@ do {
>>> pg = GROUP_ACCESS(cmt_pgs, level);
>>>
>>> + /*
>>> + * if next thread is dispatched by the performance
>>> + * policy, power related group should be ignored +
>>> */ + if (tp->t_cmt_policy == CMT_BALANCE) {
>>> + if (pg->cmt_policy & CMT_COALESCE) {
>>> + continue;
>>> + }
>>> + /*
>>> + * if next thread is dispatched by the power
>>> + * policy, loading balance related group should +
>>> * be ignored + */
>>> +
>>> + } else if (tp->t_cmt_policy == CMT_COALESCE) {
>>> + if (pg->cmt_policy & CMT_BALANCE) {
>>> + continue;
>>> + }
>>> + }
>>> +
>>> siblings = pg->cmt_siblings;
>>> nsiblings = GROUP_SIZE(siblings); /* self
>>> inclusive */ if (nsiblings == 1)
>>> diff -r 7bc9bb1331de usr/src/uts/common/sys/thread.h
>>> --- a/usr/src/uts/common/sys/thread.h Tue Oct 21 10:17:20 2008
>>> +0800 +++ b/usr/src/uts/common/sys/thread.h Tue Oct 21 14:24:01
>>> 2008 +0800 @@ -342,6 +342,7 @@ hrtime_t t_hrtime;
>>> /* high-res last time on cpu */ kmutex_t t_ctx_lock;
>>> /* protects t_ctx in removectx() */ struct waitq
>>> *t_waitq; /* wait queue */ + uint_t
>>> t_cmt_policy; /* cmt policy */ } kthread_t;
>>>
>>> /*
>>> _______________________________________________
>>> 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
>>
>
>