mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2026-01-12 03:51:39 +00:00
The RT team has been searching for a nasty latency. This latency shows
up out of the blue and has been seen to be as big as 5ms!
Using ftrace I found the cause of the latency.
pcscd-2995 3dNh1 52360300us : irq_exit (smp_apic_timer_interrupt)
pcscd-2995 3dN.2 52360301us : idle_cpu (irq_exit)
pcscd-2995 3dN.2 52360301us : rcu_irq_exit (irq_exit)
pcscd-2995 3dN.1 52360771us : smp_apic_timer_interrupt (apic_timer_interrupt
)
pcscd-2995 3dN.1 52360771us : exit_idle (smp_apic_timer_interrupt)
Here's an example of a 400 us latency. pcscd took a timer interrupt and
returned with "need resched" enabled, but did not reschedule until after
the next interrupt came in at 52360771us 400us later!
At first I thought we somehow missed a preemption check in entry.S. But
I also noticed that this always seemed to happen during a __delay call.
pcscd-2995 3dN.2 52360836us : rcu_irq_exit (irq_exit)
pcscd-2995 3.N.. 52361265us : preempt_schedule (__delay)
Looking at the x86 delay, I found my problem.
In git commit
|
||
|---|---|---|
| .. | ||
| checksum_32.S | ||
| clear_page_64.S | ||
| copy_page_64.S | ||
| copy_user_64.S | ||
| copy_user_nocache_64.S | ||
| csum-copy_64.S | ||
| csum-partial_64.c | ||
| csum-wrappers_64.c | ||
| delay_32.c | ||
| delay_64.c | ||
| getuser_32.S | ||
| getuser_64.S | ||
| io_64.c | ||
| iomap_copy_64.S | ||
| Makefile | ||
| memcpy_32.c | ||
| memcpy_64.S | ||
| memmove_64.c | ||
| memset_64.S | ||
| mmx_32.c | ||
| msr-on-cpu.c | ||
| putuser_32.S | ||
| putuser_64.S | ||
| rwlock_64.S | ||
| semaphore_32.S | ||
| string_32.c | ||
| strstr_32.c | ||
| thunk_64.S | ||
| usercopy_32.c | ||
| usercopy_64.c | ||