Skip to contentSkip to conversation

timing in driver function

DISCUSSION Michael Jones 4 participants 5 messages Aug 1, 2011 – Aug 5, 2011

lore
Share & tools
lore
#0 lore raw

I have a function in a driver which takes ~50ms to execute, which I've measured by reading jiffies at the beginning and end. But jiffies only counts at 128Hz on my system, so this was a very coarse measurement. Now I would like to find out more exactly where the time is going inside this function. So my basic question is, what is the best way to measure lapsed time with reasonable resolution on an OMAP?

As I had done with the jiffies measurement, what I imagined was inserting lines into my function, sampling the value of some counter at various points within it. This approach is crude but simple and would suffice for my case.

Since it must be a very common task, I thought I'd ask here what the recommended approach is. I see a few directions...

1. Using the OMAP's 32kHz timer, which is provided as a "struct clocksource". It seems like what I would want is to call clocksource_32k.read(), but I don't know how to retrieve clocksource_32k.

2. Using the ARM core's Performance Monitor Count Registers. This seems to be what perf_event uses. I'm not familiar with perf_events, but it sounds like I would also need to build 'perf', which according to
http://www.omappedia.org/wiki/Using_perf isn't possible to cross-compile. I don't want to tackle that without some reassurance that it is the right/only way.

I am currently using a 2.6.38 kernel.

thanks,
Michael

MATRIX VISION GmbH, Talstrasse 16, DE-71570 Oppenweiler
Registergericht: Amtsgericht Stuttgart, HRB 271090
Geschaeftsfuehrer: Gerhard Thullner, Werner Armingeon, Uwe Furtner, Erhard Meier

#1 lore raw
Quoted 12 lines · Michael Jones

I have a function in a driver which takes ~50ms to execute, which I've measured by reading jiffies at the beginning and end. But jiffies only counts at 128Hz on my system, so this was a very coarse measurement. Now I would like to find out more exactly where the time is going inside this function. So my basic question is, what is the best way to measure lapsed time with reasonable resolution on an OMAP?

As I had done with the jiffies measurement, what I imagined was inserting lines into my function, sampling the value of some counter at various points within it. This approach is crude but simple and would suffice for my case.

Quoted 7 lines

Since it must be a very common task, I thought I'd ask here what the recommended approach is. I see a few directions...

1. Using the OMAP's 32kHz timer, which is provided as a "struct clocksource". It seems like what I would want is to call clocksource_32k.read(), but I don't know how to retrieve clocksource_32k.

If you're looking for a one-off profiling, then as a hack, you could export a function that unconditionally returns the value of the 32kHz timer's count register (32KSYNCNT_CR) and use that for profiling.

- Anand

#2 lore raw
Quoted 16 lines · Anand
Quoted 15 lines · Michael Jones

I have a function in a driver which takes ~50ms to execute, which I've measured by reading jiffies at the beginning and end. But jiffies only counts at 128Hz on my system, so this was a very coarse measurement. Now I would like to find out more exactly where the time is going inside this function. So my basic question is, what is the best way to measure lapsed time with reasonable resolution on an OMAP?

As I had done with the jiffies measurement, what I imagined was inserting lines into my function, sampling the value of some counter at various points within it. This approach is crude but simple and would suffice for my case.

Since it must be a very common task, I thought I'd ask here what the recommended approach is. I see a few directions...

Quoted 9 lines
Quoted 4 lines

1. Using the OMAP's 32kHz timer, which is provided as a "struct clocksource". It seems like what I would want is to call clocksource_32k.read(), but I don't know how to retrieve clocksource_32k.

If you're looking for a one-off profiling, then as a hack, you could export a function that unconditionally returns the value of the 32kHz timer's count register (32KSYNCNT_CR) and use that for profiling.

How about using GPT using dm-timer APIs?

Quoted 6 lines

- Anand
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Signature · 6 lines
Thank you and Regards
Subbu
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#3 lore raw
In reply to Michael Jones

Hi,

Quoted 12 lines · Michael Jones

I have a function in a driver which takes ~50ms to execute, which I've measured by reading jiffies at the beginning and end. But jiffies only counts at 128Hz on my system, so this was a very coarse measurement. Now I would like to find out more exactly where the time is going inside this function. So my basic question is, what is the best way to measure lapsed time with reasonable resolution on an OMAP?

As I had done with the jiffies measurement, what I imagined was inserting lines into my function, sampling the value of some counter at various points within it. This approach is crude but simple and would suffice for my case.

Quoted 6 lines

Since it must be a very common task, I thought I'd ask here what the recommended approach is. I see a few directions...

1. Using the OMAP's 32kHz timer, which is provided as a "struct clocksource". It seems like what I would want is to call clocksource_32k.read(), but I don't know how to retrieve clocksource_32k.

Consider getnstimeofday(). It's not OMAP-specific; there are several examples in the Linux codebase[1]; and if you use a higher-resolution clocksource, the resolution should also increase (try disabling CONFIG_OMAP_32K_TIMER).

1. http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git&a=search&h=HEAD&st=grep&s=getnstimeofday

- Paul

#4 lore raw

Hi Paul,

Quoted 30 lines · Paul Walmsley

Hi,

Quoted 12 lines · Michael Jones

I have a function in a driver which takes ~50ms to execute, which I've measured by reading jiffies at the beginning and end. But jiffies only counts at 128Hz on my system, so this was a very coarse measurement. Now I would like to find out more exactly where the time is going inside this function. So my basic question is, what is the best way to measure lapsed time with reasonable resolution on an OMAP?

As I had done with the jiffies measurement, what I imagined was inserting lines into my function, sampling the value of some counter at various points within it. This approach is crude but simple and would suffice for my case.

Quoted 6 lines

Since it must be a very common task, I thought I'd ask here what the recommended approach is. I see a few directions...

1. Using the OMAP's 32kHz timer, which is provided as a "struct clocksource". It seems like what I would want is to call clocksource_32k.read(), but I don't know how to retrieve clocksource_32k.

Consider getnstimeofday(). It's not OMAP-specific; there are several examples in the Linux codebase[1]; and if you use a higher-resolution clocksource, the resolution should also increase (try disabling CONFIG_OMAP_32K_TIMER).

Quoted 4 lines

1. http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git&a=search&h=HEAD&st=grep&s=getnstimeofday

- Paul

Thanks, I took your suggestion and it served my purpose just fine.

-Michael

MATRIX VISION GmbH, Talstrasse 16, DE-71570 Oppenweiler
Registergericht: Amtsgericht Stuttgart, HRB 271090
Geschaeftsfuehrer: Gerhard Thullner, Werner Armingeon, Uwe Furtner, Erhard Meier