Hi Randy,
I have posted the PSARC onepager for CPU idle notification into
Tesla-dev maillist and received many value comments. After several rounds'
iteration, I think it has passed community review process, so could you please
help to go through the PSARC TastTrack process?
Thanks!
>-----Original Message-----
>From: Bill.Holler at Sun.COM [mailto:Bill.Holler at Sun.COM]
>Sent: 2008?12?4? 12:49
>To: Liu, Jiang
>Cc: Eric.Saxe at Sun.COM; Randall Fishel;
>tesla-dev at opensolaris.org; Raj, Ashok
>Subject: Re: Request for comment for third version of FIPE
>PSARC onepager
>
>Hi Gerry,
>
>This onepager looks good to me.
>Please update with an explanation of the void *arg
>as we discussed on IRC. :-)
>
>Thank you,
>Bill
>
>
>On 12/02/08 18:52, Liu, Jiang wrote:
>> Hi Bill and Eric,
>> I have made minor changes to the FIPE PSARC onepager
>according to your suggestion, basically return an handle when
>registers callback and the handle will be used to unregister
>the callback.
>> Any more comments here? If no more comments, I'll
>cooperate with Randy to go on with the PSARC process.
>> Thanks!
>>
>>
>>> -----Original Message-----
>>> From: tesla-dev-bounces at opensolaris.org
>>> [mailto:tesla-dev-bounces at opensolaris.org] On Behalf Of Liu, Jiang
>>> Sent: 2008?11?25? 23:23
>>> To: Eric.Saxe at Sun.COM
>>> Cc: Bill.Holler at Sun.COM; Randall Fishel; tesla-dev at opensolaris.org
>>> Subject: Re: [tesla-dev] Request for comment for PSARC
>>> onapager about CPU idle nofication interface
>>>
>>> Hi Eric,
>>> Please see following comments.
>>> Thanks!
>>>
>>> Eric.Saxe at Sun.COM <mailto:Eric.Saxe at Sun.COM> wrote:
>>>
>>>> Hi Gerry,
>>>>
>>>> Liu, Jiang wrote:
>>>>
>>>>> Bill.Holler at Sun.COM <mailto:Bill.Holler at Sun.COM> wrote:
>>>>>
>>>>>
>>>>>> Hi Gerry,
>>>>>>
>>>>>> Here are my comments on this proposal.
>>>>>>
>>>>>> ci_c_state should be architecture neutral. Something like
>>>>>> ci_idle_state would be better. Each architecture can have public
>>>>>> defines for what these mean (e.g. #define C1 1).
>>>>>>
>>>>>>
>>>>> Good suggestion, I'll refine it.
>>>>>
>>>>>
>>>>>
>>>>>> Should "arg" be removed from the typedefs for cpu_idle_enter_cbfn
>>>>>> and cpu_idle_exit_cbfn and also removed from
>>>>>> cpu_idle_register_callback and cpu_idle_unregister_callback?
>>>>>> There is no purpose for arg in the new version of the interface.
>>>>>>
>>>>>>
>>>>> The arg is used to pass context info back to callbacks.
>>>>> It's useful when the same callback handler will be
>>>>>
>>>> registered more than one time. If no such usage scenario, we
>>>> can remove it.
>>>>
>>>> I guess that context could also be passed via something in the
>>>> cpu_idle_info_t.
>>>>
>>> Here I mean per-callback context, you may pass in one argument
>>> when register callback handler and the argument will be passed
>>> back when callback get called.
>>> I think it's simpler and clearer to pass "arg" as a separate
>>> argument when calling registered callback though "arg" may be
>>> integrated into cpu_idle_info_t structure,
>>>
>>>
>>>
>>>>>> Should cpu_idle_exit handlers be called before enabling
>interrupts
>>>>>> when the CPU resumes from idle?
>>>>>>
>>>>>>
>>>>> Yes, it will be called before enabling interrupt and all
>>>>>
>>>> cpu_idle_exit handlers will called with interrupt enabling
>>>> flag cleared.
>>>>
>>>>>
>>>>>> What are your thoughts on priority? Is this related to
>>>>>> hardware requirements (for example run handler before
>>>>>> disabling LAPIC)? Or is this for power performance?
>>>>>> This seems like a tricky area where some of the hardware
>>>>>> implementation may need to be exposed.
>>>>>>
>>>>>>
>>>>> Mainly the priority is used to resolve hardware dependencies among
>>>>> callbacks. Actually this is the most tricky and dirty part, under
>>>>> some
>>>>>
>>>> circumstances we may need to statically allocate priority
>>>> based on hardware dependency and performance requirements.
>>>>
>>>>> I have splitted the priority space into three sub-spaces:
>>>>> HIGH_PRIORITY sub-space: statically allocated high priorities
>>>>> DYNAMIC_PRIORITY sub-space: callbacks don't care about
>>>>>
>>>> calling order and system allocate priority for callbacks.
>>>>
>>>>> LOW_PRIORITY sub-space: statically allocated low priorities
>>>>>
>>>>>
>>>> This seems a bit dicey. Would it be cleaner to just provide an
>>>> interface to allow one callback to specify that it "depends" on
>>>> another one? For example, perhaps the register callback
>could return
>>>> a "handle", that could then be passed to an interface to
>say that the
>>>> newly registered callback depends on another already registered
>>>> callback...something similar to:
>>>>
>>>> cpu_idle_cb_handle_t a, b;
>>>>
>>>> b = cpu_idle_register_callback(callback_func_b, NULL);
>>>> a = cpu_idle_register_callback(callback_func_a, NULL);
>>>>
>>>> /*
>>>> * Notify the framework that execution of callback "a" depends
>>>> * on the execution of callback "b"
>>>> */
>>>> if (cpu_idle_register_dependency(a, b) < 0) {
>>>> /*
>>>> * Unwind registration, log error, etc
>>>> */
>>>> ...
>>>> }
>>>>
>>>> (Actually, such a "handle" would be a convenient thing to
>>>>
>>> pass back to
>>>
>>>> the interface to do the unregistration).
>>>>
>>> Ashok has suggested to return a "handle" when registering
>>> callbacks which could be used to unregister callbacks and I'll
>>> integrate it into next version onepager.
>>>
>>>
>>>> This way, the dependencies are always specified in relative
>>>>
>>> terms, and
>>>
>>>> you don't get into problems with callbacks having to know too
>>>> much about
>>>> the priorities of other callbacks.
>>>>
>>> This is a novel idea which eliminates the priority allocation
>>> issue. But it may introduces some new issues.
>>> 1) Each handle returned by cpu_idle_register_callback need to
>>> be exported in order that other handles could make dependency on it.
>>> 2) We need to ensure some sort of order when registering
>>> callbacks to make use of cpu_idle_register_dependency.
>>> 3) It may introduce dependencies among drivers. For example,
>>> driver A registers callback A, driver B registers callback B,
>>> driver B will have dependency on driver A if callback B is
>>> dependent on callback A.
>>> 4) It may cause trouble when dynamically
>>> registering/unregister callbacks. Thinking about following
>scenarion:
>>> - Callback B has dependency on callback A
>>> - Register callback A
>>> - Register callback B and make dependency on callback A
>>> - Try to unregister callback A. We have two options
>>> here: fail the unregister operation because there're other
>>> callbacks dependent on it or complete the unregister operation
>>> successfully.
>>> - Register callback A again if unregistering succeed.
>>> Then the dependency between A and B becomes broken,
>>> 5) I have a feeling, to adopt the above solution, all
>>> callbacks need to know each other in order to maintain
>>> dependencies correctly among callbacks.
>>>
>>> The idea is very interesting, but we still need to solve some
>>> troublesome issues,
>>> How about making some tradeoff here, first implement a simple
>>> version with current priority based design and enhance it when
>>> there're strong requirements.
>>>
>>>
>>>
>>>> Thanks,
>>>> -Eric
>>>>
>>> _______________________________________________
>>> tesla-dev mailing list
>>> tesla-dev at opensolaris.org
>>> http://mail.opensolaris.org/mailman/listinfo/tesla-dev
>>>
>>>
>
>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: onepager_v4.txt
URL:
<http://mail.opensolaris.org/pipermail/tesla-dev/attachments/20081208/0b2507ee/attachment.txt>