On 16 April 2012 17:40, MyungJoo Ham <myungjoo.ham@xxxxxxxxx> wrote:
On Mon, Apr 16, 2012 at 7:19 PM, MyungJoo Ham <myungjoo.ham@xxxxxxxxx> wrote:Ah.. and one missing point:
> On Mon, Apr 16, 2012 at 4:02 PM, Satendra... <satendra.pratap@xxxxxxxxx> wrote:
>> Hi Ham,
>>
>> I have used jiffies to calculate the busy time and total time for a module
>> (made of 'n' functions say).
>> I have added a bew structure:
>
> Hi.
>
> In my ARM SoC systems, one jiffy is 5ms. I don't think other systems
> won't vary too much (should be around several hundred us to several
> ms). Are you sure that jiffy has enough granularity for your system?
> If you are counting the length spent in a function call, shouldn't
> nsecs be usec? (ktime?). And for saving such values, the
> "private_data" is intended for individual devfreq drivers
> communicating with governors specific to the drivers. Devfreq->data is
> intended for individual devfreq governors. Thus, yes, platform-data is
> the right place for devfreq driver internal.
>
> Cheers!
> MyungJoo.
>
Please consider the concurrency. You may have multiple instance of
function calls in your device driver. And please do not block them by
simply adding locks there if this performance counting is the only
reason to make them mutually exclusive. This is another reason to
count nsecs (ktime) locally in the function and add the end-start
(local variable) into the aggregation variable (lock here only or use
atomic operators).
Cheers!
MyungJoo.
Yes thats true that we will have multiple instances of function calls but every instance of driver
will have its own copy of counters which can be accessed through platform data.
So AFAICS we need not to worry about concurrency issue because no instance will touch the
counters of another instance. Please correct if i am wrong.
Below is the code using ktime API:
typedef struct devfreq_perf_counters {
#ifdef DEVFREQ_USE_KTIME
ktime_t fentry_time; /* jiffies at the enrty of a func */
ktime_t start_time; /* starting jiffies for every busy/total \
load cal in the last x seconds*/
ktime_t prev_count; /* last jiffies count */
s64 busy_time; /* total execution jiffies count in the last \
x seconds */
#else
unsigned long fentry_time; /* jiffies at the enrty of a func */
unsigned long start_time; /* starting jiffies for every busy/total \
load cal in the last x seconds*/
unsigned long prev_count; /* last jiffies count */
unsigned long busy_time; /* total execution jiffies count in the last \
x seconds */
#endif
}devfreq_counters;
#ifdef DEVFREQ_USE_KTIME
/* using ktime */
#define devfreq_func_start(dc) do {\
(dc)->fentry_time = ktime_get();\
}while(0)
#define devfreq_func_end(dc) do {\
(dc)->prev_count = ktime_get();\
(dc)->busy_time += ktime_to_ns(ktime_sub((dc)->prev_count, \
(dc)->fentry_time));\
}while(0)
#define module_busy_time(dc) ((dc)->busy_time)
#define module_busy_plus_not_busy_time(dc) \
ktime_to_ns(ktime_sub(ktime_get(), (dc)->start_time))
#define devfreq_reset_counters(dc) do { \
(dc)->start_time = ktime_get();\
}while(0)
#else
#define devfreq_func_start(dc) \
(dc)->fentry_time = jiffies
#define devfreq_fun_end(dc) do { \
(dc)->prev_count = (jiffies)-((dc)->fentry_time);\
(dc)->busy_time += (dc)->prev_count;\
}while(0)
#define module_busy_time(dc) \
jiffies_to_usecs((dc)->busy_time)
#define module_busy_plus_not_busy_time(dc) \
jiffies_to_usecs(((jiffies) - (dc)->start_time))
#define devfreq_reset_counters(dc) do { \
(dc)->fentry_time = 0UL; \
(dc)->prev_count = 0UL; \
(dc)->busy_time = 0UL; \
(dc)->start_time = jiffies;\
}while(0)
#endif
Thanks,
Satendra
>>
>> typedef struct devfreq_perf_counters {
>> unsigned long func_entry_jiffies; /* jiffies at the enrty of a func
>> */
>> unsigned long start_jiffies; /* starting jiffies for every
>> busy/total \
>> load cal in the last x
>> seconds*/
>> unsigned long local_jiffies; /* last jiffies count */
>> unsigned long busy_jiffies; /* total execution jiffies count in the
>> last \
>> x seconds */
>> }devfreq_counters;
>>
>> This structure's instance can be included in the platform_data(or private
>> data) of the
>> driver which has to register itself with devfreq. This way while doing
>> set_drv_data, access
>> to these counters could be available all the time.
>>
>> Now there is one initialization function :
>>
>> void devfreq_counters_init(void *data)
>> {
>> devfreq_counters **dc = &data->dpc;
>>
>> *dc = kzalloc(sizeof (devfreq_counters), GFP_KERNEL);
>>
>> (*dc)->func_entry_jiffies = 0UL;
>> (*dc)->local_jiffies = 0UL;
>> (*dc)->busy_jiffies = 0UL;
>> (*dc)->start_jiffies = jiffies;
>>
>> return;
>> }
>>
>> This function initializes the counters and is called at the end of driver
>> initialiation function.
>>
>> Now there is a list of APIs as shown below:
>>
>> #define devfreq_jiffies_start(dc) \
>> dc->func_entry_jiffies = jiffies
>>
>> #define devfreq_jiffies_end(dc) do { \
>> dc->local_jiffies = (jiffies)-(dc->func_entry_jiffies);\
>> dc->busy_jiffies += dc->local_jiffies;\
>> }while(0)
>>
>> #define busy_jiffies_in_usec(dc) \
>> jiffies_to_usecs((dc)->busy_jiffies)
>>
>> #define busy_plus_not_busy_jiffies_in_usec(dc) \
>> jiffies_to_usecs(((jiffies) - (dc)->start_jiffies))
>>
>> #define devfreq_reset_counters(dc) do { \
>> dc->func_entry_jiffies = 0UL; \
>> dc->local_jiffies = 0UL; \
>> dc->busy_jiffies = 0UL; \
>> dc->start_jiffies = jiffies;\
>> }while(0)
>>
>> Description:
>> - devfreq_jiffies_start(dc): Will be called in the start of the function
>> (this is one of the functions
>> which we want to consider in measuring the busy time of the driver)
>> - devfreq_jiffies_end(dc): Will be called at the end of that function
>> - busy_jiffies_in_usec(dc): Will return jiffies for which all considered
>> (for busy time) driver's
>> functions were busy
>> - busy_plus_not_busy_jiffies_in_usec(dc): Total jiffies i.e. busy time + not
>> busy time of driver
>> - devfreq_reset_counters(dc): obvious
>>
>> I wanted the simple solution to busy and load and i thought about this. This
>> solution hasn't been verified
>> yet.
>>
>> Ham, can you please provide your views on it.
>>
>> Thanks,
>> Satendra
>>
>>
>> On 29 March 2012 07:44, MyungJoo Ham <myungjoo.ham@xxxxxxxxx> wrote:
>>>
>>> 2012/3/28 Satendra... <satendra.pratap@xxxxxxxxx>
>>> >
>>> > Hi Ham,
>>> >
>>> > In the below struct :
>>> > struct devfreq_dev_status {
>>> > /* both since the last measure */
>>> > unsigned long total_time;
>>> > unsigned long busy_time;
>>> > unsigned long current_frequency;
>>> > void *private_data;
>>> > };
>>> >
>>> > How to calculate total_time/busy_time? Does it require hardware support
>>> > (may be some performance counters)?
>>> >
>>> > Thanks,
>>> > Satendra
>>>
>>> It is decided by each devfreq device driver, which is why
>>> get_dev_status() is to be provided by the devfreq device driver.
>>>
>>> If the device has performance counters, then, it's great, but
>>> performance counters are not mandatory.
>>>
>>> Here goes a list of mechanisms to fetch busy/total time:
>>> - Performance counters
>>> - Measure the time between "operation start" and "operation end" and
>>> accumulate the time (getting busy time. probably by ktime?)
>>> - Measure the idle time (CPUIDLE/CPUFREQ does this)
>>> - Count the number of operation and calculate the operational time
>>> based on the number.
>>> - and so on.
>>>
>>> As you can see in the list, you don't need a hardware support such as
>>> performance counters.
>>>
>>>
>>>
>>> Cheers!
>>> MyungJoo.
>>>
>>> >
>>> >
>>> > On 21 March 2012 15:49, 함명주 <myungjoo.ham@xxxxxxxxxxx> wrote:
>>> >>
>>> >> Hi Stendra,
>>> >>
>>> >>
>>> >>
>>> >> - Bascially, you can determine the voltage based on frequency; thus, we
>>> >> do not need to determint voltages at DVFS framework. It is
>>> >> corresponding
>>> >> device driver's responsibility even when we have AVS features. Thus,
>>> >> yes,
>>> >> the target callback needs to control both frequency and voltage (and
>>> >> anything else required to change the frequency/voltage)
>>> >>
>>> >>
>>> >>
>>> >> - I recommend to use regulator framework to control regulators unless
>>> >> you
>>> >> really really need to ignore regulator framework. Don't reinvent the
>>> >> wheel.
>>> >>
>>> >>
>>> >>
>>> >> - The three steps you've mentioned are correct.
>>> >>
>>> >>
>>> >>
>>> >> - The mailing list is opened to all. You are welcomed to use it (CC'ed
>>> >> linux-pm) and just CC needed people.
>>> >>
>>> >>
>>> >>
>>> >>
>>> >>
>>> >> Cheers!
>>> >>
>>> >> MyungJoo.
>>> >>
>>> >>
>>> >>
>>> >> ------- Original Message -------
>>> >>
>>> >> Sender : Satendra...<satendra.pratap@xxxxxxxxx>
>>> >>
>>> >> Date : 2012-03-21 19:03 (GMT+09:00)
>>> >>
>>> >> Title : Re: Re: Regarding Devfreq
>>> >>
>>> >>
>>> >>
>>> >> Hi Ham,
>>> >>
>>> >> Thank you very much for your reply. I will try not to disturb you much.
>>> >> In Devfreq I dont see any API related to voltage scaling. Is it the
>>> >> "->target" function's (in struct devfreq_dev_profile)
>>> >> responsibility to change the voltage as well with frequency?
>>> >> Do we really need to register our regulators using regulator framework
>>> >> of
>>> >> linux for voltage scaling?
>>> >>
>>> >> For a clear understanding I need to do following to use devfreq (I am
>>> >> sorry as I may be verifying it again):
>>> >> - define an instance of "struct devfreq_dev_profile" and provide
>>> >> implementations of target, get_dev_status and exit callbacks
>>> >> - Implement our choice of governer or use any one from already
>>> >> implemented ones.
>>> >> - call "devfreq_add_device" function from our driver's probe function.
>>> >>
>>> >> is that it? or do we need to do something else also?
>>> >>
>>> >> Thanks,
>>> >> Satendra
>>> >>
>>> >>
>>> >> On 21 March 2012 15:14, 함명주 <myungjoo.ham@xxxxxxxxxxx> wrote:
>>> >>>
>>> >>> Hello Satendra,
>>> >>>
>>> >>>
>>> >>>
>>> >>> - For Devfreq, OPP is optional though recommended for easier
>>> >>> implementation. You can still implement all the needed things without
>>> >>> OPP.
>>> >>> OPP is just a simple data structure to store pairs of voltage and
>>> >>> frequency.
>>> >>>
>>> >>>
>>> >>>
>>> >>> - Yes, you need to call devfreq_add_device() and supply the required
>>> >>> data. You can implement your own governor or use one of predefined
>>> >>> governors. Runtime replacement of governors like CPUfreq is "TODO" for
>>> >>> now.
>>> >>>
>>> >>>
>>> >>>
>>> >>> - For example, you can see /drivers/devfreq/exynos4_bus.c. GPU,
>>> >>> Display
>>> >>> devfreq drivers are under development in other companies (ARM).
>>> >>>
>>> >>>
>>> >>>
>>> >>> Cheers!
>>> >>>
>>> >>> MyungJoo.
>>> >>>
>>> >>>
>>> >>>
>>> >>>
>>> >>>
>>> >>> ------- Original Message -------
>>> >>>
>>> >>> Sender : Satendra...<satendra.pratap@xxxxxxxxx>
>>> >>>
>>> >>> Date : 2012-03-21 17:31 (GMT+09:00)
>>> >>>
>>> >>> Title : Re: Regarding Devfreq
>>> >>>
>>> >>>
>>> >>>
>>> >>> Hi Ham,
>>> >>>
>>> >>> I have studied DVFS and what I feel is that we need to use OPP and
>>> >>> Voltage regulator interfaces also to
>>> >>> maintain Optimum Performance Points and to provide APIs to change the
>>> >>> voltage.
>>> >>> What I feel is that to use DVFS every driver has to
>>> >>> call devfreq_add_device function to register that device to
>>> >>> the devfreq framework. And in order to do that we have to
>>> >>> implement devfreq_dev_profile and our choice of governer.
>>> >>>
>>> >>> I appreciate your help.
>>> >>>
>>> >>> Thanks,
>>> >>> Satendra
>>> >>>
>>> >>> On 20 March 2012 12:16, Satendra... <satendra.pratap@xxxxxxxxx> wrote:
>>> >>>>
>>> >>>> Hi Ham,
>>> >>>>
>>> >>>> We are working on a new SoC for our new product and would want to use
>>> >>>> your Devfreq
>>> >>>> framework for our devices. Would you please let me know any other
>>> >>>> implementation which
>>> >>>> uses devfreq ? so that we could take that as a reference.
>>> >>>> Or we would be the first one to start?
>>> >>>>
>>> >>>> Thanks,
>>> >>>> Satendra
>>> >>>
>>> >>>
>>> >>>
>>> >>>
>>> >>>
>>> >>>
>>> >>> --
>>> >>>
>>> >>> MyungJoo Ham (함명주), PHD
>>> >>>
>>> >>> System S/W Lab, S/W Platform Team, Software Center
>>> >>> Samsung Electronics
>>> >>> Cell: +82-10-6714-2858
>>> >>>
>>> >>>
>>> >>
>>> >>
>>> >>
>>> >>
>>> >>
>>> >>
>>> >> --
>>> >>
>>> >> MyungJoo Ham (함명주), PHD
>>> >>
>>> >> System S/W Lab, S/W Platform Team, Software Center
>>> >> Samsung Electronics
>>> >> Cell: +82-10-6714-2858
>>> >>
>>> >>
>>> >
>>> >
>>> >
>>> > _______________________________________________
>>> > linux-pm mailing list
>>> > linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx
>>> > https://lists.linuxfoundation.org/mailman/listinfo/linux-pm
>>>
>>>
>>>
>>>
>>> --
>>> MyungJoo Ham, Ph.D.
>>> System S/W Lab, S/W Center, Samsung Electronics
>>
>>
>
>
>
> --
> MyungJoo Ham, Ph.D.
> System S/W Lab, S/W Center, Samsung Electronics
--
MyungJoo Ham, Ph.D.
System S/W Lab, S/W Center, Samsung Electronics
_______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/linux-pm