Hi,

I'll resend this to the omap list.  I had originally sent it with some pictures 
but I guess they were too big for the lists.  Individual should have got them.

If anyone has the time this is a good to test with.  If you have dynamic tick 
enabled it can double performance of high rate interrupt things like MUSB.

If anyone wants I'll re-send larger trace pictures individually.


> From: Woodruff, Richard, Monday, June 16, 2008 7:06 PM
>
> It simply does a check to see if the about to be reprogrammed 1 shot
> already is the last event programmed in the hardware.  If it is it skips
> calling the hardware.
>
> In my device I get many interrupts from a high speed USB device in a
> very short period of time.  The system spends a lot of time
> reprogramming the hardware timer which is in a slower timing domain as
> compared to the CPU.  This results in the CPU spending a huge amount of
> time waiting for the timer posting to be done.  All of this
> reprogramming is useless as the wake up time has not changed.
>
> As measured using ETM trace this drops my reprogramming penalty from
> almost 60% CPU load down to 15% during high interrupt rate.  If you like
> I can send traces to show this.

Attached are some results on OMAP-ARM from USB-OTG:

As host:

[EMAIL PROTECTED] /]# mount -t vfat /dev/sda1 /mnt/
[EMAIL PROTECTED] /]# time -p cp /mnt/OE.mtn.bz2 /dev/null
real 32.51
user 0.02
sys 1.05
[EMAIL PROTECTED] /]# umount /mnt/
[EMAIL PROTECTED] /]# mount -t vfat /dev/sda1 /mnt/
[EMAIL PROTECTED] /]# time -p cp /mnt/OE.mtn.bz2 /dev/null
real 17.92
user 0.05
sys 1.57

As Client:

Attached are some visuals as of client doing gadget zero tests.  Pictures 
clearly show before a domination by timer reprogram and after not.

Regards,
Richard W.


diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index b854a89..ff6b967 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -254,6 +254,17 @@ void tick_nohz_stop_sched_tick(void)
        /* Schedule the tick, if we are at least one jiffie off */
        if ((long)delta_jiffies >= 1) {

+               /*
+               * calculate the expiry time for the next timer wheel
+               * timer
+               */
+               expires = ktime_add_ns(last_update, tick_period.tv64 *
+                                  delta_jiffies);
+
+               /* Skip reprogram of event if its not changed */
+               if(ts->tick_stopped && ktime_equal(expires, dev->next_event))
+                       goto out2;
+
                if (delta_jiffies > 1)
                        cpu_set(cpu, nohz_cpu_mask);
                /*
@@ -304,12 +315,7 @@ void tick_nohz_stop_sched_tick(void)
                        goto out;
                }

-               /*
-                * calculate the expiry time for the next timer wheel
-                * timer
-                */
-               expires = ktime_add_ns(last_update, tick_period.tv64 *
-                                      delta_jiffies);
+               /* Mark expiries */
                ts->idle_expires = expires;

                if (ts->nohz_mode == NOHZ_MODE_HIGHRES) {
@@ -328,6 +334,7 @@ void tick_nohz_stop_sched_tick(void)
                tick_do_update_jiffies64(ktime_get());
                cpu_clear(cpu, nohz_cpu_mask);
        }
+out2:
        raise_softirq_irqoff(TIMER_SOFTIRQ);
 out:
        ts->next_jiffies = next_jiffies;
--
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

Reply via email to