內核2.6.39.4多個USB插拔時出現oops,死在機器碼49 f2 8b 5d d4 89 f2 <8b> 33 89 75 d4 0f 18 06 90中。 使用文章oops調試的方法,製作了兩個文件:
(gdb) disassemble get_next_timer_interrupt
Dump of assembler code for function get_next_timer_interrupt:
0xc103c738 <get_next_timer_interrupt+0>: push %ebp
0xc103c739 <get_next_timer_interrupt+1>: mov %esp,%ebp
0xc103c73b <get_next_timer_interrupt+3>: push %edi
0xc103c73c <get_next_timer_interrupt+4>: push %esi
0xc103c73d <get_next_timer_interrupt+5>: push %ebx
0xc103c73e <get_next_timer_interrupt+6>: sub $0x2c,%esp
0xc103c741 <get_next_timer_interrupt+9>: mov %eax,-0x20(%ebp)
0xc103c744 <get_next_timer_interrupt+12>: mov %fs:0xc1798d44,%ebx
0xc103c74b <get_next_timer_interrupt+19>: call 0xc11d4410 <debug_smp_processor_id>
0xc103c750 <get_next_timer_interrupt+24>: mov 0xc14d8cac,%edx
0xc103c756 <get_next_timer_interrupt+30>: bt %eax,(%edx)
0xc103c759 <get_next_timer_interrupt+33>: sbb %eax,%eax
0xc103c75b <get_next_timer_interrupt+35>: test %eax,%eax
0xc103c75d <get_next_timer_interrupt+37>: jne 0xc103c76b <get_next_timer_interrupt+51>
0xc103c75f <get_next_timer_interrupt+39>: addl $0x3fffffff,-0x20(%ebp)
0xc103c766 <get_next_timer_interrupt+46>: jmp 0xc103c8fc <get_next_timer_interrupt+452>
0xc103c76b <get_next_timer_interrupt+51>: mov %ebx,%eax
0xc103c76d <get_next_timer_interrupt+53>: call 0xc14ce789 <_raw_spin_lock>
0xc103c772 <get_next_timer_interrupt+58>: mov 0x8(%ebx),%eax
0xc103c775 <get_next_timer_interrupt+61>: cmp 0xc(%ebx),%eax
0xc103c778 <get_next_timer_interrupt+64>: js 0xc103c890 <get_next_timer_interrupt+344>
0xc103c77e <get_next_timer_interrupt+70>: movzbl %al,%ecx
0xc103c781 <get_next_timer_interrupt+73>: mov %ecx,%esi
0xc103c783 <get_next_timer_interrupt+75>: lea 0x10(%ebx,%esi,8),%edi
0xc103c787 <get_next_timer_interrupt+79>: mov 0x10(%ebx,%esi,8),%edx
0xc103c78b <get_next_timer_interrupt+83>: mov %edi,-0x24(%ebp)
0xc103c78e <get_next_timer_interrupt+86>: jmp 0xc103c7b0 <get_next_timer_interrupt+120>
0xc103c790 <get_next_timer_interrupt+88>: testb $0x1,0xc(%edx)
0xc103c794 <get_next_timer_interrupt+92>: je 0xc103c79a <get_next_timer_interrupt+98>
0xc103c796 <get_next_timer_interrupt+94>: mov %edi,%edx
0xc103c798 <get_next_timer_interrupt+96>: jmp 0xc103c7b0 <get_next_timer_interrupt+120>
0xc103c79a <get_next_timer_interrupt+98>: cmp %ecx,%esi
0xc103c79c <get_next_timer_interrupt+100>: mov 0x8(%edx),%edx
0xc103c79f <get_next_timer_interrupt+103>: jl 0xc103c7a9 <get_next_timer_interrupt+113>
0xc103c7a1 <get_next_timer_interrupt+105>: test %ecx,%ecx
0xc103c7a3 <get_next_timer_interrupt+107>: jne 0xc103c88d <get_next_timer_interrupt+341>
0xc103c7a9 <get_next_timer_interrupt+113>: mov $0x1,%edi
0xc103c7ae <get_next_timer_interrupt+118>: jmp 0xc103c7ce <get_next_timer_interrupt+150>
0xc103c7b0 <get_next_timer_interrupt+120>: mov (%edx),%edi
0xc103c7b2 <get_next_timer_interrupt+122>: lea 0x0(%esi,%eiz,1),%esi
0xc103c7b6 <get_next_timer_interrupt+126>: cmp -0x24(%ebp),%edx
0xc103c7b9 <get_next_timer_interrupt+129>: jne 0xc103c790 <get_next_timer_interrupt+88>
0xc103c7bb <get_next_timer_interrupt+131>: inc %esi
0xc103c7bc <get_next_timer_interrupt+132>: and $0xff,%esi
0xc103c7c2 <get_next_timer_interrupt+138>: cmp %ecx,%esi
0xc103c7c4 <get_next_timer_interrupt+140>: jne 0xc103c783 <get_next_timer_interrupt+75>
0xc103c7c6 <get_next_timer_interrupt+142>: lea 0x3fffffff(%eax),%edx
0xc103c7cc <get_next_timer_interrupt+148>: xor %edi,%edi
0xc103c7ce <get_next_timer_interrupt+150>: test %ecx,%ecx
0xc103c7d0 <get_next_timer_interrupt+152>: je 0xc103c7d9 <get_next_timer_interrupt+161>
0xc103c7d2 <get_next_timer_interrupt+154>: add $0x100,%eax
0xc103c7d7 <get_next_timer_interrupt+159>: sub %ecx,%eax
0xc103c7d9 <get_next_timer_interrupt+161>: shr $0x8,%eax
0xc103c7dc <get_next_timer_interrupt+164>: mov %eax,-0x24(%ebp)
0xc103c7df <get_next_timer_interrupt+167>: lea 0x810(%ebx),%eax
0xc103c7e5 <get_next_timer_interrupt+173>: mov %eax,-0x1c(%ebp)
0xc103c7e8 <get_next_timer_interrupt+176>: lea 0xa10(%ebx),%eax
0xc103c7ee <get_next_timer_interrupt+182>: mov %eax,-0x18(%ebp)
0xc103c7f1 <get_next_timer_interrupt+185>: lea 0xc10(%ebx),%eax
0xc103c7f7 <get_next_timer_interrupt+191>: mov %eax,-0x14(%ebp)
0xc103c7fa <get_next_timer_interrupt+194>: lea 0xe10(%ebx),%eax
0xc103c800 <get_next_timer_interrupt+200>: mov %eax,-0x10(%ebp)
0xc103c803 <get_next_timer_interrupt+203>: movl $0x0,-0x28(%ebp)
0xc103c80a <get_next_timer_interrupt+210>: mov %ebx,-0x34(%ebp)
0xc103c80d <get_next_timer_interrupt+213>: mov -0x28(%ebp),%eax
0xc103c810 <get_next_timer_interrupt+216>: mov -0x24(%ebp),%ecx
0xc103c813 <get_next_timer_interrupt+219>: mov -0x1c(%ebp,%eax,4),%eax
0xc103c817 <get_next_timer_interrupt+223>: and $0x3f,%ecx
0xc103c81a <get_next_timer_interrupt+226>: mov %eax,-0x30(%ebp)
0xc103c81d <get_next_timer_interrupt+229>: mov %ecx,%eax
0xc103c81f <get_next_timer_interrupt+231>: mov -0x30(%ebp),%esi
0xc103c822 <get_next_timer_interrupt+234>: mov (%esi,%eax,8),%ebx
0xc103c825 <get_next_timer_interrupt+237>: lea (%esi,%eax,8),%esi
0xc103c828 <get_next_timer_interrupt+240>: mov %esi,-0x38(%ebp)
0xc103c82b <get_next_timer_interrupt+243>: jmp 0xc103c847 <get_next_timer_interrupt+271>
0xc103c82d <get_next_timer_interrupt+245>: testb $0x1,0xc(%ebx)
0xc103c831 <get_next_timer_interrupt+249>: mov %edx,%esi
0xc103c833 <get_next_timer_interrupt+251>: jne 0xc103c842 <get_next_timer_interrupt+266>
0xc103c835 <get_next_timer_interrupt+253>: mov 0x8(%ebx),%esi
0xc103c838 <get_next_timer_interrupt+256>: mov $0x1,%edi
0xc103c83d <get_next_timer_interrupt+261>: cmp %edx,%esi
0xc103c83f <get_next_timer_interrupt+263>: cmovns %edx,%esi
0xc103c842 <get_next_timer_interrupt+266>: mov -0x2c(%ebp),%ebx
0xc103c845 <get_next_timer_interrupt+269>: mov %esi,%edx
0xc103c847 <get_next_timer_interrupt+271>: mov (%ebx),%esi
0xc103c849 <get_next_timer_interrupt+273>: mov %esi,-0x2c(%ebp)
0xc103c84c <get_next_timer_interrupt+276>: lea 0x0(%esi,%eiz,1),%esi
0xc103c850 <get_next_timer_interrupt+280>: cmp -0x38(%ebp),%ebx
0xc103c853 <get_next_timer_interrupt+283>: jne 0xc103c82d <get_next_timer_interrupt+245>
0xc103c855 <get_next_timer_interrupt+285>: test %edi,%edi
0xc103c857 <get_next_timer_interrupt+287>: je 0xc103c868 <get_next_timer_interrupt+304>
0xc103c859 <get_next_timer_interrupt+289>: cmp %ecx,%eax
0xc103c85b <get_next_timer_interrupt+291>: jl 0xc103c861 <get_next_timer_interrupt+297>
0xc103c85d <get_next_timer_interrupt+293>: test %ecx,%ecx
0xc103c85f <get_next_timer_interrupt+295>: jne 0xc103c88a <get_next_timer_interrupt+338>
0xc103c861 <get_next_timer_interrupt+297>: mov $0x1,%edi
0xc103c866 <get_next_timer_interrupt+302>: jmp 0xc103c870 <get_next_timer_interrupt+312>
0xc103c868 <get_next_timer_interrupt+304>: inc %eax
0xc103c869 <get_next_timer_interrupt+305>: and $0x3f,%eax
0xc103c86c <get_next_timer_interrupt+308>: cmp %ecx,%eax
0xc103c86e <get_next_timer_interrupt+310>: jne 0xc103c81f <get_next_timer_interrupt+231>
0xc103c870 <get_next_timer_interrupt+312>: test %ecx,%ecx
0xc103c872 <get_next_timer_interrupt+314>: je 0xc103c87b <get_next_timer_interrupt+323>
0xc103c874 <get_next_timer_interrupt+316>: addl $0x40,-0x24(%ebp)
0xc103c878 <get_next_timer_interrupt+320>: sub %ecx,-0x24(%ebp)
0xc103c87b <get_next_timer_interrupt+323>: incl -0x28(%ebp)
0xc103c87e <get_next_timer_interrupt+326>: cmpl $0x4,-0x28(%ebp)
0xc103c882 <get_next_timer_interrupt+330>: je 0xc103c88a <get_next_timer_interrupt+338>
0xc103c884 <get_next_timer_interrupt+332>: shrl $0x6,-0x24(%ebp)
0xc103c888 <get_next_timer_interrupt+336>: jmp 0xc103c80d <get_next_timer_interrupt+213>
0xc103c88a <get_next_timer_interrupt+338>: mov -0x34(%ebp),%ebx
0xc103c88d <get_next_timer_interrupt+341>: mov %edx,0xc(%ebx)
0xc103c890 <get_next_timer_interrupt+344>: mov 0xc(%ebx),%esi
0xc103c893 <get_next_timer_interrupt+347>: mov %ebx,%eax
0xc103c895 <get_next_timer_interrupt+349>: call 0xc14ce8e2 <_raw_spin_unlock>
0xc103c89a <get_next_timer_interrupt+354>: cmp %esi,-0x20(%ebp)
0xc103c89d <get_next_timer_interrupt+357>: jns 0xc103c8fc <get_next_timer_interrupt+452>
0xc103c89f <get_next_timer_interrupt+359>: call 0xc104b26f <hrtimer_get_next_event>
0xc103c8a4 <get_next_timer_interrupt+364>: cmp $0x7fffffff,%edx
0xc103c8aa <get_next_timer_interrupt+370>: jne 0xc103c8b3 <get_next_timer_interrupt+379>
0xc103c8ac <get_next_timer_interrupt+372>: cmp $0xffffffff,%eax
0xc103c8af <get_next_timer_interrupt+375>: jne 0xc103c8c4 <get_next_timer_interrupt+396>
0xc103c8b1 <get_next_timer_interrupt+377>: jmp 0xc103c8f9 <get_next_timer_interrupt+449>
0xc103c8b3 <get_next_timer_interrupt+379>: cmp $0x0,%edx
0xc103c8b6 <get_next_timer_interrupt+382>: jg 0xc103c8c4 <get_next_timer_interrupt+396>
0xc103c8b8 <get_next_timer_interrupt+384>: jl 0xc103c8bf <get_next_timer_interrupt+391>
0xc103c8ba <get_next_timer_interrupt+386>: cmp $0x0,%eax
0xc103c8bd <get_next_timer_interrupt+389>: ja 0xc103c8c4 <get_next_timer_interrupt+396>
0xc103c8bf <get_next_timer_interrupt+391>: incl -0x20(%ebp)
0xc103c8c2 <get_next_timer_interrupt+394>: jmp 0xc103c8fc <get_next_timer_interrupt+452>
0xc103c8c4 <get_next_timer_interrupt+396>: call 0xc10359c4 <ns_to_timespec>
0xc103c8c9 <get_next_timer_interrupt+401>: mov %eax,-0x1c(%ebp)
0xc103c8cc <get_next_timer_interrupt+404>: lea -0x1c(%ebp),%eax
0xc103c8cf <get_next_timer_interrupt+407>: mov %edx,-0x18(%ebp)
0xc103c8d2 <get_next_timer_interrupt+410>: call 0xc10357b9 <timespec_to_jiffies>
0xc103c8d7 <get_next_timer_interrupt+415>: cmp $0x3fffffff,%eax
0xc103c8dc <get_next_timer_interrupt+420>: jbe 0xc103c8e5 <get_next_timer_interrupt+429>
0xc103c8de <get_next_timer_interrupt+422>: mov $0x3fffffff,%eax
0xc103c8e3 <get_next_timer_interrupt+427>: jmp 0xc103c8ef <get_next_timer_interrupt+439>
0xc103c8e5 <get_next_timer_interrupt+429>: test %eax,%eax
0xc103c8e7 <get_next_timer_interrupt+431>: mov $0x1,%edx
0xc103c8ec <get_next_timer_interrupt+436>: cmove %edx,%eax
0xc103c8ef <get_next_timer_interrupt+439>: add -0x20(%ebp),%eax
0xc103c8f2 <get_next_timer_interrupt+442>: cmp %esi,%eax
0xc103c8f4 <get_next_timer_interrupt+444>: mov %eax,-0x20(%ebp)
0xc103c8f7 <get_next_timer_interrupt+447>: js 0xc103c8fc <get_next_timer_interrupt+452>
0xc103c8f9 <get_next_timer_interrupt+449>: mov %esi,-0x20(%ebp)
0xc103c8fc <get_next_timer_interrupt+452>: mov -0x20(%ebp),%eax
0xc103c8ff <get_next_timer_interrupt+455>: add $0x2c,%esp
0xc103c902 <get_next_timer_interrupt+458>: pop %ebx
0xc103c903 <get_next_timer_interrupt+459>: pop %esi
0xc103c904 <get_next_timer_interrupt+460>: pop %edi
0xc103c905 <get_next_timer_interrupt+461>: pop %ebp
0xc103c906 <get_next_timer_interrupt+462>: ret
End of assembler dump.
(gdb)
kernel/timer.o: file format elf32-i386
Disassembly of section .text:
c103ab38 <round_jiffies_common>:
tbase_get_deferrable(timer->base));
}
static unsigned long round_jiffies_common(unsigned long j, int cpu,
bool force_up)
{
c103ab38: 55 push %ebp
unsigned long action, void *hcpu)
{
long cpu = (long)hcpu;
int err;
switch(action) {
c103ab39: 89 e5 mov %esp,%ebp
* It's not worth to care about 3dnow prefetches for the K6
* because they are microcoded there and very slow.
*/
static inline void prefetch(const void *x)
{
alternative_input(BASE_PREFETCH,
c103ab3b: 57 push %edi
* The skew is done by adding 3*cpunr, then round, then subtract this
* extra offset again.
*/
j += cpu * 3;
rem = j % HZ;
c103ab3c: bf e8 03 00 00 mov $0x3e8,%edi
tbase_get_deferrable(timer->base));
}
static unsigned long round_jiffies_common(unsigned long j, int cpu,
bool force_up)
{
c103ab41: 56 push %esi
signed long __sched schedule_timeout(signed long timeout)
{
struct timer_list timer;
unsigned long expire;
switch (timeout)
c103ab42: 89 c6 mov %eax,%esi
unsigned long action, void *hcpu)
{
long cpu = (long)hcpu;
int err;
switch(action) {
c103ab44: 53 push %ebx
c103ab45: 89 d3 mov %edx,%ebx
c103ab47: 83 ec 04 sub $0x4,%esp
tbase_get_deferrable(timer->base));
}
static unsigned long round_jiffies_common(unsigned long j, int cpu,
bool force_up)
{
c103ab4a: 88 4d f3 mov %cl,-0xd(%ebp)
* 3 jiffies. This 3 jiffies came originally from the mm/ code which
* already did this.
* The skew is done by adding 3*cpunr, then round, then subtract this
* extra offset again.
*/
j += cpu * 3;
c103ab4d: 8d 0c 52 lea (%edx,%edx,2),%ecx
rem = j % HZ;
c103ab50: 31 d2 xor %edx,%edx
* 3 jiffies. This 3 jiffies came originally from the mm/ code which
* already did this.
* The skew is done by adding 3*cpunr, then round, then subtract this
* extra offset again.
*/
j += cpu * 3;
c103ab52: 01 c1 add %eax,%ecx
rem = j % HZ;
c103ab54: 89 c8 mov %ecx,%eax
c103ab56: f7 f7 div %edi
* due to delays of the timer irq, long irq off times etc etc) then
* we should round down to the whole second, not up. Use 1/4th second
* as cutoff for this rounding as an extreme upper bound for this.
* But never round down if @force_up is set.
*/
if (rem < HZ/4 && !force_up) /* round down */
c103ab58: 81 fa f9 00 00 00 cmp $0xf9,%edx
int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE,
(void *)(long)smp_processor_id());
init_timer_stats();
BUG_ON(err != NOTIFY_OK);
c103ab5e: 7f 06 jg c103ab66 <round_jiffies_common+0x2e>
register_cpu_notifier(&timers_nb);
c103ab60: 80 7d f3 00 cmpb $0x0,-0xd(%ebp)
DECLARE_PER_CPU(struct task_struct *, current_task);
static __always_inline struct task_struct *get_current(void)
{
return percpu_read_stable(current_task);
c103ab64: 74 06 je c103ab6c <round_jiffies_common+0x34>
* But never round down if @force_up is set.
*/
if (rem < HZ/4 && !force_up) /* round down */
j = j - rem;
else /* round up */
j = j - rem + HZ;
c103ab66: 81 c1 e8 03 00 00 add $0x3e8,%ecx
/* now that we have rounded, subtract the extra skew again */
j -= cpu * 3;
c103ab6c: 6b db fd imul $0xfffffffd,%ebx,%ebx
if (j <= jiffies) /* rounding ate our timeout entirely; */
c103ab6f: a1 00 00 00 00 mov 0x0,%eax
* But never round down if @force_up is set.
*/
if (rem < HZ/4 && !force_up) /* round down */
j = j - rem;
else /* round up */
j = j - rem + HZ;
c103ab74: 29 d1 sub %edx,%ecx
j -= cpu * 3;
if (j <= jiffies) /* rounding ate our timeout entirely; */
return original;
return j;
}
c103ab76: 5a pop %edx
j = j - rem;
else /* round up */
j = j - rem + HZ;
/* now that we have rounded, subtract the extra skew again */
j -= cpu * 3;
c103ab77: 01 d9 add %ebx,%ecx
if (j <= jiffies) /* rounding ate our timeout entirely; */
c103ab79: 39 c1 cmp %eax,%ecx
c103ab7b: 89 c8 mov %ecx,%eax
c103ab7d: 0f 46 c6 cmovbe %esi,%eax
return original;
return j;
}
c103ab80: 5b pop %ebx
c103ab81: 5e pop %esi
c103ab82: 5f pop %edi
c103ab83: 5d pop %ebp
return kmalloc_large(size, flags);
if (!(flags & SLUB_DMA)) {
struct kmem_cache *s = kmalloc_slab(size);
if (!s)
c103ab84: c3 ret
c103ab85 <__round_jiffies>:
* to lock contention or spurious cache line bouncing.
*
* The return value is the rounded version of the @j parameter.
*/
unsigned long __round_jiffies(unsigned long j, int cpu)
{
c103ab85: 55 push %ebp
return round_jiffies_common(j, cpu, false);
c103ab86: 31 c9 xor %ecx,%ecx
* to lock contention or spurious cache line bouncing.
*
* The return value is the rounded version of the @j parameter.
*/
unsigned long __round_jiffies(unsigned long j, int cpu)
{
c103ab88: 89 e5 mov %esp,%ebp
return round_jiffies_common(j, cpu, false);
c103ab8a: e8 a9 ff ff ff call c103ab38 <round_jiffies_common>
}
c103ab8f: 5d pop %ebp
c103ab90: c3 ret
c103ab91 <__round_jiffies_relative>:
* to lock contention or spurious cache line bouncing.
*
* The return value is the rounded version of the @j parameter.
*/
unsigned long __round_jiffies_relative(unsigned long j, int cpu)
{
c103ab91: 55 push %ebp
unsigned long j0 = jiffies;
/* Use j0 because jiffies might change while we run */
return round_jiffies_common(j + j0, cpu, false) - j0;
c103ab92: 31 c9 xor %ecx,%ecx
* to lock contention or spurious cache line bouncing.
*
* The return value is the rounded version of the @j parameter.
*/
unsigned long __round_jiffies_relative(unsigned long j, int cpu)
{
c103ab94: 89 e5 mov %esp,%ebp
c103ab96: 53 push %ebx
unsigned long j0 = jiffies;
c103ab97: 8b 1d 00 00 00 00 mov 0x0,%ebx
/* Use j0 because jiffies might change while we run */
return round_jiffies_common(j + j0, cpu, false) - j0;
c103ab9d: 01 d8 add %ebx,%eax
* The APs use this path later in boot
*/
base = kmalloc_node(sizeof(*base),
GFP_KERNEL | __GFP_ZERO,
cpu_to_node(cpu));
if (!base)
c103ab9f: e8 94 ff ff ff call c103ab38 <round_jiffies_common>
c103aba4: 29 d8 sub %ebx,%eax
{
unsigned long j0 = jiffies;
/* Use j0 because jiffies might change while we run */
return round_jiffies_common(j + j0, cpu, false) - j0;
}
c103aba6: 5b pop %ebx
c103aba7: 5d pop %ebp
c103aba8: c3 ret
c103aba9 <round_jiffies>:
* of this is to have the CPU wake up less, which saves power.
*
* The return value is the rounded version of the @j parameter.
*/
unsigned long round_jiffies(unsigned long j)
{
c103aba9: 55 push %ebp
return round_jiffies_common(j, raw_smp_processor_id(), false);
c103abaa: 31 c9 xor %ecx,%ecx
* of this is to have the CPU wake up less, which saves power.
*
* The return value is the rounded version of the @j parameter.
*/
unsigned long round_jiffies(unsigned long j)
{
c103abac: 89 e5 mov %esp,%ebp
return round_jiffies_common(j, raw_smp_processor_id(), false);
c103abae: 64 8b 15 00 00 00 00 mov %fs:0x0,%edx
if (!base)
return -ENOMEM;
/* Make sure that tvec_base is 2 byte aligned */
if (tbase_get_deferrable(base)) {
WARN_ON(1);
c103abb5: e8 7e ff ff ff call c103ab38 <round_jiffies_common>
* The return value is the rounded version of the @j parameter.
*/
unsigned long round_jiffies(unsigned long j)
{
return round_jiffies_common(j, raw_smp_processor_id(), false);
}
c103abba: 5d pop %ebp
c103abbb: c3 ret
c103abbc <round_jiffies_relative>:
* of this is to have the CPU wake up less, which saves power.
*
* The return value is the rounded version of the @j parameter.
*/
unsigned long round_jiffies_relative(unsigned long j)
{
c103abbc: 55 push %ebp
c103abbd: 89 e5 mov %esp,%ebp
return __round_jiffies_relative(j, raw_smp_processor_id());
c103abbf: 64 8b 15 00 00 00 00 mov %fs:0x0,%edx
return -ENOMEM;
/* Make sure that tvec_base is 2 byte aligned */
if (tbase_get_deferrable(base)) {
WARN_ON(1);
kfree(base);
c103abc6: e8 fc ff ff ff call c103abc7 <round_jiffies_relative+0xb>
* The return value is the rounded version of the @j parameter.
*/
unsigned long round_jiffies_relative(unsigned long j)
{
return __round_jiffies_relative(j, raw_smp_processor_id());
}
c103abcb: 5d pop %ebp
c103abcc: c3 ret
c103abcd <__round_jiffies_up>:
* round down. This is useful for timeouts for which the exact time
* of firing does not matter too much, as long as they don't fire too
* early.
*/
unsigned long __round_jiffies_up(unsigned long j, int cpu)
{
c103abcd: 55 push %ebp
return round_jiffies_common(j, cpu, true);
c103abce: b9 01 00 00 00 mov $0x1,%ecx
* round down. This is useful for timeouts for which the exact time
* of firing does not matter too much, as long as they don't fire too
* early.
*/
unsigned long __round_jiffies_up(unsigned long j, int cpu)
{
c103abd3: 89 e5 mov %esp,%ebp
return round_jiffies_common(j, cpu, true);
c103abd5: e8 5e ff ff ff call c103ab38 <round_jiffies_common>
}
c103abda: 5d pop %ebp
c103abdb: c3 ret
c103abdc <__round_jiffies_up_relative>:
* round down. This is useful for timeouts for which the exact time
* of firing does not matter too much, as long as they don't fire too
* early.
*/
unsigned long __round_jiffies_up_relative(unsigned long j, int cpu)
{
c103abdc: 55 push %ebp
unsigned long j0 = jiffies;
/* Use j0 because jiffies might change while we run */
return round_jiffies_common(j + j0, cpu, true) - j0;
c103abdd: b9 01 00 00 00 mov $0x1,%ecx
* round down. This is useful for timeouts for which the exact time
* of firing does not matter too much, as long as they don't fire too
* early.
*/
unsigned long __round_jiffies_up_relative(unsigned long j, int cpu)
{
c103abe2: 89 e5 mov %esp,%ebp
c103abe4: 53 push %ebx
unsigned long j0 = jiffies;
c103abe5: 8b 1d 00 00 00 00 mov 0x0,%ebx
/* Use j0 because jiffies might change while we run */
return round_jiffies_common(j + j0, cpu, true) - j0;
c103abeb: 01 d8 add %ebx,%eax
c103abed: e8 46 ff ff ff call c103ab38 <round_jiffies_common>
* initialised either.
*/
boot_done = 1;
base = &boot_tvec_bases;
}
tvec_base_done[cpu] = 1;
c103abf2: 29 d8 sub %ebx,%eax
{
unsigned long j0 = jiffies;
/* Use j0 because jiffies might change while we run */
return round_jiffies_common(j + j0, cpu, true) - j0;
}
c103abf4: 5b pop %ebx
c103abf5: 5d pop %ebp
/*
* We can use __set_current_state() here because schedule_timeout() calls
* schedule() unconditionally.
*/
signed long __sched schedule_timeout_interruptible(signed long timeout)
{
c103abf6: c3 ret
c103abf7 <round_jiffies_up>:
* round down. This is useful for timeouts for which the exact time
* of firing does not matter too much, as long as they don't fire too
* early.
*/
unsigned long round_jiffies_up(unsigned long j)
{
c103abf7: 55 push %ebp
return round_jiffies_common(j, raw_smp_processor_id(), true);
c103abf8: b9 01 00 00 00 mov $0x1,%ecx
* round down. This is useful for timeouts for which the exact time
* of firing does not matter too much, as long as they don't fire too
* early.
*/
unsigned long round_jiffies_up(unsigned long j)
{
c103abfd: 89 e5 mov %esp,%ebp
return round_jiffies_common(j, raw_smp_processor_id(), true);
c103abff: 64 8b 15 00 00 00 00 mov %fs:0x0,%edx
* schedule() unconditionally.
*/
signed long __sched schedule_timeout_interruptible(signed long timeout)
{
__set_current_state(TASK_INTERRUPTIBLE);
return schedule_timeout(timeout);
c103ac06: e8 2d ff ff ff call c103ab38 <round_jiffies_common>
* early.
*/
unsigned long round_jiffies_up(unsigned long j)
{
return round_jiffies_common(j, raw_smp_processor_id(), true);
}
c103ac0b: 5d pop %ebp
c103ac0c: c3 ret
c103ac0d <round_jiffies_up_relative>:
* round down. This is useful for timeouts for which the exact time
* of firing does not matter too much, as long as they don't fire too
* early.
*/
unsigned long round_jiffies_up_relative(unsigned long j)
{
c103ac0d: 55 push %ebp
c103ac0e: 89 e5 mov %esp,%ebp
return __round_jiffies_up_relative(j, raw_smp_processor_id());
c103ac10: 64 8b 15 00 00 00 00 mov %fs:0x0,%edx
}
spin_lock_init(&base->lock);
for (j = 0; j < TVN_SIZE; j++) {
INIT_LIST_HEAD(base->tv5.vec + j);
c103ac17: e8 fc ff ff ff call c103ac18 <round_jiffies_up_relative+0xb>
* early.
*/
unsigned long round_jiffies_up_relative(unsigned long j)
{
return __round_jiffies_up_relative(j, raw_smp_processor_id());
}
c103ac1c: 5d pop %ebp
c103ac1d: c3 ret
c103ac1e <set_timer_slack>:
*
* By setting the slack to -1, a percentage of the delay is used
* instead.
*/
void set_timer_slack(struct timer_list *timer, int slack_hz)
{
c103ac1e: 55 push %ebp
c103ac1f: 89 e5 mov %esp,%ebp
timer->slack = slack_hz;
c103ac21: 89 50 18 mov %edx,0x18(%eax)
}
c103ac24: 5d pop %ebp
c103ac25: c3 ret
c103ac26 <internal_add_timer>:
EXPORT_SYMBOL_GPL(set_timer_slack);
static void internal_add_timer(struct tvec_base *base, struct timer_list *timer)
{
c103ac26: 55 push %ebp
unsigned long expires = timer->expires;
c103ac27: 8b 4a 08 mov 0x8(%edx),%ecx
timer->slack = slack_hz;
}
EXPORT_SYMBOL_GPL(set_timer_slack);
static void internal_add_timer(struct tvec_base *base, struct timer_list *timer)
{
c103ac2a: 89 e5 mov %esp,%ebp
c103ac2c: 56 push %esi
c103ac2d: 53 push %ebx
unsigned long expires = timer->expires;
unsigned long idx = expires - base->timer_jiffies;
c103ac2e: 8b 70 08 mov 0x8(%eax),%esi
c103ac31: 89 cb mov %ecx,%ebx
c103ac33: 29 f3 sub %esi,%ebx
struct list_head *vec;
if (idx < TVR_SIZE) {
c103ac35: 81 fb ff 00 00 00 cmp $0xff,%ebx
c103ac3b: 77 0c ja c103ac49 <internal_add_timer+0x23>
int i = expires & TVR_MASK;
vec = base->tv1.vec + i;
c103ac3d: 81 e1 ff 00 00 00 and $0xff,%ecx
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
c103ac43: 8d 44 c8 10 lea 0x10(%eax,%ecx,8),%eax
c103ac47: eb 5f jmp c103aca8 <internal_add_timer+0x82>
} else if (idx < 1 << (TVR_BITS + TVN_BITS)) {
c103ac49: 81 fb ff 3f 00 00 cmp $0x3fff,%ebx
list->prev = list;
c103ac4f: 77 0f ja c103ac60 <internal_add_timer+0x3a>
int i = (expires >> TVR_BITS) & TVN_MASK;
vec = base->tv2.vec + i;
c103ac51: c1 e9 08 shr $0x8,%ecx
c103ac54: 83 e1 3f and $0x3f,%ecx
c103ac57: 8d 84 c8 10 08 00 00 lea 0x810(%eax,%ecx,8),%eax
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
c103ac5e: eb 48 jmp c103aca8 <internal_add_timer+0x82>
} else if (idx < 1 << (TVR_BITS + 2 * TVN_BITS)) {
c103ac60: 81 fb ff ff 0f 00 cmp $0xfffff,%ebx
base = per_cpu(tvec_bases, cpu);
}
spin_lock_init(&base->lock);
for (j = 0; j < TVN_SIZE; j++) {
c103ac66: 77 0f ja c103ac77 <internal_add_timer+0x51>
} else if (idx < 1 << (TVR_BITS + TVN_BITS)) {
int i = (expires >> TVR_BITS) & TVN_MASK;
vec = base->tv2.vec + i;
} else if (idx < 1 << (TVR_BITS + 2 * TVN_BITS)) {
int i = (expires >> (TVR_BITS + TVN_BITS)) & TVN_MASK;
vec = base->tv3.vec + i;
c103ac68: c1 e9 0e shr $0xe,%ecx
c103ac6b: 83 e1 3f and $0x3f,%ecx
INIT_LIST_HEAD(base->tv4.vec + j);
INIT_LIST_HEAD(base->tv3.vec + j);
INIT_LIST_HEAD(base->tv2.vec + j);
}
for (j = 0; j < TVR_SIZE; j++)
INIT_LIST_HEAD(base->tv1.vec + j);
c103ac6e: 8d 84 c8 10 0a 00 00 lea 0xa10(%eax,%ecx,8),%eax
c103ac75: eb 31 jmp c103aca8 <internal_add_timer+0x82>
int i = (expires >> TVR_BITS) & TVN_MASK;
vec = base->tv2.vec + i;
} else if (idx < 1 << (TVR_BITS + 2 * TVN_BITS)) {
int i = (expires >> (TVR_BITS + TVN_BITS)) & TVN_MASK;
vec = base->tv3.vec + i;
} else if (idx < 1 << (TVR_BITS + 3 * TVN_BITS)) {
c103ac77: 81 fb ff ff ff 03 cmp $0x3ffffff,%ebx
INIT_LIST_HEAD(base->tv5.vec + j);
INIT_LIST_HEAD(base->tv4.vec + j);
INIT_LIST_HEAD(base->tv3.vec + j);
INIT_LIST_HEAD(base->tv2.vec + j);
}
for (j = 0; j < TVR_SIZE; j++)
c103ac7d: 77 0f ja c103ac8e <internal_add_timer+0x68>
} else if (idx < 1 << (TVR_BITS + 2 * TVN_BITS)) {
int i = (expires >> (TVR_BITS + TVN_BITS)) & TVN_MASK;
vec = base->tv3.vec + i;
} else if (idx < 1 << (TVR_BITS + 3 * TVN_BITS)) {
int i = (expires >> (TVR_BITS + 2 * TVN_BITS)) & TVN_MASK;
vec = base->tv4.vec + i;
c103ac7f: c1 e9 14 shr $0x14,%ecx
INIT_LIST_HEAD(base->tv2.vec + j);
}
for (j = 0; j < TVR_SIZE; j++)
INIT_LIST_HEAD(base->tv1.vec + j);
base->timer_jiffies = jiffies;
c103ac82: 83 e1 3f and $0x3f,%ecx
c103ac85: 8d 84 c8 10 0c 00 00 lea 0xc10(%eax,%ecx,8),%eax
base->next_timer = base->timer_jiffies;
c103ac8c: eb 1a jmp c103aca8 <internal_add_timer+0x82>
int i = (expires >> (TVR_BITS + TVN_BITS)) & TVN_MASK;
vec = base->tv3.vec + i;
} else if (idx < 1 << (TVR_BITS + 3 * TVN_BITS)) {
int i = (expires >> (TVR_BITS + 2 * TVN_BITS)) & TVN_MASK;
vec = base->tv4.vec + i;
} else if ((signed long) idx < 0) {
c103ac8e: 85 db test %ebx,%ebx
c103ac90: 79 0c jns c103ac9e <internal_add_timer+0x78>
/*
* Can happen if you add a timer with expires == jiffies,
* or you set a timer to go off in the past
*/
vec = base->tv1.vec + (base->timer_jiffies & TVR_MASK);
c103ac92: 81 e6 ff 00 00 00 and $0xff,%esi
c103ac98: 8d 44 f0 10 lea 0x10(%eax,%esi,8),%eax
{
struct tvec_base *old_base;
struct tvec_base *new_base;
int i;
BUG_ON(cpu_online(cpu));
c103ac9c: eb 0a jmp c103aca8 <internal_add_timer+0x82>
if (idx > 0xffffffffUL) {
idx = 0xffffffffUL;
expires = idx + base->timer_jiffies;
}
i = (expires >> (TVR_BITS + 3 * TVN_BITS)) & TVN_MASK;
vec = base->tv5.vec + i;
c103ac9e: c1 e9 1a shr $0x1a,%ecx
c103aca1: 8d 84 c8 10 0e 00 00 lea 0xe10(%eax,%ecx,8),%eax
* Insert a new entry before the specified head.
* This is useful for implementing queues.
*/
static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head->prev, head);
c103aca8: 8b 48 04 mov 0x4(%eax),%ecx
#ifndef CONFIG_DEBUG_LIST
static inline void __list_add(struct list_head *new,
struct list_head *prev,
struct list_head *next)
{
next->prev = new;
c103acab: 89 50 04 mov %edx,0x4(%eax)
new->next = next;
c103acae: 89 02 mov %eax,(%edx)
new->prev = prev;
c103acb0: 89 4a 04 mov %ecx,0x4(%edx)
prev->next = new;
c103acb3: 89 11 mov %edx,(%ecx)
}
/*
* Timers are FIFO:
*/
list_add_tail(&timer->entry, vec);
}
c103acb5: 5b pop %ebx
c103acb6: 5e pop %esi
c103acb7: 5d pop %ebp
c103acb8: c3 ret
c103acb9 <sys_getuid>:
return pid;
}
SYSCALL_DEFINE0(getuid)
{
c103acb9: 55 push %ebp
c103acba: 64 a1 00 00 00 00 mov %fs:0x0,%eax
c103acc0: 8b 80 d4 02 00 00 mov 0x2d4(%eax),%eax
c103acc6: 89 e5 mov %esp,%ebp
/* Only we change this so SMP safe */
return current_uid();
}
c103acc8: 5d pop %ebp
c103acc9: 8b 40 04 mov 0x4(%eax),%eax
c103accc: c3 ret
c103accd <sys_geteuid>:
SYSCALL_DEFINE0(geteuid)
{
c103accd: 55 push %ebp
c103acce: 64 a1 00 00 00 00 mov %fs:0x0,%eax
c103acd4: 8b 80 d4 02 00 00 mov 0x2d4(%eax),%eax
c103acda: 89 e5 mov %esp,%ebp
/* Only we change this so SMP safe */
return current_euid();
}
c103acdc: 5d pop %ebp
c103acdd: 8b 40 14 mov 0x14(%eax),%eax
c103ace0: c3 ret
c103ace1 <sys_getgid>:
SYSCALL_DEFINE0(getgid)
{
c103ace1: 55 push %ebp
c103ace2: 64 a1 00 00 00 00 mov %fs:0x0,%eax
spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING);
BUG_ON(old_base->running_timer);
for (i = 0; i < TVR_SIZE; i++)
migrate_timer_list(new_base, old_base->tv1.vec + i);
c103ace8: 8b 80 d4 02 00 00 mov 0x2d4(%eax),%eax
/* Only we change this so SMP safe */
return current_euid();
}
SYSCALL_DEFINE0(getgid)
{
c103acee: 89 e5 mov %esp,%ebp
/* Only we change this so SMP safe */
return current_gid();
}
c103acf0: 5d pop %ebp
c103acf1: 8b 40 08 mov 0x8(%eax),%eax
c103acf4: c3 ret
c103acf5 <sys_getegid>:
SYSCALL_DEFINE0(getegid)
{
c103acf5: 55 push %ebp
c103acf6: 64 a1 00 00 00 00 mov %fs:0x0,%eax
c103acfc: 8b 80 d4 02 00 00 mov 0x2d4(%eax),%eax
c103ad02: 89 e5 mov %esp,%ebp
/* Only we change this so SMP safe */
return current_egid();
}
c103ad04: 5d pop %ebp
c103ad05: 8b 40 18 mov 0x18(%eax),%eax
c103ad08: c3 ret
c103ad09 <cascade>:
}
EXPORT_SYMBOL(del_timer_sync);
#endif
static int cascade(struct tvec_base *base, struct tvec *tv, int index)
{
c103ad09: 55 push %ebp
c103ad0a: 89 e5 mov %esp,%ebp
for (i = 0; i < TVR_SIZE; i++)
migrate_timer_list(new_base, old_base->tv1.vec + i);
for (i = 0; i < TVN_SIZE; i++) {
migrate_timer_list(new_base, old_base->tv2.vec + i);
migrate_timer_list(new_base, old_base->tv3.vec + i);
c103ad0c: 57 push %edi
c103ad0d: 89 c7 mov %eax,%edi
c103ad0f: 56 push %esi
c103ad10: 53 push %ebx
c103ad11: 89 cb mov %ecx,%ebx
c103ad13: 83 ec 0c sub $0xc,%esp
* If @old was empty, it will be overwritten.
*/
static inline void list_replace(struct list_head *old,
struct list_head *new)
{
new->next = old->next;
c103ad16: 8b 34 da mov (%edx,%ebx,8),%esi
new->next->prev = new;
c103ad19: 8d 45 ec lea -0x14(%ebp),%eax
{
/* cascade all the timers from tv up one level */
struct timer_list *timer, *tmp;
struct list_head tv_list;
list_replace_init(tv->vec + index, &tv_list);
c103ad1c: 8d 0c ca lea (%edx,%ecx,8),%ecx
* If @old was empty, it will be overwritten.
*/
static inline void list_replace(struct list_head *old,
struct list_head *new)
{
new->next = old->next;
c103ad1f: 89 75 ec mov %esi,-0x14(%ebp)
new->next->prev = new;
c103ad22: 89 46 04 mov %eax,0x4(%esi)
new->prev = old->prev;
c103ad25: 8b 74 da 04 mov 0x4(%edx,%ebx,8),%esi
migrate_timer_list(new_base, old_base->tv1.vec + i);
for (i = 0; i < TVN_SIZE; i++) {
migrate_timer_list(new_base, old_base->tv2.vec + i);
migrate_timer_list(new_base, old_base->tv3.vec + i);
migrate_timer_list(new_base, old_base->tv4.vec + i);
migrate_timer_list(new_base, old_base->tv5.vec + i);
c103ad29: 89 75 f0 mov %esi,-0x10(%ebp)
new->prev->next = new;
c103ad2c: 89 06 mov %eax,(%esi)
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
c103ad2e: 89 0c da mov %ecx,(%edx,%ebx,8)
list->prev = list;
c103ad31: 89 4c da 04 mov %ecx,0x4(%edx,%ebx,8)
/*
* We are removing _all_ timers from the list, so we
* don't have to detach them individually.
*/
list_for_each_entry_safe(timer, tmp, &tv_list, entry) {
c103ad35: 8b 55 ec mov -0x14(%ebp),%edx
BUG_ON(old_base->running_timer);
for (i = 0; i < TVR_SIZE; i++)
migrate_timer_list(new_base, old_base->tv1.vec + i);
for (i = 0; i < TVN_SIZE; i++) {
c103ad38: 8b 32 mov (%edx),%esi
c103ad3a: 89 45 e8 mov %eax,-0x18(%ebp)
raw_spin_lock_irqsave_nested(spinlock_check(lock), flags, subclass); \
} while (0)
static inline void spin_unlock(spinlock_t *lock)
{
raw_spin_unlock(&lock->rlock);
c103ad3d: eb 19 jmp c103ad58 <cascade+0x4f>
/*
* We are removing _all_ timers from the list, so we
* don't have to detach them individually.
*/
list_for_each_entry_safe(timer, tmp, &tv_list, entry) {
BUG_ON(tbase_get_base(timer->base) != base);
c103ad3f: 8b 42 0c mov 0xc(%edx),%eax
raw_spin_unlock_bh(&lock->rlock);
}
static inline void spin_unlock_irq(spinlock_t *lock)
{
raw_spin_unlock_irq(&lock->rlock);
c103ad42: 83 e0 fe and $0xfffffffe,%eax
c103ad45: 39 c7 cmp %eax,%edi
c103ad47: 74 04 je c103ad4d <cascade+0x44>
migrate_timer_list(new_base, old_base->tv5.vec + i);
}
spin_unlock(&old_base->lock);
spin_unlock_irq(&new_base->lock);
put_cpu_var(tvec_bases);
c103ad49: 0f 0b ud2a
c103ad4b: eb fe jmp c103ad4b <cascade+0x42>
* We are removing _all_ timers from the list, so we
* don't have to detach them individually.
*/
list_for_each_entry_safe(timer, tmp, &tv_list, entry) {
BUG_ON(tbase_get_base(timer->base) != base);
internal_add_timer(base, timer);
c103ad4d: 89 f8 mov %edi,%eax
c103ad4f: e8 d2 fe ff ff call c103ac26 <internal_add_timer>
/*
* We are removing _all_ timers from the list, so we
* don't have to detach them individually.
*/
list_for_each_entry_safe(timer, tmp, &tv_list, entry) {
c103ad54: 89 f2 mov %esi,%edx
c103ad56: 8b 36 mov (%esi),%esi
c103ad58: 3b 55 e8 cmp -0x18(%ebp),%edx
}
static __always_inline int constant_test_bit(unsigned int nr, const volatile unsigned long *addr)
{
return ((1UL << (nr % BITS_PER_LONG)) &
(addr[nr / BITS_PER_LONG])) != 0;
c103ad5b: 75 e2 jne c103ad3f <cascade+0x36>
BUG_ON(tbase_get_base(timer->base) != base);
internal_add_timer(base, timer);
}
return index;
}
c103ad5d: 83 c4 0c add $0xc,%esp
c103ad60: 89 d8 mov %ebx,%eax
c103ad62: 5b pop %ebx
c103ad63: 5e pop %esi
c103ad64: 5f pop %edi
c103ad65: 5d pop %ebp
c103ad66: c3 ret
c103ad67 <ftrace_raw_output_timer_start>:
/**
* timer_start - called when the timer is started
* @timer: pointer to struct timer_list
* @expires: the timers expiry time
*/
TRACE_EVENT(timer_start,
c103ad67: 55 push %ebp
c103ad68: 83 e9 14 sub $0x14,%ecx
#endif
default:
break;
}
return NOTIFY_OK;
}
c103ad6b: 89 e5 mov %esp,%ebp
c103ad6d: 56 push %esi
c103ad6e: 53 push %ebx
c103ad6f: 8b 98 60 20 00 00 mov 0x2060(%eax),%ebx
c103ad75: 0f b7 13 movzwl (%ebx),%edx
c103ad78: 3b 51 24 cmp 0x24(%ecx),%edx
c103ad7b: 74 2f je c103adac <ftrace_raw_output_timer_start+0x45>
c103ad7d: 80 3d 40 10 00 00 01 cmpb $0x1,0x1040
c103ad84: b8 02 00 00 00 mov $0x2,%eax
c103ad89: 0f 84 80 00 00 00 je c103ae0f <ftrace_raw_output_timer_start+0xa8>
c103ad8f: b8 0f 00 00 00 mov $0xf,%eax
c103ad94: ba 43 00 00 00 mov $0x43,%edx
c103ad99: e8 fc ff ff ff call c103ad9a <ftrace_raw_output_timer_start+0x33>
c103ad9e: b8 02 00 00 00 mov $0x2,%eax
c103ada3: c6 05 40 10 00 00 01 movb $0x1,0x1040
c103adaa: eb 63 jmp c103ae0f <ftrace_raw_output_timer_start+0xa8>
};
static inline void
trace_seq_init(struct trace_seq *s)
{
s->len = 0;
c103adac: c7 80 48 10 00 00 00 movl $0x0,0x1048(%eax)
c103adb3: 00 00 00
c103adb6: 8d b0 54 10 00 00 lea 0x1054(%eax),%esi
s->readpos = 0;
c103adbc: c7 80 4c 10 00 00 00 movl $0x0,0x104c(%eax)
c103adc3: 00 00 00
s->full = 0;
c103adc6: c7 80 50 10 00 00 00 movl $0x0,0x1050(%eax)
c103adcd: 00 00 00
c103add0: ff 71 0c pushl 0xc(%ecx)
c103add3: 68 2c 00 00 00 push $0x2c
c103add8: 56 push %esi
c103add9: e8 fc ff ff ff call c103adda <ftrace_raw_output_timer_start+0x73>
c103adde: 89 c2 mov %eax,%edx
c103ade0: 83 c4 0c add $0xc,%esp
c103ade3: 31 c0 xor %eax,%eax
c103ade5: 85 d2 test %edx,%edx
c103ade7: 74 26 je c103ae0f <ftrace_raw_output_timer_start+0xa8>
c103ade9: 8b 43 14 mov 0x14(%ebx),%eax
c103adec: 89 c2 mov %eax,%edx
c103adee: 2b 53 18 sub 0x18(%ebx),%edx
c103adf1: 52 push %edx
c103adf2: 50 push %eax
c103adf3: ff 73 10 pushl 0x10(%ebx)
c103adf6: ff 73 0c pushl 0xc(%ebx)
c103adf9: 68 31 00 00 00 push $0x31
c103adfe: 56 push %esi
c103adff: e8 fc ff ff ff call c103ae00 <ftrace_raw_output_timer_start+0x99>
c103ae04: 83 c4 18 add $0x18,%esp
c103ae07: 85 c0 test %eax,%eax
c103ae09: 0f 95 c0 setne %al
c103ae0c: 0f b6 c0 movzbl %al,%eax
c103ae0f: 8d 65 f8 lea -0x8(%ebp),%esp
c103ae12: 5b pop %ebx
c103ae13: 5e pop %esi
c103ae14: 5d pop %ebp
c103ae15: c3 ret
c103ae16 <ftrace_raw_output_timer_expire_entry>:
* timer_expire_entry - called immediately before the timer callback
* @timer: pointer to struct timer_list
*
* Allows to determine the timer latency.
*/
TRACE_EVENT(timer_expire_entry,
c103ae16: 55 push %ebp
c103ae17: 83 e9 14 sub $0x14,%ecx
c103ae1a: 89 e5 mov %esp,%ebp
c103ae1c: 56 push %esi
c103ae1d: 53 push %ebx
c103ae1e: 8b 98 60 20 00 00 mov 0x2060(%eax),%ebx
c103ae24: 0f b7 13 movzwl (%ebx),%edx
c103ae27: 3b 51 24 cmp 0x24(%ecx),%edx
c103ae2a: 74 2b je c103ae57 <ftrace_raw_output_timer_expire_entry+0x41>
c103ae2c: 80 3d 41 10 00 00 01 cmpb $0x1,0x1041
c103ae33: b8 02 00 00 00 mov $0x2,%eax
c103ae38: 74 79 je c103aeb3 <ftrace_raw_output_timer_expire_entry+0x9d>
c103ae3a: b8 0f 00 00 00 mov $0xf,%eax
c103ae3f: ba 5e 00 00 00 mov $0x5e,%edx
c103ae44: e8 fc ff ff ff call c103ae45 <ftrace_raw_output_timer_expire_entry+0x2f>
c103ae49: b8 02 00 00 00 mov $0x2,%eax
c103ae4e: c6 05 41 10 00 00 01 movb $0x1,0x1041
c103ae55: eb 5c jmp c103aeb3 <ftrace_raw_output_timer_expire_entry+0x9d>
};
static inline void
trace_seq_init(struct trace_seq *s)
{
s->len = 0;
c103ae57: c7 80 48 10 00 00 00 movl $0x0,0x1048(%eax)
c103ae5e: 00 00 00
c103ae61: 8d b0 54 10 00 00 lea 0x1054(%eax),%esi
s->readpos = 0;
c103ae67: c7 80 4c 10 00 00 00 movl $0x0,0x104c(%eax)
c103ae6e: 00 00 00
s->full = 0;
c103ae71: c7 80 50 10 00 00 00 movl $0x0,0x1050(%eax)
c103ae78: 00 00 00
c103ae7b: ff 71 0c pushl 0xc(%ecx)
c103ae7e: 68 2c 00 00 00 push $0x2c
c103ae83: 56 push %esi
c103ae84: e8 fc ff ff ff call c103ae85 <ftrace_raw_output_timer_expire_entry+0x6f>
c103ae89: 89 c2 mov %eax,%edx
c103ae8b: 83 c4 0c add $0xc,%esp
c103ae8e: 31 c0 xor %eax,%eax
c103ae90: 85 d2 test %edx,%edx
c103ae92: 74 1f je c103aeb3 <ftrace_raw_output_timer_expire_entry+0x9d>
c103ae94: ff 73 10 pushl 0x10(%ebx)
c103ae97: ff 73 14 pushl 0x14(%ebx)
c103ae9a: ff 73 0c pushl 0xc(%ebx)
c103ae9d: 68 62 00 00 00 push $0x62
c103aea2: 56 push %esi
c103aea3: e8 fc ff ff ff call c103aea4 <ftrace_raw_output_timer_expire_entry+0x8e>
c103aea8: 83 c4 14 add $0x14,%esp
c103aeab: 85 c0 test %eax,%eax
c103aead: 0f 95 c0 setne %al
c103aeb0: 0f b6 c0 movzbl %al,%eax
c103aeb3: 8d 65 f8 lea -0x8(%ebp),%esp
c103aeb6: 5b pop %ebx
c103aeb7: 5e pop %esi
c103aeb8: 5d pop %ebp
c103aeb9: c3 ret
c103aeba <ftrace_raw_output_timer_class>:
#include <linux/tracepoint.h>
#include <linux/hrtimer.h>
#include <linux/timer.h>
DECLARE_EVENT_CLASS(timer_class,
c103aeba: 55 push %ebp
c103aebb: 83 e9 14 sub $0x14,%ecx
c103aebe: 89 e5 mov %esp,%ebp
c103aec0: 56 push %esi
c103aec1: 53 push %ebx
c103aec2: 8b b0 60 20 00 00 mov 0x2060(%eax),%esi
c103aec8: 0f b7 16 movzwl (%esi),%edx
c103aecb: 3b 51 24 cmp 0x24(%ecx),%edx
c103aece: 74 2b je c103aefb <ftrace_raw_output_timer_class+0x41>
c103aed0: 80 3d 42 10 00 00 01 cmpb $0x1,0x1042
c103aed7: b8 02 00 00 00 mov $0x2,%eax
c103aedc: 74 73 je c103af51 <ftrace_raw_output_timer_class+0x97>
c103aede: b8 0f 00 00 00 mov $0xf,%eax
c103aee3: ba 1a 00 00 00 mov $0x1a,%edx
c103aee8: e8 fc ff ff ff call c103aee9 <ftrace_raw_output_timer_class+0x2f>
c103aeed: b8 02 00 00 00 mov $0x2,%eax
c103aef2: c6 05 42 10 00 00 01 movb $0x1,0x1042
c103aef9: eb 56 jmp c103af51 <ftrace_raw_output_timer_class+0x97>
};
static inline void
trace_seq_init(struct trace_seq *s)
{
s->len = 0;
c103aefb: c7 80 48 10 00 00 00 movl $0x0,0x1048(%eax)
c103af02: 00 00 00
c103af05: 8d 98 54 10 00 00 lea 0x1054(%eax),%ebx
s->readpos = 0;
c103af0b: c7 80 4c 10 00 00 00 movl $0x0,0x104c(%eax)
c103af12: 00 00 00
s->full = 0;
c103af15: c7 80 50 10 00 00 00 movl $0x0,0x1050(%eax)
c103af1c: 00 00 00
c103af1f: ff 71 0c pushl 0xc(%ecx)
c103af22: 68 2c 00 00 00 push $0x2c
c103af27: 53 push %ebx
c103af28: e8 fc ff ff ff call c103af29 <ftrace_raw_output_timer_class+0x6f>
c103af2d: 89 c2 mov %eax,%edx
c103af2f: 83 c4 0c add $0xc,%esp
c103af32: 31 c0 xor %eax,%eax
c103af34: 85 d2 test %edx,%edx
c103af36: 74 19 je c103af51 <ftrace_raw_output_timer_class+0x97>
c103af38: ff 76 0c pushl 0xc(%esi)
c103af3b: 68 81 00 00 00 push $0x81
c103af40: 53 push %ebx
c103af41: e8 fc ff ff ff call c103af42 <ftrace_raw_output_timer_class+0x88>
c103af46: 83 c4 0c add $0xc,%esp
c103af49: 85 c0 test %eax,%eax
c103af4b: 0f 95 c0 setne %al
c103af4e: 0f b6 c0 movzbl %al,%eax
c103af51: 8d 65 f8 lea -0x8(%ebp),%esp
c103af54: 5b pop %ebx
c103af55: 5e pop %esi
c103af56: 5d pop %ebp
c103af57: c3 ret
c103af58 <ftrace_raw_output_hrtimer_init>:
* hrtimer_init - called when the hrtimer is initialized
* @timer: pointer to struct hrtimer
* @clockid: the hrtimers clock
* @mode: the hrtimers mode
*/
TRACE_EVENT(hrtimer_init,
c103af58: 55 push %ebp
c103af59: 83 e9 14 sub $0x14,%ecx
c103af5c: 89 e5 mov %esp,%ebp
c103af5e: 56 push %esi
c103af5f: 53 push %ebx
c103af60: 8b 98 60 20 00 00 mov 0x2060(%eax),%ebx
c103af66: 0f b7 13 movzwl (%ebx),%edx
c103af69: 3b 51 24 cmp 0x24(%ecx),%edx
c103af6c: 74 2f je c103af9d <ftrace_raw_output_hrtimer_init+0x45>
c103af6e: 80 3d 43 10 00 00 01 cmpb $0x1,0x1043
c103af75: b8 02 00 00 00 mov $0x2,%eax
c103af7a: 0f 84 97 00 00 00 je c103b017 <ftrace_raw_output_hrtimer_init+0xbf>
c103af80: b8 0f 00 00 00 mov $0xf,%eax
c103af85: ba 9a 00 00 00 mov $0x9a,%edx
c103af8a: e8 fc ff ff ff call c103af8b <ftrace_raw_output_hrtimer_init+0x33>
c103af8f: b8 02 00 00 00 mov $0x2,%eax
c103af94: c6 05 43 10 00 00 01 movb $0x1,0x1043
c103af9b: eb 7a jmp c103b017 <ftrace_raw_output_hrtimer_init+0xbf>
};
static inline void
trace_seq_init(struct trace_seq *s)
{
s->len = 0;
c103af9d: c7 80 48 10 00 00 00 movl $0x0,0x1048(%eax)
c103afa4: 00 00 00
c103afa7: 8d b0 54 10 00 00 lea 0x1054(%eax),%esi
s->readpos = 0;
c103afad: c7 80 4c 10 00 00 00 movl $0x0,0x104c(%eax)
c103afb4: 00 00 00
s->full = 0;
c103afb7: c7 80 50 10 00 00 00 movl $0x0,0x1050(%eax)
c103afbe: 00 00 00
c103afc1: ff 71 0c pushl 0xc(%ecx)
c103afc4: 68 2c 00 00 00 push $0x2c
c103afc9: 56 push %esi
c103afca: e8 fc ff ff ff call c103afcb <ftrace_raw_output_hrtimer_init+0x73>
c103afcf: 89 c2 mov %eax,%edx
c103afd1: 83 c4 0c add $0xc,%esp
c103afd4: 31 c0 xor %eax,%eax
c103afd6: 85 d2 test %edx,%edx
c103afd8: 74 3d je c103b017 <ftrace_raw_output_hrtimer_init+0xbf>
c103afda: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
c103afde: b8 9c 00 00 00 mov $0x9c,%eax
c103afe3: ba 8b 00 00 00 mov $0x8b,%edx
c103afe8: b9 bd 00 00 00 mov $0xbd,%ecx
c103afed: 0f 44 d0 cmove %eax,%edx
c103aff0: b8 ad 00 00 00 mov $0xad,%eax
c103aff5: 83 7b 10 00 cmpl $0x0,0x10(%ebx)
c103aff9: 52 push %edx
c103affa: 0f 44 c1 cmove %ecx,%eax
c103affd: 50 push %eax
c103affe: ff 73 0c pushl 0xc(%ebx)
c103b001: 68 cc 00 00 00 push $0xcc
c103b006: 56 push %esi
c103b007: e8 fc ff ff ff call c103b008 <ftrace_raw_output_hrtimer_init+0xb0>
c103b00c: 83 c4 14 add $0x14,%esp
c103b00f: 85 c0 test %eax,%eax
c103b011: 0f 95 c0 setne %al
c103b014: 0f b6 c0 movzbl %al,%eax
c103b017: 8d 65 f8 lea -0x8(%ebp),%esp
c103b01a: 5b pop %ebx
c103b01b: 5e pop %esi
c103b01c: 5d pop %ebp
c103b01d: c3 ret
c103b01e <ftrace_raw_output_hrtimer_start>:
/**
* hrtimer_start - called when the hrtimer is started
* @timer: pointer to struct hrtimer
*/
TRACE_EVENT(hrtimer_start,
c103b01e: 55 push %ebp
c103b01f: 83 e9 14 sub $0x14,%ecx
c103b022: 89 e5 mov %esp,%ebp
c103b024: 56 push %esi
c103b025: 53 push %ebx
c103b026: 8b 98 60 20 00 00 mov 0x2060(%eax),%ebx
c103b02c: 0f b7 13 movzwl (%ebx),%edx
c103b02f: 3b 51 24 cmp 0x24(%ecx),%edx
c103b032: 74 2f je c103b063 <ftrace_raw_output_hrtimer_start+0x45>
c103b034: 80 3d 44 10 00 00 01 cmpb $0x1,0x1044
c103b03b: b8 02 00 00 00 mov $0x2,%eax
c103b040: 0f 84 82 00 00 00 je c103b0c8 <ftrace_raw_output_hrtimer_start+0xaa>
c103b046: b8 0f 00 00 00 mov $0xf,%eax
c103b04b: ba ba 00 00 00 mov $0xba,%edx
c103b050: e8 fc ff ff ff call c103b051 <ftrace_raw_output_hrtimer_start+0x33>
c103b055: b8 02 00 00 00 mov $0x2,%eax
c103b05a: c6 05 44 10 00 00 01 movb $0x1,0x1044
c103b061: eb 65 jmp c103b0c8 <ftrace_raw_output_hrtimer_start+0xaa>
};
static inline void
trace_seq_init(struct trace_seq *s)
{
s->len = 0;
c103b063: c7 80 48 10 00 00 00 movl $0x0,0x1048(%eax)
c103b06a: 00 00 00
c103b06d: 8d b0 54 10 00 00 lea 0x1054(%eax),%esi
s->readpos = 0;
c103b073: c7 80 4c 10 00 00 00 movl $0x0,0x104c(%eax)
c103b07a: 00 00 00
s->full = 0;
c103b07d: c7 80 50 10 00 00 00 movl $0x0,0x1050(%eax)
c103b084: 00 00 00
c103b087: ff 71 0c pushl 0xc(%ecx)
c103b08a: 68 2c 00 00 00 push $0x2c
c103b08f: 56 push %esi
c103b090: e8 fc ff ff ff call c103b091 <ftrace_raw_output_hrtimer_start+0x73>
c103b095: 89 c2 mov %eax,%edx
c103b097: 83 c4 0c add $0xc,%esp
c103b09a: 31 c0 xor %eax,%eax
c103b09c: 85 d2 test %edx,%edx
c103b09e: 74 28 je c103b0c8 <ftrace_raw_output_hrtimer_start+0xaa>
c103b0a0: ff 73 20 pushl 0x20(%ebx)
c103b0a3: ff 73 1c pushl 0x1c(%ebx)
c103b0a6: ff 73 18 pushl 0x18(%ebx)
c103b0a9: ff 73 14 pushl 0x14(%ebx)
c103b0ac: ff 73 10 pushl 0x10(%ebx)
c103b0af: ff 73 0c pushl 0xc(%ebx)
c103b0b2: 68 eb 00 00 00 push $0xeb
c103b0b7: 56 push %esi
c103b0b8: e8 fc ff ff ff call c103b0b9 <ftrace_raw_output_hrtimer_start+0x9b>
c103b0bd: 83 c4 20 add $0x20,%esp
c103b0c0: 85 c0 test %eax,%eax
c103b0c2: 0f 95 c0 setne %al
c103b0c5: 0f b6 c0 movzbl %al,%eax
c103b0c8: 8d 65 f8 lea -0x8(%ebp),%esp
c103b0cb: 5b pop %ebx
c103b0cc: 5e pop %esi
c103b0cd: 5d pop %ebp
c103b0ce: c3 ret
c103b0cf <ftrace_raw_output_hrtimer_expire_entry>:
* @now: pointer to variable which contains current time of the
* timers base.
*
* Allows to determine the timer latency.
*/
TRACE_EVENT(hrtimer_expire_entry,
c103b0cf: 55 push %ebp
c103b0d0: 83 e9 14 sub $0x14,%ecx
c103b0d3: 89 e5 mov %esp,%ebp
c103b0d5: 56 push %esi
c103b0d6: 53 push %ebx
c103b0d7: 8b 98 60 20 00 00 mov 0x2060(%eax),%ebx
c103b0dd: 0f b7 13 movzwl (%ebx),%edx
c103b0e0: 3b 51 24 cmp 0x24(%ecx),%edx
c103b0e3: 74 2b je c103b110 <ftrace_raw_output_hrtimer_expire_entry+0x41>
c103b0e5: 80 3d 45 10 00 00 01 cmpb $0x1,0x1045
c103b0ec: b8 02 00 00 00 mov $0x2,%eax
c103b0f1: 74 7c je c103b16f <ftrace_raw_output_hrtimer_expire_entry+0xa0>
c103b0f3: b8 0f 00 00 00 mov $0xf,%eax
c103b0f8: ba d8 00 00 00 mov $0xd8,%edx
c103b0fd: e8 fc ff ff ff call c103b0fe <ftrace_raw_output_hrtimer_expire_entry+0x2f>
c103b102: b8 02 00 00 00 mov $0x2,%eax
c103b107: c6 05 45 10 00 00 01 movb $0x1,0x1045
c103b10e: eb 5f jmp c103b16f <ftrace_raw_output_hrtimer_expire_entry+0xa0>
};
static inline void
trace_seq_init(struct trace_seq *s)
{
s->len = 0;
c103b110: c7 80 48 10 00 00 00 movl $0x0,0x1048(%eax)
c103b117: 00 00 00
c103b11a: 8d b0 54 10 00 00 lea 0x1054(%eax),%esi
s->readpos = 0;
c103b120: c7 80 4c 10 00 00 00 movl $0x0,0x104c(%eax)
c103b127: 00 00 00
s->full = 0;
c103b12a: c7 80 50 10 00 00 00 movl $0x0,0x1050(%eax)
c103b131: 00 00 00
c103b134: ff 71 0c pushl 0xc(%ecx)
c103b137: 68 2c 00 00 00 push $0x2c
c103b13c: 56 push %esi
c103b13d: e8 fc ff ff ff call c103b13e <ftrace_raw_output_hrtimer_expire_entry+0x6f>
c103b142: 89 c2 mov %eax,%edx
c103b144: 83 c4 0c add $0xc,%esp
c103b147: 31 c0 xor %eax,%eax
c103b149: 85 d2 test %edx,%edx
c103b14b: 74 22 je c103b16f <ftrace_raw_output_hrtimer_expire_entry+0xa0>
c103b14d: ff 73 14 pushl 0x14(%ebx)
c103b150: ff 73 10 pushl 0x10(%ebx)
c103b153: ff 73 18 pushl 0x18(%ebx)
c103b156: ff 73 0c pushl 0xc(%ebx)
c103b159: 68 22 01 00 00 push $0x122
c103b15e: 56 push %esi
c103b15f: e8 fc ff ff ff call c103b160 <ftrace_raw_output_hrtimer_expire_entry+0x91>
c103b164: 83 c4 18 add $0x18,%esp
c103b167: 85 c0 test %eax,%eax
c103b169: 0f 95 c0 setne %al
c103b16c: 0f b6 c0 movzbl %al,%eax
c103b16f: 8d 65 f8 lea -0x8(%ebp),%esp
c103b172: 5b pop %ebx
c103b173: 5e pop %esi
c103b174: 5d pop %ebp
c103b175: c3 ret
c103b176 <ftrace_raw_output_hrtimer_class>:
TP_printk("hrtimer=%p function=%pf now=%llu", __entry->hrtimer, __entry->function,
(unsigned long long)ktime_to_ns((ktime_t) { .tv64 = __entry->now }))
);
DECLARE_EVENT_CLASS(hrtimer_class,
c103b176: 55 push %ebp
c103b177: 83 e9 14 sub $0x14,%ecx
c103b17a: 89 e5 mov %esp,%ebp
c103b17c: 56 push %esi
c103b17d: 53 push %ebx
c103b17e: 8b b0 60 20 00 00 mov 0x2060(%eax),%esi
c103b184: 0f b7 16 movzwl (%esi),%edx
c103b187: 3b 51 24 cmp 0x24(%ecx),%edx
c103b18a: 74 2b je c103b1b7 <ftrace_raw_output_hrtimer_class+0x41>
c103b18c: 80 3d 46 10 00 00 01 cmpb $0x1,0x1046
c103b193: b8 02 00 00 00 mov $0x2,%eax
c103b198: 74 73 je c103b20d <ftrace_raw_output_hrtimer_class+0x97>
c103b19a: b8 0f 00 00 00 mov $0xf,%eax
c103b19f: ba e9 00 00 00 mov $0xe9,%edx
c103b1a4: e8 fc ff ff ff call c103b1a5 <ftrace_raw_output_hrtimer_class+0x2f>
c103b1a9: b8 02 00 00 00 mov $0x2,%eax
c103b1ae: c6 05 46 10 00 00 01 movb $0x1,0x1046
c103b1b5: eb 56 jmp c103b20d <ftrace_raw_output_hrtimer_class+0x97>
};
static inline void
trace_seq_init(struct trace_seq *s)
{
s->len = 0;
c103b1b7: c7 80 48 10 00 00 00 movl $0x0,0x1048(%eax)
c103b1be: 00 00 00
c103b1c1: 8d 98 54 10 00 00 lea 0x1054(%eax),%ebx
s->readpos = 0;
c103b1c7: c7 80 4c 10 00 00 00 movl $0x0,0x104c(%eax)
c103b1ce: 00 00 00
s->full = 0;
c103b1d1: c7 80 50 10 00 00 00 movl $0x0,0x1050(%eax)
c103b1d8: 00 00 00
c103b1db: ff 71 0c pushl 0xc(%ecx)
c103b1de: 68 2c 00 00 00 push $0x2c
c103b1e3: 53 push %ebx
c103b1e4: e8 fc ff ff ff call c103b1e5 <ftrace_raw_output_hrtimer_class+0x6f>
c103b1e9: 89 c2 mov %eax,%edx
c103b1eb: 83 c4 0c add $0xc,%esp
c103b1ee: 31 c0 xor %eax,%eax
c103b1f0: 85 d2 test %edx,%edx
c103b1f2: 74 19 je c103b20d <ftrace_raw_output_hrtimer_class+0x97>
c103b1f4: ff 76 0c pushl 0xc(%esi)
c103b1f7: 68 44 01 00 00 push $0x144
c103b1fc: 53 push %ebx
c103b1fd: e8 fc ff ff ff call c103b1fe <ftrace_raw_output_hrtimer_class+0x88>
c103b202: 83 c4 0c add $0xc,%esp
c103b205: 85 c0 test %eax,%eax
c103b207: 0f 95 c0 setne %al
c103b20a: 0f b6 c0 movzbl %al,%eax
c103b20d: 8d 65 f8 lea -0x8(%ebp),%esp
c103b210: 5b pop %ebx
c103b211: 5e pop %esi
c103b212: 5d pop %ebp
c103b213: c3 ret
c103b214 <ftrace_raw_output_itimer_state>:
* @which: name of the interval timer
* @value: the itimers value, itimer is canceled if value->it_value is
* zero, otherwise it is started
* @expires: the itimers expiry time
*/
TRACE_EVENT(itimer_state,
c103b214: 55 push %ebp
c103b215: 83 e9 14 sub $0x14,%ecx
c103b218: 89 e5 mov %esp,%ebp
c103b21a: 56 push %esi
c103b21b: 53 push %ebx
c103b21c: 8b 98 60 20 00 00 mov 0x2060(%eax),%ebx
c103b222: 0f b7 13 movzwl (%ebx),%edx
c103b225: 3b 51 24 cmp 0x24(%ecx),%edx
c103b228: 74 2f je c103b259 <ftrace_raw_output_itimer_state+0x45>
c103b22a: 80 3d 47 10 00 00 01 cmpb $0x1,0x1047
c103b231: b8 02 00 00 00 mov $0x2,%eax
c103b236: 0f 84 86 00 00 00 je c103b2c2 <ftrace_raw_output_itimer_state+0xae>
c103b23c: b8 0f 00 00 00 mov $0xf,%eax
c103b241: ba 28 01 00 00 mov $0x128,%edx
c103b246: e8 fc ff ff ff call c103b247 <ftrace_raw_output_itimer_state+0x33>
c103b24b: b8 02 00 00 00 mov $0x2,%eax
c103b250: c6 05 47 10 00 00 01 movb $0x1,0x1047
c103b257: eb 69 jmp c103b2c2 <ftrace_raw_output_itimer_state+0xae>
};
static inline void
trace_seq_init(struct trace_seq *s)
{
s->len = 0;
c103b259: c7 80 48 10 00 00 00 movl $0x0,0x1048(%eax)
c103b260: 00 00 00
c103b263: 8d b0 54 10 00 00 lea 0x1054(%eax),%esi
s->readpos = 0;
c103b269: c7 80 4c 10 00 00 00 movl $0x0,0x104c(%eax)
c103b270: 00 00 00
s->full = 0;
c103b273: c7 80 50 10 00 00 00 movl $0x0,0x1050(%eax)
c103b27a: 00 00 00
c103b27d: ff 71 0c pushl 0xc(%ecx)
c103b280: 68 2c 00 00 00 push $0x2c
c103b285: 56 push %esi
c103b286: e8 fc ff ff ff call c103b287 <ftrace_raw_output_itimer_state+0x73>
c103b28b: 89 c2 mov %eax,%edx
c103b28d: 83 c4 0c add $0xc,%esp
c103b290: 31 c0 xor %eax,%eax
c103b292: 85 d2 test %edx,%edx
c103b294: 74 2c je c103b2c2 <ftrace_raw_output_itimer_state+0xae>
c103b296: ff 73 20 pushl 0x20(%ebx)
c103b299: 31 d2 xor %edx,%edx
c103b29b: ff 73 1c pushl 0x1c(%ebx)
c103b29e: ff 73 18 pushl 0x18(%ebx)
c103b2a1: ff 73 14 pushl 0x14(%ebx)
c103b2a4: 8b 43 10 mov 0x10(%ebx),%eax
c103b2a7: 52 push %edx
c103b2a8: 50 push %eax
c103b2a9: ff 73 0c pushl 0xc(%ebx)
c103b2ac: 68 50 01 00 00 push $0x150
c103b2b1: 56 push %esi
c103b2b2: e8 fc ff ff ff call c103b2b3 <ftrace_raw_output_itimer_state+0x9f>
c103b2b7: 83 c4 24 add $0x24,%esp
c103b2ba: 85 c0 test %eax,%eax
c103b2bc: 0f 95 c0 setne %al
c103b2bf: 0f b6 c0 movzbl %al,%eax
c103b2c2: 8d 65 f8 lea -0x8(%ebp),%esp
c103b2c5: 5b pop %ebx
c103b2c6: 5e pop %esi
c103b2c7: 5d pop %ebp
c103b2c8: c3 ret
c103b2c9 <ftrace_raw_output_itimer_expire>:
* itimer_expire - called when itimer expires
* @which: type of the interval timer
* @pid: pid of the process which owns the timer
* @now: current time, used to calculate the latency of itimer
*/
TRACE_EVENT(itimer_expire,
c103b2c9: 55 push %ebp
c103b2ca: 83 e9 14 sub $0x14,%ecx
c103b2cd: 89 e5 mov %esp,%ebp
c103b2cf: 56 push %esi
c103b2d0: 53 push %ebx
c103b2d1: 8b 98 60 20 00 00 mov 0x2060(%eax),%ebx
c103b2d7: 0f b7 13 movzwl (%ebx),%edx
c103b2da: 3b 51 24 cmp 0x24(%ecx),%edx
c103b2dd: 74 2b je c103b30a <ftrace_raw_output_itimer_expire+0x41>
c103b2df: 80 3d 48 10 00 00 01 cmpb $0x1,0x1048
c103b2e6: b8 02 00 00 00 mov $0x2,%eax
c103b2eb: 74 7d je c103b36a <ftrace_raw_output_itimer_expire+0xa1>
c103b2ed: b8 0f 00 00 00 mov $0xf,%eax
c103b2f2: ba 44 01 00 00 mov $0x144,%edx
c103b2f7: e8 fc ff ff ff call c103b2f8 <ftrace_raw_output_itimer_expire+0x2f>
c103b2fc: b8 02 00 00 00 mov $0x2,%eax
c103b301: c6 05 48 10 00 00 01 movb $0x1,0x1048
c103b308: eb 60 jmp c103b36a <ftrace_raw_output_itimer_expire+0xa1>
};
static inline void
trace_seq_init(struct trace_seq *s)
{
s->len = 0;
c103b30a: c7 80 48 10 00 00 00 movl $0x0,0x1048(%eax)
c103b311: 00 00 00
c103b314: 8d b0 54 10 00 00 lea 0x1054(%eax),%esi
s->readpos = 0;
c103b31a: c7 80 4c 10 00 00 00 movl $0x0,0x104c(%eax)
c103b321: 00 00 00
s->full = 0;
c103b324: c7 80 50 10 00 00 00 movl $0x0,0x1050(%eax)
c103b32b: 00 00 00
c103b32e: ff 71 0c pushl 0xc(%ecx)
c103b331: 68 2c 00 00 00 push $0x2c
c103b336: 56 push %esi
c103b337: e8 fc ff ff ff call c103b338 <ftrace_raw_output_itimer_expire+0x6f>
c103b33c: 89 c2 mov %eax,%edx
c103b33e: 83 c4 0c add $0xc,%esp
c103b341: 31 c0 xor %eax,%eax
c103b343: 85 d2 test %edx,%edx
c103b345: 74 23 je c103b36a <ftrace_raw_output_itimer_expire+0xa1>
c103b347: 8b 43 14 mov 0x14(%ebx),%eax
c103b34a: 31 d2 xor %edx,%edx
c103b34c: 52 push %edx
c103b34d: 50 push %eax
c103b34e: ff 73 10 pushl 0x10(%ebx)
c103b351: ff 73 0c pushl 0xc(%ebx)
c103b354: 68 8c 01 00 00 push $0x18c
c103b359: 56 push %esi
c103b35a: e8 fc ff ff ff call c103b35b <ftrace_raw_output_itimer_expire+0x92>
c103b35f: 83 c4 18 add $0x18,%esp
c103b362: 85 c0 test %eax,%eax
c103b364: 0f 95 c0 setne %al
c103b367: 0f b6 c0 movzbl %al,%eax
c103b36a: 8d 65 f8 lea -0x8(%ebp),%esp
c103b36d: 5b pop %ebx
c103b36e: 5e pop %esi
c103b36f: 5d pop %ebp
c103b370: c3 ret
c103b371 <ftrace_define_fields_timer_class>:
#include <linux/tracepoint.h>
#include <linux/hrtimer.h>
#include <linux/timer.h>
DECLARE_EVENT_CLASS(timer_class,
c103b371: 55 push %ebp
c103b372: b9 a6 01 00 00 mov $0x1a6,%ecx
c103b377: 89 e5 mov %esp,%ebp
c103b379: ba ac 01 00 00 mov $0x1ac,%edx
c103b37e: 6a 00 push $0x0
c103b380: 6a 00 push $0x0
c103b382: 6a 04 push $0x4
c103b384: 6a 0c push $0xc
c103b386: e8 fc ff ff ff call c103b387 <ftrace_define_fields_timer_class+0x16>
TP_fast_assign(
__entry->timer = timer;
),
TP_printk("timer=%p", __entry->timer)
);
c103b38b: c9 leave
c103b38c: c3 ret
c103b38d <ftrace_define_fields_timer_start>:
/**
* timer_start - called when the timer is started
* @timer: pointer to struct timer_list
* @expires: the timers expiry time
*/
TRACE_EVENT(timer_start,
c103b38d: 55 push %ebp
c103b38e: b9 a6 01 00 00 mov $0x1a6,%ecx
c103b393: 89 e5 mov %esp,%ebp
c103b395: ba ac 01 00 00 mov $0x1ac,%edx
c103b39a: 53 push %ebx
c103b39b: 89 c3 mov %eax,%ebx
c103b39d: 6a 00 push $0x0
c103b39f: 6a 00 push $0x0
c103b3a1: 6a 04 push $0x4
c103b3a3: 6a 0c push $0xc
c103b3a5: e8 fc ff ff ff call c103b3a6 <ftrace_define_fields_timer_start+0x19>
c103b3aa: 83 c4 10 add $0x10,%esp
c103b3ad: 85 c0 test %eax,%eax
c103b3af: 75 5c jne c103b40d <ftrace_define_fields_timer_start+0x80>
c103b3b1: 6a 00 push $0x0
c103b3b3: b9 b3 01 00 00 mov $0x1b3,%ecx
c103b3b8: 6a 00 push $0x0
c103b3ba: ba ac 01 00 00 mov $0x1ac,%edx
c103b3bf: 6a 04 push $0x4
c103b3c1: 89 d8 mov %ebx,%eax
c103b3c3: 6a 10 push $0x10
c103b3c5: e8 fc ff ff ff call c103b3c6 <ftrace_define_fields_timer_start+0x39>
c103b3ca: 83 c4 10 add $0x10,%esp
c103b3cd: 85 c0 test %eax,%eax
c103b3cf: 75 3c jne c103b40d <ftrace_define_fields_timer_start+0x80>
c103b3d1: 6a 00 push $0x0
c103b3d3: b9 bc 01 00 00 mov $0x1bc,%ecx
c103b3d8: 6a 00 push $0x0
c103b3da: ba c4 01 00 00 mov $0x1c4,%edx
c103b3df: 6a 04 push $0x4
c103b3e1: 89 d8 mov %ebx,%eax
c103b3e3: 6a 14 push $0x14
c103b3e5: e8 fc ff ff ff call c103b3e6 <ftrace_define_fields_timer_start+0x59>
c103b3ea: 83 c4 10 add $0x10,%esp
c103b3ed: 85 c0 test %eax,%eax
c103b3ef: 75 1c jne c103b40d <ftrace_define_fields_timer_start+0x80>
c103b3f1: 6a 00 push $0x0
c103b3f3: b9 d2 01 00 00 mov $0x1d2,%ecx
c103b3f8: 6a 00 push $0x0
c103b3fa: ba c4 01 00 00 mov $0x1c4,%edx
c103b3ff: 6a 04 push $0x4
c103b401: 89 d8 mov %ebx,%eax
c103b403: 6a 18 push $0x18
c103b405: e8 fc ff ff ff call c103b406 <ftrace_define_fields_timer_start+0x79>
c103b40a: 83 c4 10 add $0x10,%esp
),
TP_printk("timer=%p function=%pf expires=%lu [timeout=%ld]",
__entry->timer, __entry->function, __entry->expires,
(long)__entry->expires - __entry->now)
);
c103b40d: 8b 5d fc mov -0x4(%ebp),%ebx
c103b410: c9 leave
c103b411: c3 ret
c103b412 <ftrace_define_fields_timer_expire_entry>:
* timer_expire_entry - called immediately before the timer callback
* @timer: pointer to struct timer_list
*
* Allows to determine the timer latency.
*/
TRACE_EVENT(timer_expire_entry,
c103b412: 55 push %ebp
c103b413: b9 a6 01 00 00 mov $0x1a6,%ecx
c103b418: 89 e5 mov %esp,%ebp
c103b41a: ba ac 01 00 00 mov $0x1ac,%edx
c103b41f: 53 push %ebx
c103b420: 89 c3 mov %eax,%ebx
c103b422: 6a 00 push $0x0
c103b424: 6a 00 push $0x0
c103b426: 6a 04 push $0x4
c103b428: 6a 0c push $0xc
c103b42a: e8 fc ff ff ff call c103b42b <ftrace_define_fields_timer_expire_entry+0x19>
c103b42f: 83 c4 10 add $0x10,%esp
c103b432: 85 c0 test %eax,%eax
c103b434: 75 3c jne c103b472 <ftrace_define_fields_timer_expire_entry+0x60>
c103b436: 6a 00 push $0x0
c103b438: b9 d2 01 00 00 mov $0x1d2,%ecx
c103b43d: 6a 00 push $0x0
c103b43f: ba c4 01 00 00 mov $0x1c4,%edx
c103b444: 6a 04 push $0x4
c103b446: 89 d8 mov %ebx,%eax
c103b448: 6a 10 push $0x10
c103b44a: e8 fc ff ff ff call c103b44b <ftrace_define_fields_timer_expire_entry+0x39>
c103b44f: 83 c4 10 add $0x10,%esp
c103b452: 85 c0 test %eax,%eax
c103b454: 75 1c jne c103b472 <ftrace_define_fields_timer_expire_entry+0x60>
c103b456: 6a 00 push $0x0
c103b458: b9 b3 01 00 00 mov $0x1b3,%ecx
c103b45d: 6a 00 push $0x0
c103b45f: ba ac 01 00 00 mov $0x1ac,%edx
c103b464: 6a 04 push $0x4
c103b466: 89 d8 mov %ebx,%eax
c103b468: 6a 14 push $0x14
c103b46a: e8 fc ff ff ff call c103b46b <ftrace_define_fields_timer_expire_entry+0x59>
c103b46f: 83 c4 10 add $0x10,%esp
__entry->now = jiffies;
__entry->function = timer->function;
),
TP_printk("timer=%p function=%pf now=%lu", __entry->timer, __entry->function,__entry->now)
);
c103b472: 8b 5d fc mov -0x4(%ebp),%ebx
c103b475: c9 leave
c103b476: c3 ret
c103b477 <ftrace_define_fields_hrtimer_init>:
* hrtimer_init - called when the hrtimer is initialized
* @timer: pointer to struct hrtimer
* @clockid: the hrtimers clock
* @mode: the hrtimers mode
*/
TRACE_EVENT(hrtimer_init,
c103b477: 55 push %ebp
c103b478: b9 d6 01 00 00 mov $0x1d6,%ecx
c103b47d: 89 e5 mov %esp,%ebp
c103b47f: ba ac 01 00 00 mov $0x1ac,%edx
c103b484: 53 push %ebx
c103b485: 89 c3 mov %eax,%ebx
c103b487: 6a 00 push $0x0
c103b489: 6a 00 push $0x0
c103b48b: 6a 04 push $0x4
c103b48d: 6a 0c push $0xc
c103b48f: e8 fc ff ff ff call c103b490 <ftrace_define_fields_hrtimer_init+0x19>
c103b494: 83 c4 10 add $0x10,%esp
c103b497: 85 c0 test %eax,%eax
c103b499: 75 3c jne c103b4d7 <ftrace_define_fields_hrtimer_init+0x60>
c103b49b: 6a 00 push $0x0
c103b49d: b9 de 01 00 00 mov $0x1de,%ecx
c103b4a2: 6a 01 push $0x1
c103b4a4: ba e6 01 00 00 mov $0x1e6,%edx
c103b4a9: 6a 04 push $0x4
c103b4ab: 89 d8 mov %ebx,%eax
c103b4ad: 6a 10 push $0x10
c103b4af: e8 fc ff ff ff call c103b4b0 <ftrace_define_fields_hrtimer_init+0x39>
c103b4b4: 83 c4 10 add $0x10,%esp
c103b4b7: 85 c0 test %eax,%eax
c103b4b9: 75 1c jne c103b4d7 <ftrace_define_fields_hrtimer_init+0x60>
c103b4bb: 6a 00 push $0x0
c103b4bd: b9 f0 01 00 00 mov $0x1f0,%ecx
c103b4c2: 6a 00 push $0x0
c103b4c4: ba f5 01 00 00 mov $0x1f5,%edx
c103b4c9: 6a 04 push $0x4
c103b4cb: 89 d8 mov %ebx,%eax
c103b4cd: 6a 14 push $0x14
c103b4cf: e8 fc ff ff ff call c103b4d0 <ftrace_define_fields_hrtimer_init+0x59>
c103b4d4: 83 c4 10 add $0x10,%esp
c103b4d7: 8b 5d fc mov -0x4(%ebp),%ebx
c103b4da: c9 leave
c103b4db: c3 ret
c103b4dc <ftrace_define_fields_hrtimer_start>:
/**
* hrtimer_start - called when the hrtimer is started
* @timer: pointer to struct hrtimer
*/
TRACE_EVENT(hrtimer_start,
c103b4dc: 55 push %ebp
c103b4dd: b9 d6 01 00 00 mov $0x1d6,%ecx
c103b4e2: 89 e5 mov %esp,%ebp
c103b4e4: ba ac 01 00 00 mov $0x1ac,%edx
c103b4e9: 53 push %ebx
c103b4ea: 89 c3 mov %eax,%ebx
c103b4ec: 6a 00 push $0x0
c103b4ee: 6a 00 push $0x0
c103b4f0: 6a 04 push $0x4
c103b4f2: 6a 0c push $0xc
c103b4f4: e8 fc ff ff ff call c103b4f5 <ftrace_define_fields_hrtimer_start+0x19>
c103b4f9: 83 c4 10 add $0x10,%esp
c103b4fc: 85 c0 test %eax,%eax
c103b4fe: 75 5c jne c103b55c <ftrace_define_fields_hrtimer_start+0x80>
c103b500: 6a 00 push $0x0
c103b502: b9 b3 01 00 00 mov $0x1b3,%ecx
c103b507: 6a 00 push $0x0
c103b509: ba ac 01 00 00 mov $0x1ac,%edx
c103b50e: 6a 04 push $0x4
c103b510: 89 d8 mov %ebx,%eax
c103b512: 6a 10 push $0x10
c103b514: e8 fc ff ff ff call c103b515 <ftrace_define_fields_hrtimer_start+0x39>
c103b519: 83 c4 10 add $0x10,%esp
c103b51c: 85 c0 test %eax,%eax
c103b51e: 75 3c jne c103b55c <ftrace_define_fields_hrtimer_start+0x80>
c103b520: 6a 00 push $0x0
c103b522: b9 bc 01 00 00 mov $0x1bc,%ecx
c103b527: 6a 01 push $0x1
c103b529: ba 07 02 00 00 mov $0x207,%edx
c103b52e: 6a 08 push $0x8
c103b530: 89 d8 mov %ebx,%eax
c103b532: 6a 14 push $0x14
c103b534: e8 fc ff ff ff call c103b535 <ftrace_define_fields_hrtimer_start+0x59>
c103b539: 83 c4 10 add $0x10,%esp
c103b53c: 85 c0 test %eax,%eax
c103b53e: 75 1c jne c103b55c <ftrace_define_fields_hrtimer_start+0x80>
c103b540: 6a 00 push $0x0
c103b542: b9 0b 02 00 00 mov $0x20b,%ecx
c103b547: 6a 01 push $0x1
c103b549: ba 07 02 00 00 mov $0x207,%edx
c103b54e: 6a 08 push $0x8
c103b550: 89 d8 mov %ebx,%eax
c103b552: 6a 1c push $0x1c
c103b554: e8 fc ff ff ff call c103b555 <ftrace_define_fields_hrtimer_start+0x79>
c103b559: 83 c4 10 add $0x10,%esp
__entry->hrtimer, __entry->function,
(unsigned long long)ktime_to_ns((ktime_t) {
.tv64 = __entry->expires }),
(unsigned long long)ktime_to_ns((ktime_t) {
.tv64 = __entry->softexpires }))
);
c103b55c: 8b 5d fc mov -0x4(%ebp),%ebx
c103b55f: c9 leave
c103b560: c3 ret
c103b561 <ftrace_define_fields_hrtimer_expire_entry>:
* @now: pointer to variable which contains current time of the
* timers base.
*
* Allows to determine the timer latency.
*/
TRACE_EVENT(hrtimer_expire_entry,
c103b561: 55 push %ebp
c103b562: b9 d6 01 00 00 mov $0x1d6,%ecx
c103b567: 89 e5 mov %esp,%ebp
c103b569: ba ac 01 00 00 mov $0x1ac,%edx
c103b56e: 53 push %ebx
c103b56f: 89 c3 mov %eax,%ebx
c103b571: 6a 00 push $0x0
c103b573: 6a 00 push $0x0
c103b575: 6a 04 push $0x4
c103b577: 6a 0c push $0xc
c103b579: e8 fc ff ff ff call c103b57a <ftrace_define_fields_hrtimer_expire_entry+0x19>
c103b57e: 83 c4 10 add $0x10,%esp
c103b581: 85 c0 test %eax,%eax
c103b583: 75 3c jne c103b5c1 <ftrace_define_fields_hrtimer_expire_entry+0x60>
c103b585: 6a 00 push $0x0
c103b587: b9 d2 01 00 00 mov $0x1d2,%ecx
c103b58c: 6a 01 push $0x1
c103b58e: ba 07 02 00 00 mov $0x207,%edx
c103b593: 6a 08 push $0x8
c103b595: 89 d8 mov %ebx,%eax
c103b597: 6a 10 push $0x10
c103b599: e8 fc ff ff ff call c103b59a <ftrace_define_fields_hrtimer_expire_entry+0x39>
c103b59e: 83 c4 10 add $0x10,%esp
c103b5a1: 85 c0 test %eax,%eax
c103b5a3: 75 1c jne c103b5c1 <ftrace_define_fields_hrtimer_expire_entry+0x60>
c103b5a5: 6a 00 push $0x0
c103b5a7: b9 b3 01 00 00 mov $0x1b3,%ecx
c103b5ac: 6a 00 push $0x0
c103b5ae: ba ac 01 00 00 mov $0x1ac,%edx
c103b5b3: 6a 04 push $0x4
c103b5b5: 89 d8 mov %ebx,%eax
c103b5b7: 6a 18 push $0x18
c103b5b9: e8 fc ff ff ff call c103b5ba <ftrace_define_fields_hrtimer_expire_entry+0x59>
c103b5be: 83 c4 10 add $0x10,%esp
__entry->function = hrtimer->function;
),
TP_printk("hrtimer=%p function=%pf now=%llu", __entry->hrtimer, __entry->function,
(unsigned long long)ktime_to_ns((ktime_t) { .tv64 = __entry->now }))
);
c103b5c1: 8b 5d fc mov -0x4(%ebp),%ebx
c103b5c4: c9 leave
c103b5c5: c3 ret
c103b5c6 <ftrace_define_fields_hrtimer_class>:
DECLARE_EVENT_CLASS(hrtimer_class,
c103b5c6: 55 push %ebp
c103b5c7: b9 d6 01 00 00 mov $0x1d6,%ecx
c103b5cc: 89 e5 mov %esp,%ebp
c103b5ce: ba ac 01 00 00 mov $0x1ac,%edx
c103b5d3: 6a 00 push $0x0
c103b5d5: 6a 00 push $0x0
c103b5d7: 6a 04 push $0x4
c103b5d9: 6a 0c push $0xc
c103b5db: e8 fc ff ff ff call c103b5dc <ftrace_define_fields_hrtimer_class+0x16>
TP_fast_assign(
__entry->hrtimer = hrtimer;
),
TP_printk("hrtimer=%p", __entry->hrtimer)
);
c103b5e0: c9 leave
c103b5e1: c3 ret
c103b5e2 <ftrace_define_fields_itimer_state>:
* @which: name of the interval timer
* @value: the itimers value, itimer is canceled if value->it_value is
* zero, otherwise it is started
* @expires: the itimers expiry time
*/
TRACE_EVENT(itimer_state,
c103b5e2: 55 push %ebp
c103b5e3: b9 17 02 00 00 mov $0x217,%ecx
c103b5e8: 89 e5 mov %esp,%ebp
c103b5ea: ba 1d 02 00 00 mov $0x21d,%edx
c103b5ef: 53 push %ebx
c103b5f0: 89 c3 mov %eax,%ebx
c103b5f2: 6a 00 push $0x0
c103b5f4: 6a 01 push $0x1
c103b5f6: 6a 04 push $0x4
c103b5f8: 6a 0c push $0xc
c103b5fa: e8 fc ff ff ff call c103b5fb <ftrace_define_fields_itimer_state+0x19>
c103b5ff: 83 c4 10 add $0x10,%esp
c103b602: 85 c0 test %eax,%eax
c103b604: 0f 85 9c 00 00 00 jne c103b6a6 <ftrace_define_fields_itimer_state+0xc4>
c103b60a: 6a 00 push $0x0
c103b60c: b9 bc 01 00 00 mov $0x1bc,%ecx
c103b611: 6a 00 push $0x0
c103b613: ba 21 02 00 00 mov $0x221,%edx
c103b618: 6a 04 push $0x4
c103b61a: 89 d8 mov %ebx,%eax
c103b61c: 6a 10 push $0x10
c103b61e: e8 fc ff ff ff call c103b61f <ftrace_define_fields_itimer_state+0x3d>
c103b623: 83 c4 10 add $0x10,%esp
c103b626: 85 c0 test %eax,%eax
c103b628: 75 7c jne c103b6a6 <ftrace_define_fields_itimer_state+0xc4>
c103b62a: 6a 00 push $0x0
c103b62c: b9 2b 02 00 00 mov $0x22b,%ecx
c103b631: 6a 01 push $0x1
c103b633: ba 35 02 00 00 mov $0x235,%edx
c103b638: 6a 04 push $0x4
c103b63a: 89 d8 mov %ebx,%eax
c103b63c: 6a 14 push $0x14
c103b63e: e8 fc ff ff ff call c103b63f <ftrace_define_fields_itimer_state+0x5d>
c103b643: 83 c4 10 add $0x10,%esp
c103b646: 85 c0 test %eax,%eax
c103b648: 75 5c jne c103b6a6 <ftrace_define_fields_itimer_state+0xc4>
c103b64a: 6a 00 push $0x0
c103b64c: b9 3a 02 00 00 mov $0x23a,%ecx
c103b651: 6a 01 push $0x1
c103b653: ba 35 02 00 00 mov $0x235,%edx
c103b658: 6a 04 push $0x4
c103b65a: 89 d8 mov %ebx,%eax
c103b65c: 6a 18 push $0x18
c103b65e: e8 fc ff ff ff call c103b65f <ftrace_define_fields_itimer_state+0x7d>
c103b663: 83 c4 10 add $0x10,%esp
c103b666: 85 c0 test %eax,%eax
c103b668: 75 3c jne c103b6a6 <ftrace_define_fields_itimer_state+0xc4>
c103b66a: 6a 00 push $0x0
c103b66c: b9 45 02 00 00 mov $0x245,%ecx
c103b671: 6a 01 push $0x1
c103b673: ba 35 02 00 00 mov $0x235,%edx
c103b678: 6a 04 push $0x4
c103b67a: 89 d8 mov %ebx,%eax
c103b67c: 6a 1c push $0x1c
c103b67e: e8 fc ff ff ff call c103b67f <ftrace_define_fields_itimer_state+0x9d>
c103b683: 83 c4 10 add $0x10,%esp
c103b686: 85 c0 test %eax,%eax
c103b688: 75 1c jne c103b6a6 <ftrace_define_fields_itimer_state+0xc4>
c103b68a: 6a 00 push $0x0
c103b68c: b9 52 02 00 00 mov $0x252,%ecx
c103b691: 6a 01 push $0x1
c103b693: ba 35 02 00 00 mov $0x235,%edx
c103b698: 6a 04 push $0x4
c103b69a: 89 d8 mov %ebx,%eax
c103b69c: 6a 20 push $0x20
c103b69e: e8 fc ff ff ff call c103b69f <ftrace_define_fields_itimer_state+0xbd>
c103b6a3: 83 c4 10 add $0x10,%esp
TP_printk("which=%d expires=%llu it_value=%ld.%ld it_interval=%ld.%ld",
__entry->which, (unsigned long long)__entry->expires,
__entry->value_sec, __entry->value_usec,
__entry->interval_sec, __entry->interval_usec)
);
c103b6a6: 8b 5d fc mov -0x4(%ebp),%ebx
c103b6a9: c9 leave
c103b6aa: c3 ret
c103b6ab <ftrace_define_fields_itimer_expire>:
* itimer_expire - called when itimer expires
* @which: type of the interval timer
* @pid: pid of the process which owns the timer
* @now: current time, used to calculate the latency of itimer
*/
TRACE_EVENT(itimer_expire,
c103b6ab: 55 push %ebp
c103b6ac: b9 17 02 00 00 mov $0x217,%ecx
c103b6b1: 89 e5 mov %esp,%ebp
c103b6b3: ba 1d 02 00 00 mov $0x21d,%edx
c103b6b8: 53 push %ebx
c103b6b9: 89 c3 mov %eax,%ebx
c103b6bb: 6a 00 push $0x0
c103b6bd: 6a 01 push $0x1
c103b6bf: 6a 04 push $0x4
c103b6c1: 6a 0c push $0xc
c103b6c3: e8 fc ff ff ff call c103b6c4 <ftrace_define_fields_itimer_expire+0x19>
c103b6c8: 83 c4 10 add $0x10,%esp
c103b6cb: 85 c0 test %eax,%eax
c103b6cd: 75 3c jne c103b70b <ftrace_define_fields_itimer_expire+0x60>
c103b6cf: 6a 00 push $0x0
c103b6d1: b9 60 02 00 00 mov $0x260,%ecx
c103b6d6: 6a 01 push $0x1
c103b6d8: ba 64 02 00 00 mov $0x264,%edx
c103b6dd: 6a 04 push $0x4
c103b6df: 89 d8 mov %ebx,%eax
c103b6e1: 6a 10 push $0x10
c103b6e3: e8 fc ff ff ff call c103b6e4 <ftrace_define_fields_itimer_expire+0x39>
c103b6e8: 83 c4 10 add $0x10,%esp
c103b6eb: 85 c0 test %eax,%eax
c103b6ed: 75 1c jne c103b70b <ftrace_define_fields_itimer_expire+0x60>
c103b6ef: 6a 00 push $0x0
c103b6f1: b9 d2 01 00 00 mov $0x1d2,%ecx
c103b6f6: 6a 00 push $0x0
c103b6f8: ba 21 02 00 00 mov $0x221,%edx
c103b6fd: 6a 04 push $0x4
c103b6ff: 89 d8 mov %ebx,%eax
c103b701: 6a 14 push $0x14
c103b703: e8 fc ff ff ff call c103b704 <ftrace_define_fields_itimer_expire+0x59>
c103b708: 83 c4 10 add $0x10,%esp
__entry->pid = pid_nr(pid);
),
TP_printk("which=%d pid=%d now=%llu", __entry->which,
(int) __entry->pid, (unsigned long long)__entry->now)
);
c103b70b: 8b 5d fc mov -0x4(%ebp),%ebx
c103b70e: c9 leave
c103b70f: c3 ret
c103b710 <perf_fetch_caller_regs>:
* - cs for user_mode() tests
* - bp for callchains
* - eflags, for future purposes, just in case
*/
static inline void perf_fetch_caller_regs(struct pt_regs *regs)
{
c103b710: 55 push %ebp
c103b711: 89 c2 mov %eax,%edx
c103b713: 89 e5 mov %esp,%ebp
memset(regs, 0, sizeof(*regs));
c103b715: 31 c0 xor %eax,%eax
* - cs for user_mode() tests
* - bp for callchains
* - eflags, for future purposes, just in case
*/
static inline void perf_fetch_caller_regs(struct pt_regs *regs)
{
c103b717: 57 push %edi
memset(regs, 0, sizeof(*regs));
c103b718: b9 11 00 00 00 mov $0x11,%ecx
c103b71d: 89 d7 mov %edx,%edi
c103b71f: f3 ab rep stos %eax,%es:(%edi)
perf_arch_fetch_caller_regs(regs, CALLER_ADDR0);
c103b721: 8b 45 04 mov 0x4(%ebp),%eax
c103b724: 89 42 30 mov %eax,0x30(%edx)
static inline unsigned long caller_frame_pointer(void)
{
struct stack_frame *frame;
get_bp(frame);
c103b727: 89 e8 mov %ebp,%eax
c103b729: 8b 00 mov (%eax),%eax
c103b72b: c7 42 34 60 00 00 00 movl $0x60,0x34(%edx)
c103b732: c7 42 38 00 00 00 00 movl $0x0,0x38(%edx)
c103b739: 89 42 14 mov %eax,0x14(%edx)
}
c103b73c: 5f pop %edi
c103b73d: 5d pop %ebp
c103b73e: c3 ret
c103b73f <perf_trace_timer_class>:
#include <linux/tracepoint.h>
#include <linux/hrtimer.h>
#include <linux/timer.h>
DECLARE_EVENT_CLASS(timer_class,
c103b73f: 55 push %ebp
c103b740: 89 e5 mov %esp,%ebp
c103b742: 57 push %edi
c103b743: 89 d7 mov %edx,%edi
c103b745: 56 push %esi
c103b746: 53 push %ebx
c103b747: 89 c3 mov %eax,%ebx
c103b749: 8d 75 ac lea -0x54(%ebp),%esi
c103b74c: 83 ec 4c sub $0x4c,%esp
c103b74f: 89 f0 mov %esi,%eax
c103b751: e8 ba ff ff ff call c103b710 <perf_fetch_caller_regs>
c103b756: 0f b7 53 24 movzwl 0x24(%ebx),%edx
c103b75a: 8d 45 f0 lea -0x10(%ebp),%eax
c103b75d: 89 f1 mov %esi,%ecx
c103b75f: 50 push %eax
c103b760: b8 14 00 00 00 mov $0x14,%eax
c103b765: e8 fc ff ff ff call c103b766 <perf_trace_timer_class+0x27>
c103b76a: 59 pop %ecx
c103b76b: 85 c0 test %eax,%eax
c103b76d: 74 30 je c103b79f <perf_trace_timer_class+0x60>
c103b76f: 89 78 0c mov %edi,0xc(%eax)
c103b772: 8b 5b 44 mov 0x44(%ebx),%ebx
c103b775: 89 45 a8 mov %eax,-0x58(%ebp)
c103b778: e8 fc ff ff ff call c103b779 <perf_trace_timer_class+0x3a>
static inline void
perf_trace_buf_submit(void *raw_data, int size, int rctx, u64 addr,
u64 count, struct pt_regs *regs, void *head)
{
perf_tp_event(addr, count, raw_data, size, regs, head, rctx);
c103b77d: 8b 55 a8 mov -0x58(%ebp),%edx
c103b780: ff 75 f0 pushl -0x10(%ebp)
c103b783: 03 1c 85 00 00 00 00 add 0x0(,%eax,4),%ebx
c103b78a: 31 c0 xor %eax,%eax
c103b78c: 53 push %ebx
c103b78d: 56 push %esi
c103b78e: 6a 14 push $0x14
c103b790: 52 push %edx
c103b791: 31 d2 xor %edx,%edx
c103b793: 6a 00 push $0x0
c103b795: 6a 01 push $0x1
c103b797: e8 fc ff ff ff call c103b798 <perf_trace_timer_class+0x59>
c103b79c: 83 c4 1c add $0x1c,%esp
TP_fast_assign(
__entry->timer = timer;
),
TP_printk("timer=%p", __entry->timer)
);
c103b79f: 8d 65 f4 lea -0xc(%ebp),%esp
c103b7a2: 5b pop %ebx
c103b7a3: 5e pop %esi
c103b7a4: 5f pop %edi
c103b7a5: 5d pop %ebp
c103b7a6: c3 ret
c103b7a7 <perf_trace_timer_start>:
/**
* timer_start - called when the timer is started
* @timer: pointer to struct timer_list
* @expires: the timers expiry time
*/
TRACE_EVENT(timer_start,
c103b7a7: 55 push %ebp
c103b7a8: 89 e5 mov %esp,%ebp
c103b7aa: 57 push %edi
c103b7ab: 56 push %esi
c103b7ac: 89 c6 mov %eax,%esi
c103b7ae: 53 push %ebx
c103b7af: 89 d3 mov %edx,%ebx
c103b7b1: 8d 7d ac lea -0x54(%ebp),%edi
c103b7b4: 83 ec 50 sub $0x50,%esp
c103b7b7: 89 f8 mov %edi,%eax
c103b7b9: 89 4d a8 mov %ecx,-0x58(%ebp)
c103b7bc: e8 4f ff ff ff call c103b710 <perf_fetch_caller_regs>
c103b7c1: 0f b7 56 24 movzwl 0x24(%esi),%edx
c103b7c5: 8d 45 f0 lea -0x10(%ebp),%eax
c103b7c8: 89 f9 mov %edi,%ecx
c103b7ca: 50 push %eax
c103b7cb: b8 1c 00 00 00 mov $0x1c,%eax
c103b7d0: e8 fc ff ff ff call c103b7d1 <perf_trace_timer_start+0x2a>
c103b7d5: 89 c2 mov %eax,%edx
c103b7d7: 85 d2 test %edx,%edx
c103b7d9: 58 pop %eax
c103b7da: 74 44 je c103b820 <perf_trace_timer_start+0x79>
c103b7dc: 89 5a 0c mov %ebx,0xc(%edx)
c103b7df: 8b 43 10 mov 0x10(%ebx),%eax
c103b7e2: 89 42 10 mov %eax,0x10(%edx)
c103b7e5: 8b 45 a8 mov -0x58(%ebp),%eax
c103b7e8: 89 42 14 mov %eax,0x14(%edx)
c103b7eb: a1 00 00 00 00 mov 0x0,%eax
c103b7f0: 89 42 18 mov %eax,0x18(%edx)
c103b7f3: 8b 5e 44 mov 0x44(%esi),%ebx
c103b7f6: 89 55 a4 mov %edx,-0x5c(%ebp)
c103b7f9: e8 fc ff ff ff call c103b7fa <perf_trace_timer_start+0x53>
c103b7fe: 8b 55 a4 mov -0x5c(%ebp),%edx
c103b801: ff 75 f0 pushl -0x10(%ebp)
c103b804: 03 1c 85 00 00 00 00 add 0x0(,%eax,4),%ebx
c103b80b: 31 c0 xor %eax,%eax
c103b80d: 53 push %ebx
c103b80e: 57 push %edi
c103b80f: 6a 1c push $0x1c
c103b811: 52 push %edx
c103b812: 31 d2 xor %edx,%edx
c103b814: 6a 00 push $0x0
c103b816: 6a 01 push $0x1
c103b818: e8 fc ff ff ff call c103b819 <perf_trace_timer_start+0x72>
c103b81d: 83 c4 1c add $0x1c,%esp
),
TP_printk("timer=%p function=%pf expires=%lu [timeout=%ld]",
__entry->timer, __entry->function, __entry->expires,
(long)__entry->expires - __entry->now)
);
c103b820: 8d 65 f4 lea -0xc(%ebp),%esp
c103b823: 5b pop %ebx
c103b824: 5e pop %esi
c103b825: 5f pop %edi
c103b826: 5d pop %ebp
c103b827: c3 ret
c103b828 <perf_trace_timer_expire_entry>:
* timer_expire_entry - called immediately before the timer callback
* @timer: pointer to struct timer_list
*
* Allows to determine the timer latency.
*/
TRACE_EVENT(timer_expire_entry,
c103b828: 55 push %ebp
c103b829: 89 e5 mov %esp,%ebp
c103b82b: 57 push %edi
c103b82c: 56 push %esi
c103b82d: 89 c6 mov %eax,%esi
c103b82f: 53 push %ebx
c103b830: 89 d3 mov %edx,%ebx
c103b832: 8d 7d ac lea -0x54(%ebp),%edi
c103b835: 83 ec 4c sub $0x4c,%esp
c103b838: 89 f8 mov %edi,%eax
c103b83a: e8 d1 fe ff ff call c103b710 <perf_fetch_caller_regs>
c103b83f: 0f b7 56 24 movzwl 0x24(%esi),%edx
c103b843: 8d 45 f0 lea -0x10(%ebp),%eax
c103b846: 89 f9 mov %edi,%ecx
c103b848: 50 push %eax
c103b849: b8 1c 00 00 00 mov $0x1c,%eax
c103b84e: e8 fc ff ff ff call c103b84f <perf_trace_timer_expire_entry+0x27>
c103b853: 59 pop %ecx
c103b854: 85 c0 test %eax,%eax
c103b856: 89 c2 mov %eax,%edx
c103b858: 74 3e je c103b898 <perf_trace_timer_expire_entry+0x70>
c103b85a: 89 58 0c mov %ebx,0xc(%eax)
c103b85d: a1 00 00 00 00 mov 0x0,%eax
c103b862: 89 42 10 mov %eax,0x10(%edx)
c103b865: 8b 43 10 mov 0x10(%ebx),%eax
c103b868: 89 42 14 mov %eax,0x14(%edx)
c103b86b: 8b 5e 44 mov 0x44(%esi),%ebx
c103b86e: 89 55 a8 mov %edx,-0x58(%ebp)
c103b871: e8 fc ff ff ff call c103b872 <perf_trace_timer_expire_entry+0x4a>
c103b876: 8b 55 a8 mov -0x58(%ebp),%edx
c103b879: ff 75 f0 pushl -0x10(%ebp)
c103b87c: 03 1c 85 00 00 00 00 add 0x0(,%eax,4),%ebx
c103b883: 31 c0 xor %eax,%eax
c103b885: 53 push %ebx
c103b886: 57 push %edi
c103b887: 6a 1c push $0x1c
c103b889: 52 push %edx
c103b88a: 31 d2 xor %edx,%edx
c103b88c: 6a 00 push $0x0
c103b88e: 6a 01 push $0x1
c103b890: e8 fc ff ff ff call c103b891 <perf_trace_timer_expire_entry+0x69>
c103b895: 83 c4 1c add $0x1c,%esp
__entry->now = jiffies;
__entry->function = timer->function;
),
TP_printk("timer=%p function=%pf now=%lu", __entry->timer, __entry->function,__entry->now)
);
c103b898: 8d 65 f4 lea -0xc(%ebp),%esp
c103b89b: 5b pop %ebx
c103b89c: 5e pop %esi
c103b89d: 5f pop %edi
c103b89e: 5d pop %ebp
c103b89f: c3 ret
c103b8a0 <perf_trace_hrtimer_init>:
* hrtimer_init - called when the hrtimer is initialized
* @timer: pointer to struct hrtimer
* @clockid: the hrtimers clock
* @mode: the hrtimers mode
*/
TRACE_EVENT(hrtimer_init,
c103b8a0: 55 push %ebp
c103b8a1: 89 e5 mov %esp,%ebp
c103b8a3: 57 push %edi
c103b8a4: 89 d7 mov %edx,%edi
c103b8a6: 56 push %esi
c103b8a7: 53 push %ebx
c103b8a8: 89 c3 mov %eax,%ebx
c103b8aa: 8d 75 ac lea -0x54(%ebp),%esi
c103b8ad: 83 ec 50 sub $0x50,%esp
c103b8b0: 89 f0 mov %esi,%eax
c103b8b2: 89 4d a8 mov %ecx,-0x58(%ebp)
c103b8b5: e8 56 fe ff ff call c103b710 <perf_fetch_caller_regs>
c103b8ba: 0f b7 53 24 movzwl 0x24(%ebx),%edx
c103b8be: 8d 45 f0 lea -0x10(%ebp),%eax
c103b8c1: 89 f1 mov %esi,%ecx
c103b8c3: 50 push %eax
c103b8c4: b8 1c 00 00 00 mov $0x1c,%eax
c103b8c9: e8 fc ff ff ff call c103b8ca <perf_trace_hrtimer_init+0x2a>
c103b8ce: 89 c2 mov %eax,%edx
c103b8d0: 85 d2 test %edx,%edx
c103b8d2: 58 pop %eax
c103b8d3: 74 3c je c103b911 <perf_trace_hrtimer_init+0x71>
c103b8d5: 89 7a 0c mov %edi,0xc(%edx)
c103b8d8: 8b 45 a8 mov -0x58(%ebp),%eax
c103b8db: 89 42 10 mov %eax,0x10(%edx)
c103b8de: 8b 45 08 mov 0x8(%ebp),%eax
c103b8e1: 89 42 14 mov %eax,0x14(%edx)
c103b8e4: 8b 5b 44 mov 0x44(%ebx),%ebx
c103b8e7: 89 55 a4 mov %edx,-0x5c(%ebp)
c103b8ea: e8 fc ff ff ff call c103b8eb <perf_trace_hrtimer_init+0x4b>
c103b8ef: 8b 55 a4 mov -0x5c(%ebp),%edx
c103b8f2: ff 75 f0 pushl -0x10(%ebp)
c103b8f5: 03 1c 85 00 00 00 00 add 0x0(,%eax,4),%ebx
c103b8fc: 31 c0 xor %eax,%eax
c103b8fe: 53 push %ebx
c103b8ff: 56 push %esi
c103b900: 6a 1c push $0x1c
c103b902: 52 push %edx
c103b903: 31 d2 xor %edx,%edx
c103b905: 6a 00 push $0x0
c103b907: 6a 01 push $0x1
c103b909: e8 fc ff ff ff call c103b90a <perf_trace_hrtimer_init+0x6a>
c103b90e: 83 c4 1c add $0x1c,%esp
TP_printk("hrtimer=%p clockid=%s mode=%s", __entry->hrtimer,
__entry->clockid == CLOCK_REALTIME ?
"CLOCK_REALTIME" : "CLOCK_MONOTONIC",
__entry->mode == HRTIMER_MODE_ABS ?
"HRTIMER_MODE_ABS" : "HRTIMER_MODE_REL")
);
c103b911: 8d 65 f4 lea -0xc(%ebp),%esp
c103b914: 5b pop %ebx
c103b915: 5e pop %esi
c103b916: 5f pop %edi
c103b917: 5d pop %ebp
c103b918: c3 ret
c103b919 <perf_trace_hrtimer_start>:
/**
* hrtimer_start - called when the hrtimer is started
* @timer: pointer to struct hrtimer
*/
TRACE_EVENT(hrtimer_start,
c103b919: 55 push %ebp
c103b91a: 89 e5 mov %esp,%ebp
c103b91c: 57 push %edi
c103b91d: 56 push %esi
c103b91e: 53 push %ebx
c103b91f: 89 d3 mov %edx,%ebx
c103b921: 83 ec 50 sub $0x50,%esp
c103b924: 89 45 a4 mov %eax,-0x5c(%ebp)
c103b927: 8d 45 ac lea -0x54(%ebp),%eax
c103b92a: e8 e1 fd ff ff call c103b710 <perf_fetch_caller_regs>
c103b92f: 8b 45 a4 mov -0x5c(%ebp),%eax
c103b932: 8d 4d ac lea -0x54(%ebp),%ecx
c103b935: 0f b7 50 24 movzwl 0x24(%eax),%edx
c103b939: 8d 45 f0 lea -0x10(%ebp),%eax
c103b93c: 50 push %eax
c103b93d: b8 24 00 00 00 mov $0x24,%eax
c103b942: e8 fc ff ff ff call c103b943 <perf_trace_hrtimer_start+0x2a>
c103b947: 59 pop %ecx
c103b948: 85 c0 test %eax,%eax
c103b94a: 89 c2 mov %eax,%edx
c103b94c: 74 54 je c103b9a2 <perf_trace_hrtimer_start+0x89>
c103b94e: 89 58 0c mov %ebx,0xc(%eax)
c103b951: 8b 43 1c mov 0x1c(%ebx),%eax
c103b954: 89 42 10 mov %eax,0x10(%edx)
c103b957: 8b 7b 10 mov 0x10(%ebx),%edi
c103b95a: 8b 73 0c mov 0xc(%ebx),%esi
c103b95d: 89 7a 18 mov %edi,0x18(%edx)
c103b960: 89 72 14 mov %esi,0x14(%edx)
return timer->node.expires;
}
static inline ktime_t hrtimer_get_softexpires(const struct hrtimer *timer)
{
return timer->_softexpires;
c103b963: 8b 4b 14 mov 0x14(%ebx),%ecx
c103b966: 8b 5b 18 mov 0x18(%ebx),%ebx
c103b969: 89 4a 1c mov %ecx,0x1c(%edx)
c103b96c: 89 5a 20 mov %ebx,0x20(%edx)
c103b96f: 8b 7d a4 mov -0x5c(%ebp),%edi
c103b972: 8b 5f 44 mov 0x44(%edi),%ebx
c103b975: 89 55 a8 mov %edx,-0x58(%ebp)
c103b978: e8 fc ff ff ff call c103b979 <perf_trace_hrtimer_start+0x60>
c103b97d: 8b 55 a8 mov -0x58(%ebp),%edx
c103b980: ff 75 f0 pushl -0x10(%ebp)
c103b983: 03 1c 85 00 00 00 00 add 0x0(,%eax,4),%ebx
c103b98a: 8d 45 ac lea -0x54(%ebp),%eax
c103b98d: 53 push %ebx
c103b98e: 50 push %eax
c103b98f: 31 c0 xor %eax,%eax
c103b991: 6a 24 push $0x24
c103b993: 52 push %edx
c103b994: 31 d2 xor %edx,%edx
c103b996: 6a 00 push $0x0
c103b998: 6a 01 push $0x1
c103b99a: e8 fc ff ff ff call c103b99b <perf_trace_hrtimer_start+0x82>
c103b99f: 83 c4 1c add $0x1c,%esp
__entry->hrtimer, __entry->function,
(unsigned long long)ktime_to_ns((ktime_t) {
.tv64 = __entry->expires }),
(unsigned long long)ktime_to_ns((ktime_t) {
.tv64 = __entry->softexpires }))
);
c103b9a2: 8d 65 f4 lea -0xc(%ebp),%esp
c103b9a5: 5b pop %ebx
c103b9a6: 5e pop %esi
c103b9a7: 5f pop %edi
c103b9a8: 5d pop %ebp
c103b9a9: c3 ret
c103b9aa <perf_trace_hrtimer_expire_entry>:
* @now: pointer to variable which contains current time of the
* timers base.
*
* Allows to determine the timer latency.
*/
TRACE_EVENT(hrtimer_expire_entry,
c103b9aa: 55 push %ebp
c103b9ab: 89 e5 mov %esp,%ebp
c103b9ad: 57 push %edi
c103b9ae: 89 c7 mov %eax,%edi
c103b9b0: 56 push %esi
c103b9b1: 89 ce mov %ecx,%esi
c103b9b3: 53 push %ebx
c103b9b4: 83 ec 50 sub $0x50,%esp
c103b9b7: 8d 45 ac lea -0x54(%ebp),%eax
c103b9ba: 89 55 a4 mov %edx,-0x5c(%ebp)
c103b9bd: e8 4e fd ff ff call c103b710 <perf_fetch_caller_regs>
c103b9c2: 0f b7 57 24 movzwl 0x24(%edi),%edx
c103b9c6: 8d 45 f0 lea -0x10(%ebp),%eax
c103b9c9: 8d 4d ac lea -0x54(%ebp),%ecx
c103b9cc: 50 push %eax
c103b9cd: b8 1c 00 00 00 mov $0x1c,%eax
c103b9d2: e8 fc ff ff ff call c103b9d3 <perf_trace_hrtimer_expire_entry+0x29>
c103b9d7: 5b pop %ebx
c103b9d8: 85 c0 test %eax,%eax
c103b9da: 89 c2 mov %eax,%edx
c103b9dc: 74 4a je c103ba28 <perf_trace_hrtimer_expire_entry+0x7e>
c103b9de: 8b 45 a4 mov -0x5c(%ebp),%eax
c103b9e1: 89 42 0c mov %eax,0xc(%edx)
c103b9e4: 8b 0e mov (%esi),%ecx
c103b9e6: 8b 5e 04 mov 0x4(%esi),%ebx
c103b9e9: 89 4a 10 mov %ecx,0x10(%edx)
c103b9ec: 89 5a 14 mov %ebx,0x14(%edx)
c103b9ef: 8b 5d a4 mov -0x5c(%ebp),%ebx
c103b9f2: 8b 43 1c mov 0x1c(%ebx),%eax
c103b9f5: 89 42 18 mov %eax,0x18(%edx)
c103b9f8: 8b 5f 44 mov 0x44(%edi),%ebx
c103b9fb: 89 55 a8 mov %edx,-0x58(%ebp)
c103b9fe: e8 fc ff ff ff call c103b9ff <perf_trace_hrtimer_expire_entry+0x55>
c103ba03: 8b 55 a8 mov -0x58(%ebp),%edx
c103ba06: ff 75 f0 pushl -0x10(%ebp)
c103ba09: 03 1c 85 00 00 00 00 add 0x0(,%eax,4),%ebx
c103ba10: 8d 45 ac lea -0x54(%ebp),%eax
c103ba13: 53 push %ebx
c103ba14: 50 push %eax
c103ba15: 31 c0 xor %eax,%eax
c103ba17: 6a 1c push $0x1c
c103ba19: 52 push %edx
c103ba1a: 31 d2 xor %edx,%edx
c103ba1c: 6a 00 push $0x0
c103ba1e: 6a 01 push $0x1
c103ba20: e8 fc ff ff ff call c103ba21 <perf_trace_hrtimer_expire_entry+0x77>
c103ba25: 83 c4 1c add $0x1c,%esp
__entry->function = hrtimer->function;
),
TP_printk("hrtimer=%p function=%pf now=%llu", __entry->hrtimer, __entry->function,
(unsigned long long)ktime_to_ns((ktime_t) { .tv64 = __entry->now }))
);
c103ba28: 8d 65 f4 lea -0xc(%ebp),%esp
c103ba2b: 5b pop %ebx
c103ba2c: 5e pop %esi
c103ba2d: 5f pop %edi
c103ba2e: 5d pop %ebp
c103ba2f: c3 ret
c103ba30 <perf_trace_hrtimer_class>:
DECLARE_EVENT_CLASS(hrtimer_class,
c103ba30: 55 push %ebp
c103ba31: 89 e5 mov %esp,%ebp
c103ba33: 57 push %edi
c103ba34: 89 d7 mov %edx,%edi
c103ba36: 56 push %esi
c103ba37: 53 push %ebx
c103ba38: 89 c3 mov %eax,%ebx
c103ba3a: 8d 75 ac lea -0x54(%ebp),%esi
c103ba3d: 83 ec 4c sub $0x4c,%esp
c103ba40: 89 f0 mov %esi,%eax
c103ba42: e8 c9 fc ff ff call c103b710 <perf_fetch_caller_regs>
c103ba47: 0f b7 53 24 movzwl 0x24(%ebx),%edx
c103ba4b: 8d 45 f0 lea -0x10(%ebp),%eax
c103ba4e: 89 f1 mov %esi,%ecx
c103ba50: 50 push %eax
c103ba51: b8 14 00 00 00 mov $0x14,%eax
c103ba56: e8 fc ff ff ff call c103ba57 <perf_trace_hrtimer_class+0x27>
c103ba5b: 89 c2 mov %eax,%edx
c103ba5d: 85 d2 test %edx,%edx
c103ba5f: 58 pop %eax
c103ba60: 74 30 je c103ba92 <perf_trace_hrtimer_class+0x62>
c103ba62: 89 7a 0c mov %edi,0xc(%edx)
c103ba65: 8b 5b 44 mov 0x44(%ebx),%ebx
c103ba68: 89 55 a8 mov %edx,-0x58(%ebp)
c103ba6b: e8 fc ff ff ff call c103ba6c <perf_trace_hrtimer_class+0x3c>
c103ba70: 8b 55 a8 mov -0x58(%ebp),%edx
c103ba73: ff 75 f0 pushl -0x10(%ebp)
c103ba76: 03 1c 85 00 00 00 00 add 0x0(,%eax,4),%ebx
c103ba7d: 31 c0 xor %eax,%eax
c103ba7f: 53 push %ebx
c103ba80: 56 push %esi
c103ba81: 6a 14 push $0x14
c103ba83: 52 push %edx
c103ba84: 31 d2 xor %edx,%edx
c103ba86: 6a 00 push $0x0
c103ba88: 6a 01 push $0x1
c103ba8a: e8 fc ff ff ff call c103ba8b <perf_trace_hrtimer_class+0x5b>
c103ba8f: 83 c4 1c add $0x1c,%esp
TP_fast_assign(
__entry->hrtimer = hrtimer;
),
TP_printk("hrtimer=%p", __entry->hrtimer)
);
c103ba92: 8d 65 f4 lea -0xc(%ebp),%esp
c103ba95: 5b pop %ebx
c103ba96: 5e pop %esi
c103ba97: 5f pop %edi
c103ba98: 5d pop %ebp
c103ba99: c3 ret
c103ba9a <perf_trace_itimer_state>:
* @which: name of the interval timer
* @value: the itimers value, itimer is canceled if value->it_value is
* zero, otherwise it is started
* @expires: the itimers expiry time
*/
TRACE_EVENT(itimer_state,
c103ba9a: 55 push %ebp
c103ba9b: 89 e5 mov %esp,%ebp
c103ba9d: 57 push %edi
c103ba9e: 56 push %esi
c103ba9f: 89 c6 mov %eax,%esi
c103baa1: 53 push %ebx
c103baa2: 89 cb mov %ecx,%ebx
c103baa4: 8d 7d ac lea -0x54(%ebp),%edi
c103baa7: 83 ec 50 sub $0x50,%esp
c103baaa: 89 f8 mov %edi,%eax
c103baac: 89 55 a8 mov %edx,-0x58(%ebp)
c103baaf: e8 5c fc ff ff call c103b710 <perf_fetch_caller_regs>
c103bab4: 0f b7 56 24 movzwl 0x24(%esi),%edx
c103bab8: 8d 45 f0 lea -0x10(%ebp),%eax
c103babb: 89 f9 mov %edi,%ecx
c103babd: 50 push %eax
c103babe: b8 24 00 00 00 mov $0x24,%eax
c103bac3: e8 fc ff ff ff call c103bac4 <perf_trace_itimer_state+0x2a>
c103bac8: 59 pop %ecx
c103bac9: 85 c0 test %eax,%eax
c103bacb: 89 c2 mov %eax,%edx
c103bacd: 74 50 je c103bb1f <perf_trace_itimer_state+0x85>
c103bacf: 8b 45 a8 mov -0x58(%ebp),%eax
c103bad2: 89 42 0c mov %eax,0xc(%edx)
c103bad5: 8b 45 08 mov 0x8(%ebp),%eax
c103bad8: 89 42 10 mov %eax,0x10(%edx)
c103badb: 8b 43 08 mov 0x8(%ebx),%eax
c103bade: 89 42 14 mov %eax,0x14(%edx)
c103bae1: 8b 43 0c mov 0xc(%ebx),%eax
c103bae4: 89 42 18 mov %eax,0x18(%edx)
c103bae7: 8b 03 mov (%ebx),%eax
c103bae9: 89 42 1c mov %eax,0x1c(%edx)
c103baec: 8b 43 04 mov 0x4(%ebx),%eax
c103baef: 89 42 20 mov %eax,0x20(%edx)
c103baf2: 8b 5e 44 mov 0x44(%esi),%ebx
c103baf5: 89 55 a4 mov %edx,-0x5c(%ebp)
c103baf8: e8 fc ff ff ff call c103baf9 <perf_trace_itimer_state+0x5f>
c103bafd: 8b 55 a4 mov -0x5c(%ebp),%edx
c103bb00: ff 75 f0 pushl -0x10(%ebp)
c103bb03: 03 1c 85 00 00 00 00 add 0x0(,%eax,4),%ebx
c103bb0a: 31 c0 xor %eax,%eax
c103bb0c: 53 push %ebx
c103bb0d: 57 push %edi
c103bb0e: 6a 24 push $0x24
c103bb10: 52 push %edx
c103bb11: 31 d2 xor %edx,%edx
c103bb13: 6a 00 push $0x0
c103bb15: 6a 01 push $0x1
c103bb17: e8 fc ff ff ff call c103bb18 <perf_trace_itimer_state+0x7e>
c103bb1c: 83 c4 1c add $0x1c,%esp
TP_printk("which=%d expires=%llu it_value=%ld.%ld it_interval=%ld.%ld",
__entry->which, (unsigned long long)__entry->expires,
__entry->value_sec, __entry->value_usec,
__entry->interval_sec, __entry->interval_usec)
);
c103bb1f: 8d 65 f4 lea -0xc(%ebp),%esp
c103bb22: 5b pop %ebx
c103bb23: 5e pop %esi
c103bb24: 5f pop %edi
c103bb25: 5d pop %ebp
c103bb26: c3 ret
c103bb27 <perf_trace_itimer_expire>:
* itimer_expire - called when itimer expires
* @which: type of the interval timer
* @pid: pid of the process which owns the timer
* @now: current time, used to calculate the latency of itimer
*/
TRACE_EVENT(itimer_expire,
c103bb27: 55 push %ebp
c103bb28: 89 e5 mov %esp,%ebp
c103bb2a: 57 push %edi
c103bb2b: 56 push %esi
c103bb2c: 89 c6 mov %eax,%esi
c103bb2e: 53 push %ebx
c103bb2f: 89 cb mov %ecx,%ebx
c103bb31: 8d 7d ac lea -0x54(%ebp),%edi
c103bb34: 83 ec 4c sub $0x4c,%esp
c103bb37: 89 f8 mov %edi,%eax
c103bb39: 89 55 a8 mov %edx,-0x58(%ebp)
c103bb3c: e8 cf fb ff ff call c103b710 <perf_fetch_caller_regs>
c103bb41: 0f b7 56 24 movzwl 0x24(%esi),%edx
c103bb45: 8d 45 f0 lea -0x10(%ebp),%eax
c103bb48: 89 f9 mov %edi,%ecx
c103bb4a: 50 push %eax
c103bb4b: b8 1c 00 00 00 mov $0x1c,%eax
c103bb50: e8 fc ff ff ff call c103bb51 <perf_trace_itimer_expire+0x2a>
c103bb55: 89 c7 mov %eax,%edi
c103bb57: 85 ff test %edi,%edi
c103bb59: 58 pop %eax
c103bb5a: 74 42 je c103bb9e <perf_trace_itimer_expire+0x77>
c103bb5c: 8b 45 a8 mov -0x58(%ebp),%eax
c103bb5f: 89 47 0c mov %eax,0xc(%edi)
c103bb62: 8b 45 08 mov 0x8(%ebp),%eax
c103bb65: 89 47 14 mov %eax,0x14(%edi)
*/
static inline pid_t pid_nr(struct pid *pid)
{
pid_t nr = 0;
if (pid)
c103bb68: 31 c0 xor %eax,%eax
c103bb6a: 85 db test %ebx,%ebx
c103bb6c: 74 03 je c103bb71 <perf_trace_itimer_expire+0x4a>
nr = pid->numbers[0].nr;
c103bb6e: 8b 43 1c mov 0x1c(%ebx),%eax
c103bb71: 89 47 10 mov %eax,0x10(%edi)
c103bb74: 8b 5e 44 mov 0x44(%esi),%ebx
c103bb77: e8 fc ff ff ff call c103bb78 <perf_trace_itimer_expire+0x51>
c103bb7c: 31 d2 xor %edx,%edx
c103bb7e: ff 75 f0 pushl -0x10(%ebp)
c103bb81: 03 1c 85 00 00 00 00 add 0x0(,%eax,4),%ebx
c103bb88: 8d 45 ac lea -0x54(%ebp),%eax
c103bb8b: 53 push %ebx
c103bb8c: 50 push %eax
c103bb8d: 31 c0 xor %eax,%eax
c103bb8f: 6a 1c push $0x1c
c103bb91: 57 push %edi
c103bb92: 6a 00 push $0x0
c103bb94: 6a 01 push $0x1
c103bb96: e8 fc ff ff ff call c103bb97 <perf_trace_itimer_expire+0x70>
c103bb9b: 83 c4 1c add $0x1c,%esp
__entry->pid = pid_nr(pid);
),
TP_printk("which=%d pid=%d now=%llu", __entry->which,
(int) __entry->pid, (unsigned long long)__entry->now)
);
c103bb9e: 8d 65 f4 lea -0xc(%ebp),%esp
c103bba1: 5b pop %ebx
c103bba2: 5e pop %esi
c103bba3: 5f pop %edi
c103bba4: 5d pop %ebp
c103bba5: c3 ret
c103bba6 <ftrace_raw_event_timer_class>:
#include <linux/tracepoint.h>
#include <linux/hrtimer.h>
#include <linux/timer.h>
DECLARE_EVENT_CLASS(timer_class,
c103bba6: 55 push %ebp
c103bba7: 89 e5 mov %esp,%ebp
c103bba9: 57 push %edi
c103bbaa: 56 push %esi
c103bbab: 89 c6 mov %eax,%esi
c103bbad: 53 push %ebx
c103bbae: 83 ec 0c sub $0xc,%esp
c103bbb1: 89 55 e8 mov %edx,-0x18(%ebp)
/*
* "=rm" is safe here, because "pop" adjusts the stack before
* it evaluates its effective address -- this is part of the
* documented behavior of the "pop" instruction.
*/
asm volatile("# __raw_save_flags\n\t"
c103bbb4: 9c pushf
c103bbb5: 8f 45 ec popl -0x14(%ebp)
c103bbb8: 89 e0 mov %esp,%eax
c103bbba: 8b 56 24 mov 0x24(%esi),%edx
c103bbbd: b9 10 00 00 00 mov $0x10,%ecx
c103bbc2: 25 00 e0 ff ff and $0xffffe000,%eax
c103bbc7: 8b 78 14 mov 0x14(%eax),%edi
c103bbca: 8d 45 f0 lea -0x10(%ebp),%eax
c103bbcd: 57 push %edi
c103bbce: ff 75 ec pushl -0x14(%ebp)
c103bbd1: e8 fc ff ff ff call c103bbd2 <ftrace_raw_event_timer_class+0x2c>
c103bbd6: 89 c3 mov %eax,%ebx
c103bbd8: 85 db test %ebx,%ebx
c103bbda: 58 pop %eax
c103bbdb: 5a pop %edx
c103bbdc: 74 2e je c103bc0c <ftrace_raw_event_timer_class+0x66>
c103bbde: 89 d8 mov %ebx,%eax
c103bbe0: e8 fc ff ff ff call c103bbe1 <ftrace_raw_event_timer_class+0x3b>
c103bbe5: 8b 55 e8 mov -0x18(%ebp),%edx
c103bbe8: 89 c1 mov %eax,%ecx
c103bbea: 89 50 0c mov %edx,0xc(%eax)
c103bbed: 8b 45 f0 mov -0x10(%ebp),%eax
c103bbf0: 89 f2 mov %esi,%edx
c103bbf2: 53 push %ebx
c103bbf3: e8 fc ff ff ff call c103bbf4 <ftrace_raw_event_timer_class+0x4e>
c103bbf8: 59 pop %ecx
c103bbf9: 85 c0 test %eax,%eax
c103bbfb: 75 0f jne c103bc0c <ftrace_raw_event_timer_class+0x66>
c103bbfd: 8b 4d ec mov -0x14(%ebp),%ecx
c103bc00: 89 da mov %ebx,%edx
c103bc02: 8b 45 f0 mov -0x10(%ebp),%eax
c103bc05: 57 push %edi
c103bc06: e8 fc ff ff ff call c103bc07 <ftrace_raw_event_timer_class+0x61>
c103bc0b: 5a pop %edx
c103bc0c: 8d 65 f4 lea -0xc(%ebp),%esp
c103bc0f: 5b pop %ebx
c103bc10: 5e pop %esi
c103bc11: 5f pop %edi
c103bc12: 5d pop %ebp
c103bc13: c3 ret
c103bc14 <ftrace_raw_event_timer_start>:
/**
* timer_start - called when the timer is started
* @timer: pointer to struct timer_list
* @expires: the timers expiry time
*/
TRACE_EVENT(timer_start,
c103bc14: 55 push %ebp
c103bc15: 89 e5 mov %esp,%ebp
c103bc17: 57 push %edi
c103bc18: 89 c7 mov %eax,%edi
c103bc1a: 56 push %esi
c103bc1b: 53 push %ebx
c103bc1c: 89 d3 mov %edx,%ebx
c103bc1e: 83 ec 10 sub $0x10,%esp
c103bc21: 89 4d e4 mov %ecx,-0x1c(%ebp)
c103bc24: 9c pushf
c103bc25: 8f 45 e8 popl -0x18(%ebp)
c103bc28: 89 e0 mov %esp,%eax
c103bc2a: 8b 57 24 mov 0x24(%edi),%edx
c103bc2d: b9 1c 00 00 00 mov $0x1c,%ecx
c103bc32: 25 00 e0 ff ff and $0xffffe000,%eax
c103bc37: 8b 40 14 mov 0x14(%eax),%eax
c103bc3a: 89 45 ec mov %eax,-0x14(%ebp)
c103bc3d: 8d 45 f0 lea -0x10(%ebp),%eax
c103bc40: ff 75 ec pushl -0x14(%ebp)
c103bc43: ff 75 e8 pushl -0x18(%ebp)
c103bc46: e8 fc ff ff ff call c103bc47 <ftrace_raw_event_timer_start+0x33>
c103bc4b: 89 c6 mov %eax,%esi
c103bc4d: 85 f6 test %esi,%esi
c103bc4f: 58 pop %eax
c103bc50: 5a pop %edx
c103bc51: 74 42 je c103bc95 <ftrace_raw_event_timer_start+0x81>
c103bc53: 89 f0 mov %esi,%eax
c103bc55: e8 fc ff ff ff call c103bc56 <ftrace_raw_event_timer_start+0x42>
c103bc5a: 89 58 0c mov %ebx,0xc(%eax)
c103bc5d: 8b 53 10 mov 0x10(%ebx),%edx
c103bc60: 89 c1 mov %eax,%ecx
c103bc62: 89 50 10 mov %edx,0x10(%eax)
c103bc65: 8b 55 e4 mov -0x1c(%ebp),%edx
c103bc68: 89 50 14 mov %edx,0x14(%eax)
c103bc6b: 8b 15 00 00 00 00 mov 0x0,%edx
c103bc71: 89 50 18 mov %edx,0x18(%eax)
c103bc74: 8b 45 f0 mov -0x10(%ebp),%eax
c103bc77: 89 fa mov %edi,%edx
c103bc79: 56 push %esi
c103bc7a: e8 fc ff ff ff call c103bc7b <ftrace_raw_event_timer_start+0x67>
c103bc7f: 5b pop %ebx
c103bc80: 85 c0 test %eax,%eax
c103bc82: 75 11 jne c103bc95 <ftrace_raw_event_timer_start+0x81>
c103bc84: 8b 4d e8 mov -0x18(%ebp),%ecx
c103bc87: 89 f2 mov %esi,%edx
c103bc89: ff 75 ec pushl -0x14(%ebp)
c103bc8c: 8b 45 f0 mov -0x10(%ebp),%eax
c103bc8f: e8 fc ff ff ff call c103bc90 <ftrace_raw_event_timer_start+0x7c>
c103bc94: 59 pop %ecx
c103bc95: 8d 65 f4 lea -0xc(%ebp),%esp
c103bc98: 5b pop %ebx
c103bc99: 5e pop %esi
c103bc9a: 5f pop %edi
c103bc9b: 5d pop %ebp
c103bc9c: c3 ret
c103bc9d <ftrace_raw_event_timer_expire_entry>:
* timer_expire_entry - called immediately before the timer callback
* @timer: pointer to struct timer_list
*
* Allows to determine the timer latency.
*/
TRACE_EVENT(timer_expire_entry,
c103bc9d: 55 push %ebp
c103bc9e: 89 e5 mov %esp,%ebp
c103bca0: 57 push %edi
c103bca1: 89 c7 mov %eax,%edi
c103bca3: 56 push %esi
c103bca4: 53 push %ebx
c103bca5: 89 d3 mov %edx,%ebx
c103bca7: 83 ec 0c sub $0xc,%esp
c103bcaa: 9c pushf
c103bcab: 8f 45 e8 popl -0x18(%ebp)
c103bcae: 89 e0 mov %esp,%eax
c103bcb0: 8b 57 24 mov 0x24(%edi),%edx
c103bcb3: b9 18 00 00 00 mov $0x18,%ecx
c103bcb8: 25 00 e0 ff ff and $0xffffe000,%eax
c103bcbd: 8b 40 14 mov 0x14(%eax),%eax
c103bcc0: 89 45 ec mov %eax,-0x14(%ebp)
c103bcc3: 8d 45 f0 lea -0x10(%ebp),%eax
c103bcc6: ff 75 ec pushl -0x14(%ebp)
c103bcc9: ff 75 e8 pushl -0x18(%ebp)
c103bccc: e8 fc ff ff ff call c103bccd <ftrace_raw_event_timer_expire_entry+0x30>
c103bcd1: 89 c6 mov %eax,%esi
c103bcd3: 85 f6 test %esi,%esi
c103bcd5: 58 pop %eax
c103bcd6: 5a pop %edx
c103bcd7: 74 3c je c103bd15 <ftrace_raw_event_timer_expire_entry+0x78>
c103bcd9: 89 f0 mov %esi,%eax
c103bcdb: e8 fc ff ff ff call c103bcdc <ftrace_raw_event_timer_expire_entry+0x3f>
c103bce0: 89 58 0c mov %ebx,0xc(%eax)
c103bce3: 8b 15 00 00 00 00 mov 0x0,%edx
c103bce9: 89 c1 mov %eax,%ecx
c103bceb: 89 50 10 mov %edx,0x10(%eax)
c103bcee: 8b 53 10 mov 0x10(%ebx),%edx
c103bcf1: 89 50 14 mov %edx,0x14(%eax)
c103bcf4: 8b 45 f0 mov -0x10(%ebp),%eax
c103bcf7: 89 fa mov %edi,%edx
c103bcf9: 56 push %esi
c103bcfa: e8 fc ff ff ff call c103bcfb <ftrace_raw_event_timer_expire_entry+0x5e>
c103bcff: 5b pop %ebx
c103bd00: 85 c0 test %eax,%eax
c103bd02: 75 11 jne c103bd15 <ftrace_raw_event_timer_expire_entry+0x78>
c103bd04: 8b 4d e8 mov -0x18(%ebp),%ecx
c103bd07: 89 f2 mov %esi,%edx
c103bd09: ff 75 ec pushl -0x14(%ebp)
c103bd0c: 8b 45 f0 mov -0x10(%ebp),%eax
c103bd0f: e8 fc ff ff ff call c103bd10 <ftrace_raw_event_timer_expire_entry+0x73>
c103bd14: 59 pop %ecx
c103bd15: 8d 65 f4 lea -0xc(%ebp),%esp
c103bd18: 5b pop %ebx
c103bd19: 5e pop %esi
c103bd1a: 5f pop %edi
c103bd1b: 5d pop %ebp
c103bd1c: c3 ret
c103bd1d <ftrace_raw_event_hrtimer_init>:
* hrtimer_init - called when the hrtimer is initialized
* @timer: pointer to struct hrtimer
* @clockid: the hrtimers clock
* @mode: the hrtimers mode
*/
TRACE_EVENT(hrtimer_init,
c103bd1d: 55 push %ebp
c103bd1e: 89 e5 mov %esp,%ebp
c103bd20: 57 push %edi
c103bd21: 56 push %esi
c103bd22: 89 c6 mov %eax,%esi
c103bd24: 53 push %ebx
c103bd25: 83 ec 10 sub $0x10,%esp
c103bd28: 89 55 e8 mov %edx,-0x18(%ebp)
c103bd2b: 89 4d e4 mov %ecx,-0x1c(%ebp)
c103bd2e: 9c pushf
c103bd2f: 8f 45 ec popl -0x14(%ebp)
c103bd32: 89 e0 mov %esp,%eax
c103bd34: 8b 56 24 mov 0x24(%esi),%edx
c103bd37: b9 18 00 00 00 mov $0x18,%ecx
c103bd3c: 25 00 e0 ff ff and $0xffffe000,%eax
c103bd41: 8b 78 14 mov 0x14(%eax),%edi
c103bd44: 8d 45 f0 lea -0x10(%ebp),%eax
c103bd47: 57 push %edi
c103bd48: ff 75 ec pushl -0x14(%ebp)
c103bd4b: e8 fc ff ff ff call c103bd4c <ftrace_raw_event_hrtimer_init+0x2f>
c103bd50: 89 c3 mov %eax,%ebx
c103bd52: 85 db test %ebx,%ebx
c103bd54: 58 pop %eax
c103bd55: 5a pop %edx
c103bd56: 74 3a je c103bd92 <ftrace_raw_event_hrtimer_init+0x75>
c103bd58: 89 d8 mov %ebx,%eax
c103bd5a: e8 fc ff ff ff call c103bd5b <ftrace_raw_event_hrtimer_init+0x3e>
c103bd5f: 8b 55 e8 mov -0x18(%ebp),%edx
c103bd62: 89 50 0c mov %edx,0xc(%eax)
c103bd65: 8b 55 e4 mov -0x1c(%ebp),%edx
c103bd68: 89 c1 mov %eax,%ecx
c103bd6a: 89 50 10 mov %edx,0x10(%eax)
c103bd6d: 8b 55 08 mov 0x8(%ebp),%edx
c103bd70: 89 50 14 mov %edx,0x14(%eax)
c103bd73: 8b 45 f0 mov -0x10(%ebp),%eax
c103bd76: 89 f2 mov %esi,%edx
c103bd78: 53 push %ebx
c103bd79: e8 fc ff ff ff call c103bd7a <ftrace_raw_event_hrtimer_init+0x5d>
c103bd7e: 5e pop %esi
c103bd7f: 85 c0 test %eax,%eax
c103bd81: 75 0f jne c103bd92 <ftrace_raw_event_hrtimer_init+0x75>
c103bd83: 8b 4d ec mov -0x14(%ebp),%ecx
c103bd86: 89 da mov %ebx,%edx
c103bd88: 8b 45 f0 mov -0x10(%ebp),%eax
c103bd8b: 57 push %edi
c103bd8c: e8 fc ff ff ff call c103bd8d <ftrace_raw_event_hrtimer_init+0x70>
c103bd91: 59 pop %ecx
c103bd92: 8d 65 f4 lea -0xc(%ebp),%esp
c103bd95: 5b pop %ebx
c103bd96: 5e pop %esi
c103bd97: 5f pop %edi
c103bd98: 5d pop %ebp
c103bd99: c3 ret
c103bd9a <ftrace_raw_event_hrtimer_start>:
/**
* hrtimer_start - called when the hrtimer is started
* @timer: pointer to struct hrtimer
*/
TRACE_EVENT(hrtimer_start,
c103bd9a: 55 push %ebp
c103bd9b: 89 e5 mov %esp,%ebp
c103bd9d: 57 push %edi
c103bd9e: 89 c7 mov %eax,%edi
c103bda0: 56 push %esi
c103bda1: 53 push %ebx
c103bda2: 89 d3 mov %edx,%ebx
c103bda4: 83 ec 0c sub $0xc,%esp
c103bda7: 9c pushf
c103bda8: 8f 45 e8 popl -0x18(%ebp)
c103bdab: 89 e0 mov %esp,%eax
c103bdad: 8b 57 24 mov 0x24(%edi),%edx
c103bdb0: b9 24 00 00 00 mov $0x24,%ecx
c103bdb5: 25 00 e0 ff ff and $0xffffe000,%eax
c103bdba: 8b 40 14 mov 0x14(%eax),%eax
c103bdbd: 89 45 ec mov %eax,-0x14(%ebp)
c103bdc0: 8d 45 f0 lea -0x10(%ebp),%eax
c103bdc3: ff 75 ec pushl -0x14(%ebp)
c103bdc6: ff 75 e8 pushl -0x18(%ebp)
c103bdc9: e8 fc ff ff ff call c103bdca <ftrace_raw_event_hrtimer_start+0x30>
c103bdce: 89 c6 mov %eax,%esi
c103bdd0: 85 f6 test %esi,%esi
c103bdd2: 58 pop %eax
c103bdd3: 5a pop %edx
c103bdd4: 74 4b je c103be21 <ftrace_raw_event_hrtimer_start+0x87>
c103bdd6: 89 f0 mov %esi,%eax
c103bdd8: e8 fc ff ff ff call c103bdd9 <ftrace_raw_event_hrtimer_start+0x3f>
c103bddd: 89 58 0c mov %ebx,0xc(%eax)
c103bde0: 8b 53 1c mov 0x1c(%ebx),%edx
c103bde3: 89 50 10 mov %edx,0x10(%eax)
timer->_softexpires = ktime_add_ns(timer->_softexpires, ns);
}
static inline ktime_t hrtimer_get_expires(const struct hrtimer *timer)
{
return timer->node.expires;
c103bde6: 8b 53 0c mov 0xc(%ebx),%edx
c103bde9: 8b 4b 10 mov 0x10(%ebx),%ecx
c103bdec: 89 50 14 mov %edx,0x14(%eax)
c103bdef: 89 48 18 mov %ecx,0x18(%eax)
}
static inline ktime_t hrtimer_get_softexpires(const struct hrtimer *timer)
{
return timer->_softexpires;
c103bdf2: 8b 53 14 mov 0x14(%ebx),%edx
c103bdf5: 8b 4b 18 mov 0x18(%ebx),%ecx
c103bdf8: 89 50 1c mov %edx,0x1c(%eax)
c103bdfb: 89 fa mov %edi,%edx
c103bdfd: 89 48 20 mov %ecx,0x20(%eax)
c103be00: 89 c1 mov %eax,%ecx
c103be02: 8b 45 f0 mov -0x10(%ebp),%eax
c103be05: 56 push %esi
c103be06: e8 fc ff ff ff call c103be07 <ftrace_raw_event_hrtimer_start+0x6d>
c103be0b: 5b pop %ebx
c103be0c: 85 c0 test %eax,%eax
c103be0e: 75 11 jne c103be21 <ftrace_raw_event_hrtimer_start+0x87>
c103be10: 8b 4d e8 mov -0x18(%ebp),%ecx
c103be13: 89 f2 mov %esi,%edx
c103be15: ff 75 ec pushl -0x14(%ebp)
c103be18: 8b 45 f0 mov -0x10(%ebp),%eax
c103be1b: e8 fc ff ff ff call c103be1c <ftrace_raw_event_hrtimer_start+0x82>
c103be20: 59 pop %ecx
c103be21: 8d 65 f4 lea -0xc(%ebp),%esp
c103be24: 5b pop %ebx
c103be25: 5e pop %esi
c103be26: 5f pop %edi
c103be27: 5d pop %ebp
c103be28: c3 ret
c103be29 <ftrace_raw_event_hrtimer_expire_entry>:
* @now: pointer to variable which contains current time of the
* timers base.
*
* Allows to determine the timer latency.
*/
TRACE_EVENT(hrtimer_expire_entry,
c103be29: 55 push %ebp
c103be2a: 89 e5 mov %esp,%ebp
c103be2c: 57 push %edi
c103be2d: 89 c7 mov %eax,%edi
c103be2f: 56 push %esi
c103be30: 53 push %ebx
c103be31: 89 d3 mov %edx,%ebx
c103be33: 83 ec 10 sub $0x10,%esp
c103be36: 89 4d e4 mov %ecx,-0x1c(%ebp)
c103be39: 9c pushf
c103be3a: 8f 45 e8 popl -0x18(%ebp)
c103be3d: 89 e0 mov %esp,%eax
c103be3f: 8b 57 24 mov 0x24(%edi),%edx
c103be42: b9 1c 00 00 00 mov $0x1c,%ecx
c103be47: 25 00 e0 ff ff and $0xffffe000,%eax
c103be4c: 8b 40 14 mov 0x14(%eax),%eax
c103be4f: 89 45 ec mov %eax,-0x14(%ebp)
c103be52: 8d 45 f0 lea -0x10(%ebp),%eax
c103be55: ff 75 ec pushl -0x14(%ebp)
c103be58: ff 75 e8 pushl -0x18(%ebp)
c103be5b: e8 fc ff ff ff call c103be5c <ftrace_raw_event_hrtimer_expire_entry+0x33>
c103be60: 89 c6 mov %eax,%esi
c103be62: 85 f6 test %esi,%esi
c103be64: 58 pop %eax
c103be65: 5a pop %edx
c103be66: 74 41 je c103bea9 <ftrace_raw_event_hrtimer_expire_entry+0x80>
c103be68: 89 f0 mov %esi,%eax
c103be6a: e8 fc ff ff ff call c103be6b <ftrace_raw_event_hrtimer_expire_entry+0x42>
c103be6f: 89 58 0c mov %ebx,0xc(%eax)
c103be72: 8b 4d e4 mov -0x1c(%ebp),%ecx
c103be75: 8b 11 mov (%ecx),%edx
c103be77: 8b 49 04 mov 0x4(%ecx),%ecx
c103be7a: 89 50 10 mov %edx,0x10(%eax)
c103be7d: 89 48 14 mov %ecx,0x14(%eax)
c103be80: 8b 53 1c mov 0x1c(%ebx),%edx
c103be83: 89 c1 mov %eax,%ecx
c103be85: 89 50 18 mov %edx,0x18(%eax)
c103be88: 8b 45 f0 mov -0x10(%ebp),%eax
c103be8b: 89 fa mov %edi,%edx
c103be8d: 56 push %esi
c103be8e: e8 fc ff ff ff call c103be8f <ftrace_raw_event_hrtimer_expire_entry+0x66>
c103be93: 5b pop %ebx
c103be94: 85 c0 test %eax,%eax
c103be96: 75 11 jne c103bea9 <ftrace_raw_event_hrtimer_expire_entry+0x80>
c103be98: 8b 4d e8 mov -0x18(%ebp),%ecx
c103be9b: 89 f2 mov %esi,%edx
c103be9d: ff 75 ec pushl -0x14(%ebp)
c103bea0: 8b 45 f0 mov -0x10(%ebp),%eax
c103bea3: e8 fc ff ff ff call c103bea4 <ftrace_raw_event_hrtimer_expire_entry+0x7b>
c103bea8: 59 pop %ecx
c103bea9: 8d 65 f4 lea -0xc(%ebp),%esp
c103beac: 5b pop %ebx
c103bead: 5e pop %esi
c103beae: 5f pop %edi
c103beaf: 5d pop %ebp
c103beb0: c3 ret
c103beb1 <ftrace_raw_event_hrtimer_class>:
TP_printk("hrtimer=%p function=%pf now=%llu", __entry->hrtimer, __entry->function,
(unsigned long long)ktime_to_ns((ktime_t) { .tv64 = __entry->now }))
);
DECLARE_EVENT_CLASS(hrtimer_class,
c103beb1: 55 push %ebp
c103beb2: 89 e5 mov %esp,%ebp
c103beb4: 57 push %edi
c103beb5: 56 push %esi
c103beb6: 89 c6 mov %eax,%esi
c103beb8: 53 push %ebx
c103beb9: 83 ec 0c sub $0xc,%esp
c103bebc: 89 55 e8 mov %edx,-0x18(%ebp)
c103bebf: 9c pushf
c103bec0: 8f 45 ec popl -0x14(%ebp)
c103bec3: 89 e0 mov %esp,%eax
c103bec5: 8b 56 24 mov 0x24(%esi),%edx
c103bec8: b9 10 00 00 00 mov $0x10,%ecx
c103becd: 25 00 e0 ff ff and $0xffffe000,%eax
c103bed2: 8b 78 14 mov 0x14(%eax),%edi
c103bed5: 8d 45 f0 lea -0x10(%ebp),%eax
c103bed8: 57 push %edi
c103bed9: ff 75 ec pushl -0x14(%ebp)
c103bedc: e8 fc ff ff ff call c103bedd <ftrace_raw_event_hrtimer_class+0x2c>
c103bee1: 89 c3 mov %eax,%ebx
c103bee3: 85 db test %ebx,%ebx
c103bee5: 58 pop %eax
c103bee6: 5a pop %edx
c103bee7: 74 2e je c103bf17 <ftrace_raw_event_hrtimer_class+0x66>
c103bee9: 89 d8 mov %ebx,%eax
c103beeb: e8 fc ff ff ff call c103beec <ftrace_raw_event_hrtimer_class+0x3b>
c103bef0: 8b 55 e8 mov -0x18(%ebp),%edx
c103bef3: 89 c1 mov %eax,%ecx
c103bef5: 89 50 0c mov %edx,0xc(%eax)
c103bef8: 8b 45 f0 mov -0x10(%ebp),%eax
c103befb: 89 f2 mov %esi,%edx
c103befd: 53 push %ebx
c103befe: e8 fc ff ff ff call c103beff <ftrace_raw_event_hrtimer_class+0x4e>
c103bf03: 5e pop %esi
c103bf04: 85 c0 test %eax,%eax
c103bf06: 75 0f jne c103bf17 <ftrace_raw_event_hrtimer_class+0x66>
c103bf08: 8b 4d ec mov -0x14(%ebp),%ecx
c103bf0b: 89 da mov %ebx,%edx
c103bf0d: 8b 45 f0 mov -0x10(%ebp),%eax
c103bf10: 57 push %edi
c103bf11: e8 fc ff ff ff call c103bf12 <ftrace_raw_event_hrtimer_class+0x61>
c103bf16: 59 pop %ecx
c103bf17: 8d 65 f4 lea -0xc(%ebp),%esp
c103bf1a: 5b pop %ebx
c103bf1b: 5e pop %esi
c103bf1c: 5f pop %edi
c103bf1d: 5d pop %ebp
c103bf1e: c3 ret
c103bf1f <ftrace_raw_event_itimer_state>:
* @which: name of the interval timer
* @value: the itimers value, itimer is canceled if value->it_value is
* zero, otherwise it is started
* @expires: the itimers expiry time
*/
TRACE_EVENT(itimer_state,
c103bf1f: 55 push %ebp
c103bf20: 89 e5 mov %esp,%ebp
c103bf22: 57 push %edi
c103bf23: 89 c7 mov %eax,%edi
c103bf25: 56 push %esi
c103bf26: 53 push %ebx
c103bf27: 89 cb mov %ecx,%ebx
c103bf29: 83 ec 10 sub $0x10,%esp
c103bf2c: 89 55 e4 mov %edx,-0x1c(%ebp)
c103bf2f: 9c pushf
c103bf30: 8f 45 e8 popl -0x18(%ebp)
c103bf33: 89 e0 mov %esp,%eax
c103bf35: 8b 57 24 mov 0x24(%edi),%edx
c103bf38: b9 24 00 00 00 mov $0x24,%ecx
c103bf3d: 25 00 e0 ff ff and $0xffffe000,%eax
c103bf42: 8b 40 14 mov 0x14(%eax),%eax
c103bf45: 89 45 ec mov %eax,-0x14(%ebp)
c103bf48: 8d 45 f0 lea -0x10(%ebp),%eax
c103bf4b: ff 75 ec pushl -0x14(%ebp)
c103bf4e: ff 75 e8 pushl -0x18(%ebp)
c103bf51: e8 fc ff ff ff call c103bf52 <ftrace_raw_event_itimer_state+0x33>
c103bf56: 89 c6 mov %eax,%esi
c103bf58: 85 f6 test %esi,%esi
c103bf5a: 58 pop %eax
c103bf5b: 5a pop %edx
c103bf5c: 74 4d je c103bfab <ftrace_raw_event_itimer_state+0x8c>
c103bf5e: 89 f0 mov %esi,%eax
c103bf60: e8 fc ff ff ff call c103bf61 <ftrace_raw_event_itimer_state+0x42>
c103bf65: 8b 55 e4 mov -0x1c(%ebp),%edx
c103bf68: 89 50 0c mov %edx,0xc(%eax)
c103bf6b: 8b 55 08 mov 0x8(%ebp),%edx
c103bf6e: 89 c1 mov %eax,%ecx
c103bf70: 89 50 10 mov %edx,0x10(%eax)
c103bf73: 8b 53 08 mov 0x8(%ebx),%edx
c103bf76: 89 50 14 mov %edx,0x14(%eax)
c103bf79: 8b 53 0c mov 0xc(%ebx),%edx
c103bf7c: 89 50 18 mov %edx,0x18(%eax)
c103bf7f: 8b 13 mov (%ebx),%edx
c103bf81: 89 50 1c mov %edx,0x1c(%eax)
c103bf84: 8b 53 04 mov 0x4(%ebx),%edx
c103bf87: 89 50 20 mov %edx,0x20(%eax)
c103bf8a: 8b 45 f0 mov -0x10(%ebp),%eax
c103bf8d: 89 fa mov %edi,%edx
c103bf8f: 56 push %esi
c103bf90: e8 fc ff ff ff call c103bf91 <ftrace_raw_event_itimer_state+0x72>
c103bf95: 5b pop %ebx
c103bf96: 85 c0 test %eax,%eax
c103bf98: 75 11 jne c103bfab <ftrace_raw_event_itimer_state+0x8c>
c103bf9a: 8b 4d e8 mov -0x18(%ebp),%ecx
c103bf9d: 89 f2 mov %esi,%edx
c103bf9f: ff 75 ec pushl -0x14(%ebp)
c103bfa2: 8b 45 f0 mov -0x10(%ebp),%eax
c103bfa5: e8 fc ff ff ff call c103bfa6 <ftrace_raw_event_itimer_state+0x87>
c103bfaa: 59 pop %ecx
c103bfab: 8d 65 f4 lea -0xc(%ebp),%esp
c103bfae: 5b pop %ebx
c103bfaf: 5e pop %esi
c103bfb0: 5f pop %edi
c103bfb1: 5d pop %ebp
c103bfb2: c3 ret
c103bfb3 <ftrace_raw_event_itimer_expire>:
* itimer_expire - called when itimer expires
* @which: type of the interval timer
* @pid: pid of the process which owns the timer
* @now: current time, used to calculate the latency of itimer
*/
TRACE_EVENT(itimer_expire,
c103bfb3: 55 push %ebp
c103bfb4: 89 e5 mov %esp,%ebp
c103bfb6: 57 push %edi
c103bfb7: 89 cf mov %ecx,%edi
c103bfb9: 56 push %esi
c103bfba: 89 c6 mov %eax,%esi
c103bfbc: 53 push %ebx
c103bfbd: 83 ec 10 sub $0x10,%esp
c103bfc0: 89 55 e4 mov %edx,-0x1c(%ebp)
c103bfc3: 9c pushf
c103bfc4: 8f 45 e8 popl -0x18(%ebp)
c103bfc7: 89 e0 mov %esp,%eax
c103bfc9: b9 18 00 00 00 mov $0x18,%ecx
c103bfce: 25 00 e0 ff ff and $0xffffe000,%eax
c103bfd3: 8b 40 14 mov 0x14(%eax),%eax
c103bfd6: 89 45 ec mov %eax,-0x14(%ebp)
c103bfd9: 8b 56 24 mov 0x24(%esi),%edx
c103bfdc: 8d 45 f0 lea -0x10(%ebp),%eax
c103bfdf: ff 75 ec pushl -0x14(%ebp)
c103bfe2: ff 75 e8 pushl -0x18(%ebp)
c103bfe5: e8 fc ff ff ff call c103bfe6 <ftrace_raw_event_itimer_expire+0x33>
c103bfea: 89 c3 mov %eax,%ebx
c103bfec: 85 db test %ebx,%ebx
c103bfee: 58 pop %eax
c103bfef: 5a pop %edx
c103bff0: 74 42 je c103c034 <ftrace_raw_event_itimer_expire+0x81>
c103bff2: 89 d8 mov %ebx,%eax
c103bff4: e8 fc ff ff ff call c103bff5 <ftrace_raw_event_itimer_expire+0x42>
c103bff9: 8b 55 e4 mov -0x1c(%ebp),%edx
c103bffc: 89 50 0c mov %edx,0xc(%eax)
c103bfff: 8b 55 08 mov 0x8(%ebp),%edx
c103c002: 89 50 14 mov %edx,0x14(%eax)
*/
static inline pid_t pid_nr(struct pid *pid)
{
pid_t nr = 0;
if (pid)
c103c005: 31 d2 xor %edx,%edx
c103c007: 85 ff test %edi,%edi
c103c009: 74 03 je c103c00e <ftrace_raw_event_itimer_expire+0x5b>
nr = pid->numbers[0].nr;
c103c00b: 8b 57 1c mov 0x1c(%edi),%edx
c103c00e: 89 50 10 mov %edx,0x10(%eax)
c103c011: 89 c1 mov %eax,%ecx
c103c013: 8b 45 f0 mov -0x10(%ebp),%eax
c103c016: 89 f2 mov %esi,%edx
c103c018: 53 push %ebx
c103c019: e8 fc ff ff ff call c103c01a <ftrace_raw_event_itimer_expire+0x67>
c103c01e: 5e pop %esi
c103c01f: 85 c0 test %eax,%eax
c103c021: 75 11 jne c103c034 <ftrace_raw_event_itimer_expire+0x81>
c103c023: 8b 4d e8 mov -0x18(%ebp),%ecx
c103c026: 89 da mov %ebx,%edx
c103c028: ff 75 ec pushl -0x14(%ebp)
c103c02b: 8b 45 f0 mov -0x10(%ebp),%eax
c103c02e: e8 fc ff ff ff call c103c02f <ftrace_raw_event_itimer_expire+0x7c>
c103c033: 59 pop %ecx
c103c034: 8d 65 f4 lea -0xc(%ebp),%esp
c103c037: 5b pop %ebx
c103c038: 5e pop %esi
c103c039: 5f pop %edi
c103c03a: 5d pop %ebp
c103c03b: c3 ret
c103c03c <usleep_range>:
* usleep_range - Drop in replacement for udelay where wakeup is flexible
* @min: Minimum time in usecs to sleep
* @max: Maximum time in usecs to sleep
*/
void usleep_range(unsigned long min, unsigned long max)
{
c103c03c: 55 push %ebp
ktime_t kmin;
unsigned long delta;
kmin = ktime_set(0, min * NSEC_PER_USEC);
delta = (max - min) * NSEC_PER_USEC;
return schedule_hrtimeout_range(&kmin, delta, HRTIMER_MODE_REL);
c103c03d: 29 c2 sub %eax,%edx
* usleep_range - Drop in replacement for udelay where wakeup is flexible
* @min: Minimum time in usecs to sleep
* @max: Maximum time in usecs to sleep
*/
void usleep_range(unsigned long min, unsigned long max)
{
c103c03f: 89 e5 mov %esp,%ebp
ktime_t kmin;
unsigned long delta;
kmin = ktime_set(0, min * NSEC_PER_USEC);
delta = (max - min) * NSEC_PER_USEC;
return schedule_hrtimeout_range(&kmin, delta, HRTIMER_MODE_REL);
c103c041: 69 d2 e8 03 00 00 imul $0x3e8,%edx,%edx
* usleep_range - Drop in replacement for udelay where wakeup is flexible
* @min: Minimum time in usecs to sleep
* @max: Maximum time in usecs to sleep
*/
void usleep_range(unsigned long min, unsigned long max)
{
c103c047: 53 push %ebx
{
#if (BITS_PER_LONG == 64)
if (unlikely(secs >= KTIME_SEC_MAX))
return (ktime_t){ .tv64 = KTIME_MAX };
#endif
return (ktime_t) { .tv64 = (s64)secs * NSEC_PER_SEC + (s64)nsecs };
c103c048: 69 d8 e8 03 00 00 imul $0x3e8,%eax,%ebx
c103c04e: 83 ec 08 sub $0x8,%esp
c103c051: 64 8b 0d 00 00 00 00 mov %fs:0x0,%ecx
__set_current_state(TASK_UNINTERRUPTIBLE);
c103c058: c7 01 02 00 00 00 movl $0x2,(%ecx)
c103c05e: 31 c9 xor %ecx,%ecx
static int __sched do_usleep_range(unsigned long min, unsigned long max)
{
ktime_t kmin;
unsigned long delta;
kmin = ktime_set(0, min * NSEC_PER_USEC);
c103c060: 89 4d f8 mov %ecx,-0x8(%ebp)
delta = (max - min) * NSEC_PER_USEC;
return schedule_hrtimeout_range(&kmin, delta, HRTIMER_MODE_REL);
c103c063: 8d 45 f4 lea -0xc(%ebp),%eax
c103c066: b1 01 mov $0x1,%cl
static int __sched do_usleep_range(unsigned long min, unsigned long max)
{
ktime_t kmin;
unsigned long delta;
kmin = ktime_set(0, min * NSEC_PER_USEC);
c103c068: 89 5d f4 mov %ebx,-0xc(%ebp)
delta = (max - min) * NSEC_PER_USEC;
return schedule_hrtimeout_range(&kmin, delta, HRTIMER_MODE_REL);
c103c06b: e8 fc ff ff ff call c103c06c <usleep_range+0x30>
*/
void usleep_range(unsigned long min, unsigned long max)
{
__set_current_state(TASK_UNINTERRUPTIBLE);
do_usleep_range(min, max);
}
c103c070: 59 pop %ecx
c103c071: 5b pop %ebx
c103c072: 5b pop %ebx
c103c073: 5d pop %ebp
c103c074: c3 ret
c103c075 <rcu_read_unlock_sched_notrace>:
preempt_enable();
}
/* Used by lockdep and tracing: cannot be traced, cannot call lockdep. */
static inline notrace void rcu_read_unlock_sched_notrace(void)
{
c103c075: 55 push %ebp
c103c076: 89 e5 mov %esp,%ebp
register unsigned long current_stack_pointer asm("esp") __used;
/* how to get the thread information struct from C */
static inline struct thread_info *current_thread_info(void)
{
return (struct thread_info *)
c103c078: 89 e0 mov %esp,%eax
c103c07a: 25 00 e0 ff ff and $0xffffe000,%eax
__release(RCU_SCHED);
preempt_enable_notrace();
c103c07f: ff 48 14 decl 0x14(%eax)
c103c082: 8b 40 08 mov 0x8(%eax),%eax
c103c085: a8 08 test $0x8,%al
c103c087: 74 05 je c103c08e <rcu_read_unlock_sched_notrace+0x19>
c103c089: e8 fc ff ff ff call c103c08a <rcu_read_unlock_sched_notrace+0x15>
}
c103c08e: 5d pop %ebp
c103c08f: c3 ret
c103c090 <detach_timer>:
}
EXPORT_SYMBOL(init_timer_deferrable_key);
static inline void detach_timer(struct timer_list *timer,
int clear_pending)
{
c103c090: 55 push %ebp
/**
* timer_cancel - called when the timer is canceled
* @timer: pointer to struct timer_list
*/
DEFINE_EVENT(timer_class, timer_cancel,
c103c091: 83 3d 04 00 00 00 00 cmpl $0x0,0x4
c103c098: 89 e5 mov %esp,%ebp
c103c09a: 57 push %edi
c103c09b: 89 d7 mov %edx,%edi
c103c09d: 56 push %esi
c103c09e: 89 c6 mov %eax,%esi
c103c0a0: 53 push %ebx
c103c0a1: 74 28 je c103c0cb <detach_timer+0x3b>
c103c0a3: 89 e0 mov %esp,%eax
c103c0a5: 25 00 e0 ff ff and $0xffffe000,%eax
}
/* Used by lockdep and tracing: cannot be traced, cannot call lockdep. */
static inline notrace void rcu_read_lock_sched_notrace(void)
{
preempt_disable_notrace();
c103c0aa: ff 40 14 incl 0x14(%eax)
c103c0ad: 8b 1d 10 00 00 00 mov 0x10,%ebx
c103c0b3: 85 db test %ebx,%ebx
c103c0b5: 74 0f je c103c0c6 <detach_timer+0x36>
c103c0b7: 8b 43 04 mov 0x4(%ebx),%eax
c103c0ba: 89 f2 mov %esi,%edx
c103c0bc: ff 13 call *(%ebx)
c103c0be: 83 c3 08 add $0x8,%ebx
c103c0c1: 83 3b 00 cmpl $0x0,(%ebx)
c103c0c4: eb ef jmp c103c0b5 <detach_timer+0x25>
c103c0c6: e8 aa ff ff ff call c103c075 <rcu_read_unlock_sched_notrace>
struct list_head *entry = &timer->entry;
debug_deactivate(timer);
__list_del(entry->prev, entry->next);
c103c0cb: 8b 16 mov (%esi),%edx
if (clear_pending)
c103c0cd: 85 ff test %edi,%edi
{
struct list_head *entry = &timer->entry;
debug_deactivate(timer);
__list_del(entry->prev, entry->next);
c103c0cf: 8b 46 04 mov 0x4(%esi),%eax
* This is only for internal list manipulation where we know
* the prev/next entries already!
*/
static inline void __list_del(struct list_head * prev, struct list_head * next)
{
next->prev = prev;
c103c0d2: 89 42 04 mov %eax,0x4(%edx)
prev->next = next;
c103c0d5: 89 10 mov %edx,(%eax)
if (clear_pending)
c103c0d7: 74 06 je c103c0df <detach_timer+0x4f>
entry->next = NULL;
c103c0d9: c7 06 00 00 00 00 movl $0x0,(%esi)
entry->prev = LIST_POISON2;
c103c0df: c7 46 04 00 02 20 00 movl $0x200200,0x4(%esi)
}
c103c0e6: 5b pop %ebx
c103c0e7: 5e pop %esi
c103c0e8: 5f pop %edi
c103c0e9: 5d pop %ebp
c103c0ea: c3 ret
c103c0eb <migrate_timer_list>:
return 0;
}
#ifdef CONFIG_HOTPLUG_CPU
static void migrate_timer_list(struct tvec_base *new_base, struct list_head *head)
{
c103c0eb: 55 push %ebp
c103c0ec: 89 e5 mov %esp,%ebp
c103c0ee: 57 push %edi
c103c0ef: 89 d7 mov %edx,%edi
c103c0f1: 56 push %esi
c103c0f2: 89 c6 mov %eax,%esi
c103c0f4: 53 push %ebx
struct timer_list *timer;
while (!list_empty(head)) {
c103c0f5: eb 2c jmp c103c123 <migrate_timer_list+0x38>
timer = list_first_entry(head, struct timer_list, entry);
detach_timer(timer, 0);
c103c0f7: 31 d2 xor %edx,%edx
c103c0f9: 89 d8 mov %ebx,%eax
c103c0fb: e8 90 ff ff ff call c103c090 <detach_timer>
}
static inline void
timer_set_base(struct timer_list *timer, struct tvec_base *new_base)
{
timer->base = (struct tvec_base *)((unsigned long)(new_base) |
c103c100: 8b 43 0c mov 0xc(%ebx),%eax
while (!list_empty(head)) {
timer = list_first_entry(head, struct timer_list, entry);
detach_timer(timer, 0);
timer_set_base(timer, new_base);
if (time_before(timer->expires, new_base->next_timer) &&
c103c103: 8b 53 08 mov 0x8(%ebx),%edx
}
static inline void
timer_set_base(struct timer_list *timer, struct tvec_base *new_base)
{
timer->base = (struct tvec_base *)((unsigned long)(new_base) |
c103c106: 83 e0 01 and $0x1,%eax
c103c109: 09 f0 or %esi,%eax
c103c10b: 89 43 0c mov %eax,0xc(%ebx)
while (!list_empty(head)) {
timer = list_first_entry(head, struct timer_list, entry);
detach_timer(timer, 0);
timer_set_base(timer, new_base);
if (time_before(timer->expires, new_base->next_timer) &&
c103c10e: 3b 56 0c cmp 0xc(%esi),%edx
c103c111: 79 07 jns c103c11a <migrate_timer_list+0x2f>
c103c113: a8 01 test $0x1,%al
c103c115: 75 03 jne c103c11a <migrate_timer_list+0x2f>
!tbase_get_deferrable(timer->base))
new_base->next_timer = timer->expires;
c103c117: 89 56 0c mov %edx,0xc(%esi)
internal_add_timer(new_base, timer);
c103c11a: 89 da mov %ebx,%edx
c103c11c: 89 f0 mov %esi,%eax
c103c11e: e8 03 eb ff ff call c103ac26 <internal_add_timer>
* list_empty - tests whether a list is empty
* @head: the list to test.
*/
static inline int list_empty(const struct list_head *head)
{
return head->next == head;
c103c123: 8b 1f mov (%edi),%ebx
#ifdef CONFIG_HOTPLUG_CPU
static void migrate_timer_list(struct tvec_base *new_base, struct list_head *head)
{
struct timer_list *timer;
while (!list_empty(head)) {
c103c125: 39 fb cmp %edi,%ebx
c103c127: 75 ce jne c103c0f7 <migrate_timer_list+0xc>
if (time_before(timer->expires, new_base->next_timer) &&
!tbase_get_deferrable(timer->base))
new_base->next_timer = timer->expires;
internal_add_timer(new_base, timer);
}
}
c103c129: 5b pop %ebx
c103c12a: 5e pop %esi
c103c12b: 5f pop %edi
c103c12c: 5d pop %ebp
c103c12d: c3 ret
c103c12e <debug_activate>:
trace_timer_init(timer);
}
static inline void
debug_activate(struct timer_list *timer, unsigned long expires)
{
c103c12e: 55 push %ebp
/**
* timer_start - called when the timer is started
* @timer: pointer to struct timer_list
* @expires: the timers expiry time
*/
TRACE_EVENT(timer_start,
c103c12f: 83 3d 04 00 00 00 00 cmpl $0x0,0x4
c103c136: 89 e5 mov %esp,%ebp
c103c138: 57 push %edi
c103c139: 89 c7 mov %eax,%edi
c103c13b: 56 push %esi
c103c13c: 89 d6 mov %edx,%esi
c103c13e: 53 push %ebx
c103c13f: 74 2a je c103c16b <debug_activate+0x3d>
c103c141: 89 e0 mov %esp,%eax
c103c143: 25 00 e0 ff ff and $0xffffe000,%eax
c103c148: ff 40 14 incl 0x14(%eax)
c103c14b: 8b 1d 10 00 00 00 mov 0x10,%ebx
c103c151: 85 db test %ebx,%ebx
c103c153: 74 11 je c103c166 <debug_activate+0x38>
c103c155: 8b 43 04 mov 0x4(%ebx),%eax
c103c158: 89 f1 mov %esi,%ecx
c103c15a: 89 fa mov %edi,%edx
c103c15c: ff 13 call *(%ebx)
c103c15e: 83 c3 08 add $0x8,%ebx
c103c161: 83 3b 00 cmpl $0x0,(%ebx)
c103c164: eb ed jmp c103c153 <debug_activate+0x25>
c103c166: e8 0a ff ff ff call c103c075 <rcu_read_unlock_sched_notrace>
debug_timer_activate(timer);
trace_timer_start(timer, expires);
}
c103c16b: 5b pop %ebx
c103c16c: 5e pop %esi
c103c16d: 5f pop %edi
c103c16e: 5d pop %ebp
c103c16f: c3 ret
c103c170 <init_timer_key>:
* other timer functions.
*/
void init_timer_key(struct timer_list *timer,
const char *name,
struct lock_class_key *key)
{
c103c170: 55 push %ebp
/**
* timer_init - called when the timer is initialized
* @timer: pointer to struct timer_list
*/
DEFINE_EVENT(timer_class, timer_init,
c103c171: 83 3d 04 00 00 00 00 cmpl $0x0,0x4
c103c178: 89 e5 mov %esp,%ebp
c103c17a: 57 push %edi
c103c17b: 56 push %esi
c103c17c: 53 push %ebx
c103c17d: 89 c3 mov %eax,%ebx
c103c17f: 74 28 je c103c1a9 <init_timer_key+0x39>
c103c181: 89 e0 mov %esp,%eax
c103c183: 25 00 e0 ff ff and $0xffffe000,%eax
c103c188: ff 40 14 incl 0x14(%eax)
c103c18b: 8b 35 10 00 00 00 mov 0x10,%esi
c103c191: 85 f6 test %esi,%esi
c103c193: 74 0f je c103c1a4 <init_timer_key+0x34>
c103c195: 8b 46 04 mov 0x4(%esi),%eax
c103c198: 89 da mov %ebx,%edx
c103c19a: ff 16 call *(%esi)
c103c19c: 83 c6 08 add $0x8,%esi
c103c19f: 83 3e 00 cmpl $0x0,(%esi)
c103c1a2: eb ef jmp c103c193 <init_timer_key+0x23>
c103c1a4: e8 cc fe ff ff call c103c075 <rcu_read_unlock_sched_notrace>
static void __init_timer(struct timer_list *timer,
const char *name,
struct lock_class_key *key)
{
timer->entry.next = NULL;
c103c1a9: c7 03 00 00 00 00 movl $0x0,(%ebx)
timer->base = __raw_get_cpu_var(tvec_bases);
c103c1af: b8 00 00 00 00 mov $0x0,%eax
c103c1b4: 64 03 05 00 00 00 00 add %fs:0x0,%eax
c103c1bb: 8b 00 mov (%eax),%eax
timer->slack = -1;
#ifdef CONFIG_TIMER_STATS
timer->start_site = NULL;
timer->start_pid = -1;
memset(timer->start_comm, 0, TASK_COMM_LEN);
c103c1bd: 8d 53 24 lea 0x24(%ebx),%edx
c103c1c0: b9 04 00 00 00 mov $0x4,%ecx
c103c1c5: 89 d7 mov %edx,%edi
const char *name,
struct lock_class_key *key)
{
timer->entry.next = NULL;
timer->base = __raw_get_cpu_var(tvec_bases);
timer->slack = -1;
c103c1c7: c7 43 18 ff ff ff ff movl $0xffffffff,0x18(%ebx)
#ifdef CONFIG_TIMER_STATS
timer->start_site = NULL;
c103c1ce: c7 43 20 00 00 00 00 movl $0x0,0x20(%ebx)
static void __init_timer(struct timer_list *timer,
const char *name,
struct lock_class_key *key)
{
timer->entry.next = NULL;
timer->base = __raw_get_cpu_var(tvec_bases);
c103c1d5: 89 43 0c mov %eax,0xc(%ebx)
timer->slack = -1;
#ifdef CONFIG_TIMER_STATS
timer->start_site = NULL;
timer->start_pid = -1;
memset(timer->start_comm, 0, TASK_COMM_LEN);
c103c1d8: 31 c0 xor %eax,%eax
timer->entry.next = NULL;
timer->base = __raw_get_cpu_var(tvec_bases);
timer->slack = -1;
#ifdef CONFIG_TIMER_STATS
timer->start_site = NULL;
timer->start_pid = -1;
c103c1da: c7 43 1c ff ff ff ff movl $0xffffffff,0x1c(%ebx)
memset(timer->start_comm, 0, TASK_COMM_LEN);
c103c1e1: f3 ab rep stos %eax,%es:(%edi)
const char *name,
struct lock_class_key *key)
{
debug_init(timer);
__init_timer(timer, name, key);
}
c103c1e3: 5b pop %ebx
c103c1e4: 5e pop %esi
c103c1e5: 5f pop %edi
c103c1e6: 5d pop %ebp
c103c1e7: c3 ret
c103c1e8 <setup_deferrable_timer_on_stack_key>:
void setup_deferrable_timer_on_stack_key(struct timer_list *timer,
const char *name,
struct lock_class_key *key,
void (*function)(unsigned long),
unsigned long data)
{
c103c1e8: 55 push %ebp
c103c1e9: 89 e5 mov %esp,%ebp
c103c1eb: 53 push %ebx
c103c1ec: 89 c3 mov %eax,%ebx
timer->function = function;
c103c1ee: 8b 45 08 mov 0x8(%ebp),%eax
c103c1f1: 89 43 10 mov %eax,0x10(%ebx)
timer->data = data;
c103c1f4: 8b 45 0c mov 0xc(%ebp),%eax
c103c1f7: 89 43 14 mov %eax,0x14(%ebx)
static inline void destroy_timer_on_stack(struct timer_list *timer) { }
static inline void init_timer_on_stack_key(struct timer_list *timer,
const char *name,
struct lock_class_key *key)
{
init_timer_key(timer, name, key);
c103c1fa: 89 d8 mov %ebx,%eax
c103c1fc: e8 fc ff ff ff call c103c1fd <setup_deferrable_timer_on_stack_key+0x15>
return ((struct tvec_base *)((unsigned long)base & ~TBASE_DEFERRABLE_FLAG));
}
static inline void timer_set_deferrable(struct timer_list *timer)
{
timer->base = TBASE_MAKE_DEFERRED(timer->base);
c103c201: ff 43 0c incl 0xc(%ebx)
{
timer->function = function;
timer->data = data;
init_timer_on_stack_key(timer, name, key);
timer_set_deferrable(timer);
}
c103c204: 5b pop %ebx
c103c205: 5d pop %ebp
c103c206: c3 ret
c103c207 <init_timer_deferrable_key>:
EXPORT_SYMBOL(init_timer_key);
void init_timer_deferrable_key(struct timer_list *timer,
const char *name,
struct lock_class_key *key)
{
c103c207: 55 push %ebp
c103c208: 89 e5 mov %esp,%ebp
c103c20a: 53 push %ebx
c103c20b: 89 c3 mov %eax,%ebx
init_timer_key(timer, name, key);
c103c20d: e8 fc ff ff ff call c103c20e <init_timer_deferrable_key+0x7>
return ((struct tvec_base *)((unsigned long)base & ~TBASE_DEFERRABLE_FLAG));
}
static inline void timer_set_deferrable(struct timer_list *timer)
{
timer->base = TBASE_MAKE_DEFERRED(timer->base);
c103c212: ff 43 0c incl 0xc(%ebx)
const char *name,
struct lock_class_key *key)
{
init_timer_key(timer, name, key);
timer_set_deferrable(timer);
}
c103c215: 5b pop %ebx
c103c216: 5d pop %ebp
c103c217: c3 ret
c103c218 <run_timer_softirq>:
/*
* This function runs timers and the timer-tq in bottom half context.
*/
static void run_timer_softirq(struct softirq_action *h)
{
c103c218: 55 push %ebp
c103c219: 89 e5 mov %esp,%ebp
c103c21b: 57 push %edi
c103c21c: 56 push %esi
c103c21d: 53 push %ebx
c103c21e: 83 ec 28 sub $0x28,%esp
struct tvec_base *base = __this_cpu_read(tvec_bases);
c103c221: 64 8b 1d 00 00 00 00 mov %fs:0x0,%ebx
hrtimer_run_pending();
c103c228: e8 fc ff ff ff call c103c229 <run_timer_softirq+0x11>
if (time_after_eq(jiffies, base->timer_jiffies))
c103c22d: a1 00 00 00 00 mov 0x0,%eax
c103c232: 3b 43 08 cmp 0x8(%ebx),%eax
c103c235: 0f 88 f0 01 00 00 js c103c42b <run_timer_softirq+0x213>
raw_spin_lock_nest_lock(spinlock_check(lock), nest_lock); \
} while (0)
static inline void spin_lock_irq(spinlock_t *lock)
{
raw_spin_lock_irq(&lock->rlock);
c103c23b: 89 d8 mov %ebx,%eax
c103c23d: e8 fc ff ff ff call c103c23e <run_timer_softirq+0x26>
/*
* Cascade timers:
*/
if (!index &&
(!cascade(base, &base->tv2, INDEX(0))) &&
c103c242: 8d 83 10 08 00 00 lea 0x810(%ebx),%eax
(!cascade(base, &base->tv3, INDEX(1))) &&
c103c248: 8d 93 10 0a 00 00 lea 0xa10(%ebx),%edx
/*
* Cascade timers:
*/
if (!index &&
(!cascade(base, &base->tv2, INDEX(0))) &&
c103c24e: 89 45 e0 mov %eax,-0x20(%ebp)
(!cascade(base, &base->tv3, INDEX(1))) &&
!cascade(base, &base->tv4, INDEX(2)))
c103c251: 8d 8b 10 0c 00 00 lea 0xc10(%ebx),%ecx
/*
* Cascade timers:
*/
if (!index &&
(!cascade(base, &base->tv2, INDEX(0))) &&
(!cascade(base, &base->tv3, INDEX(1))) &&
c103c257: 89 55 dc mov %edx,-0x24(%ebp)
!cascade(base, &base->tv4, INDEX(2)))
cascade(base, &base->tv5, INDEX(3));
c103c25a: 8d 83 10 0e 00 00 lea 0xe10(%ebx),%eax
*/
static inline void list_replace(struct list_head *old,
struct list_head *new)
{
new->next = old->next;
new->next->prev = new;
c103c260: 8d 55 ec lea -0x14(%ebp),%edx
* Cascade timers:
*/
if (!index &&
(!cascade(base, &base->tv2, INDEX(0))) &&
(!cascade(base, &base->tv3, INDEX(1))) &&
!cascade(base, &base->tv4, INDEX(2)))
c103c263: 89 4d d8 mov %ecx,-0x28(%ebp)
cascade(base, &base->tv5, INDEX(3));
c103c266: 89 45 d4 mov %eax,-0x2c(%ebp)
c103c269: 89 55 cc mov %edx,-0x34(%ebp)
c103c26c: e9 9c 01 00 00 jmp c103c40d <run_timer_softirq+0x1f5>
int index = base->timer_jiffies & TVR_MASK;
/*
* Cascade timers:
*/
if (!index &&
c103c271: 89 ce mov %ecx,%esi
c103c273: 81 e6 ff 00 00 00 and $0xff,%esi
c103c279: 75 52 jne c103c2cd <run_timer_softirq+0xb5>
(!cascade(base, &base->tv2, INDEX(0))) &&
c103c27b: 8b 55 e0 mov -0x20(%ebp),%edx
c103c27e: c1 e9 08 shr $0x8,%ecx
c103c281: 89 d8 mov %ebx,%eax
c103c283: 83 e1 3f and $0x3f,%ecx
c103c286: e8 7e ea ff ff call c103ad09 <cascade>
int index = base->timer_jiffies & TVR_MASK;
/*
* Cascade timers:
*/
if (!index &&
c103c28b: 85 c0 test %eax,%eax
c103c28d: 75 3e jne c103c2cd <run_timer_softirq+0xb5>
(!cascade(base, &base->tv2, INDEX(0))) &&
(!cascade(base, &base->tv3, INDEX(1))) &&
c103c28f: 8b 4b 08 mov 0x8(%ebx),%ecx
c103c292: 89 d8 mov %ebx,%eax
c103c294: 8b 55 dc mov -0x24(%ebp),%edx
c103c297: c1 e9 0e shr $0xe,%ecx
c103c29a: 83 e1 3f and $0x3f,%ecx
c103c29d: e8 67 ea ff ff call c103ad09 <cascade>
int index = base->timer_jiffies & TVR_MASK;
/*
* Cascade timers:
*/
if (!index &&
c103c2a2: 85 c0 test %eax,%eax
c103c2a4: 75 27 jne c103c2cd <run_timer_softirq+0xb5>
(!cascade(base, &base->tv2, INDEX(0))) &&
(!cascade(base, &base->tv3, INDEX(1))) &&
!cascade(base, &base->tv4, INDEX(2)))
c103c2a6: 8b 4b 08 mov 0x8(%ebx),%ecx
c103c2a9: 89 d8 mov %ebx,%eax
c103c2ab: 8b 55 d8 mov -0x28(%ebp),%edx
c103c2ae: c1 e9 14 shr $0x14,%ecx
c103c2b1: 83 e1 3f and $0x3f,%ecx
c103c2b4: e8 50 ea ff ff call c103ad09 <cascade>
int index = base->timer_jiffies & TVR_MASK;
/*
* Cascade timers:
*/
if (!index &&
c103c2b9: 85 c0 test %eax,%eax
c103c2bb: 75 10 jne c103c2cd <run_timer_softirq+0xb5>
(!cascade(base, &base->tv2, INDEX(0))) &&
(!cascade(base, &base->tv3, INDEX(1))) &&
!cascade(base, &base->tv4, INDEX(2)))
cascade(base, &base->tv5, INDEX(3));
c103c2bd: 8b 4b 08 mov 0x8(%ebx),%ecx
c103c2c0: 89 d8 mov %ebx,%eax
c103c2c2: 8b 55 d4 mov -0x2c(%ebp),%edx
c103c2c5: c1 e9 1a shr $0x1a,%ecx
c103c2c8: e8 3c ea ff ff call c103ad09 <cascade>
++base->timer_jiffies;
c103c2cd: ff 43 08 incl 0x8(%ebx)
c103c2d0: 89 df mov %ebx,%edi
* If @old was empty, it will be overwritten.
*/
static inline void list_replace(struct list_head *old,
struct list_head *new)
{
new->next = old->next;
c103c2d2: 8b 54 f3 10 mov 0x10(%ebx,%esi,8),%edx
new->next->prev = new;
c103c2d6: 8d 4d ec lea -0x14(%ebp),%ecx
list_replace_init(base->tv1.vec + index, &work_list);
c103c2d9: 8d 44 f3 10 lea 0x10(%ebx,%esi,8),%eax
* If @old was empty, it will be overwritten.
*/
static inline void list_replace(struct list_head *old,
struct list_head *new)
{
new->next = old->next;
c103c2dd: 89 55 ec mov %edx,-0x14(%ebp)
new->next->prev = new;
c103c2e0: 89 4a 04 mov %ecx,0x4(%edx)
new->prev = old->prev;
c103c2e3: 8b 54 f3 14 mov 0x14(%ebx,%esi,8),%edx
c103c2e7: 89 55 f0 mov %edx,-0x10(%ebp)
new->prev->next = new;
c103c2ea: 89 0a mov %ecx,(%edx)
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
c103c2ec: 89 44 f3 10 mov %eax,0x10(%ebx,%esi,8)
list->prev = list;
c103c2f0: 89 44 f3 14 mov %eax,0x14(%ebx,%esi,8)
c103c2f4: e9 06 01 00 00 jmp c103c3ff <run_timer_softirq+0x1e7>
while (!list_empty(head)) {
void (*fn)(unsigned long);
unsigned long data;
timer = list_first_entry(head, struct timer_list,entry);
fn = timer->function;
c103c2f9: 8b 43 10 mov 0x10(%ebx),%eax
c103c2fc: 89 45 e4 mov %eax,-0x1c(%ebp)
data = timer->data;
c103c2ff: 8b 53 14 mov 0x14(%ebx),%edx
c103c302: 89 55 d0 mov %edx,-0x30(%ebp)
static void timer_stats_account_timer(struct timer_list *timer)
{
unsigned int flag = 0;
if (likely(!timer->start_site))
c103c305: 8b 4b 20 mov 0x20(%ebx),%ecx
c103c308: 85 c9 test %ecx,%ecx
c103c30a: 74 1b je c103c327 <run_timer_softirq+0x10f>
return;
if (unlikely(tbase_get_deferrable(timer->base)))
flag |= TIMER_STATS_FLAG_DEFERRABLE;
timer_stats_update_stats(timer, timer->start_pid, timer->start_site,
c103c30c: 8b 43 0c mov 0xc(%ebx),%eax
c103c30f: 8b 53 1c mov 0x1c(%ebx),%edx
c103c312: 83 e0 01 and $0x1,%eax
c103c315: 50 push %eax
c103c316: 8d 43 24 lea 0x24(%ebx),%eax
c103c319: 50 push %eax
c103c31a: 89 d8 mov %ebx,%eax
c103c31c: ff 75 e4 pushl -0x1c(%ebp)
c103c31f: e8 fc ff ff ff call c103c320 <run_timer_softirq+0x108>
c103c324: 83 c4 0c add $0xc,%esp
data = timer->data;
timer_stats_account_timer(timer);
base->running_timer = timer;
detach_timer(timer, 1);
c103c327: ba 01 00 00 00 mov $0x1,%edx
c103c32c: 89 d8 mov %ebx,%eax
fn = timer->function;
data = timer->data;
timer_stats_account_timer(timer);
base->running_timer = timer;
c103c32e: 89 5f 04 mov %ebx,0x4(%edi)
detach_timer(timer, 1);
c103c331: e8 5a fd ff ff call c103c090 <detach_timer>
raw_spin_unlock_bh(&lock->rlock);
}
static inline void spin_unlock_irq(spinlock_t *lock)
{
raw_spin_unlock_irq(&lock->rlock);
c103c336: 89 f8 mov %edi,%eax
c103c338: e8 fc ff ff ff call c103c339 <run_timer_softirq+0x121>
c103c33d: 89 e0 mov %esp,%eax
c103c33f: 25 00 e0 ff ff and $0xffffe000,%eax
}
static void call_timer_fn(struct timer_list *timer, void (*fn)(unsigned long),
unsigned long data)
{
int preempt_count = preempt_count();
c103c344: 8b 48 14 mov 0x14(%eax),%ecx
* timer_expire_entry - called immediately before the timer callback
* @timer: pointer to struct timer_list
*
* Allows to determine the timer latency.
*/
TRACE_EVENT(timer_expire_entry,
c103c347: 83 3d 04 00 00 00 00 cmpl $0x0,0x4
c103c34e: 89 4d e8 mov %ecx,-0x18(%ebp)
c103c351: 74 24 je c103c377 <run_timer_softirq+0x15f>
c103c353: 89 ca mov %ecx,%edx
c103c355: 42 inc %edx
c103c356: 89 50 14 mov %edx,0x14(%eax)
c103c359: 8b 35 10 00 00 00 mov 0x10,%esi
c103c35f: 85 f6 test %esi,%esi
c103c361: 74 0f je c103c372 <run_timer_softirq+0x15a>
c103c363: 8b 46 04 mov 0x4(%esi),%eax
c103c366: 89 da mov %ebx,%edx
c103c368: ff 16 call *(%esi)
c103c36a: 83 c6 08 add $0x8,%esi
c103c36d: 83 3e 00 cmpl $0x0,(%esi)
c103c370: eb ef jmp c103c361 <run_timer_softirq+0x149>
c103c372: e8 fe fc ff ff call c103c075 <rcu_read_unlock_sched_notrace>
* call here and in del_timer_sync().
*/
lock_map_acquire(&lockdep_map);
trace_timer_expire_entry(timer);
fn(data);
c103c377: 8b 45 d0 mov -0x30(%ebp),%eax
c103c37a: ff 55 e4 call *-0x1c(%ebp)
* determine the runtime of the timer callback function.
*
* NOTE: Do NOT derefernce timer in TP_fast_assign. The pointer might
* be invalid. We solely track the pointer.
*/
DEFINE_EVENT(timer_class, timer_expire_exit,
c103c37d: 83 3d 04 00 00 00 00 cmpl $0x0,0x4
c103c384: 74 28 je c103c3ae <run_timer_softirq+0x196>
c103c386: 89 e0 mov %esp,%eax
c103c388: 25 00 e0 ff ff and $0xffffe000,%eax
c103c38d: ff 40 14 incl 0x14(%eax)
c103c390: 8b 35 10 00 00 00 mov 0x10,%esi
c103c396: 85 f6 test %esi,%esi
c103c398: 74 0f je c103c3a9 <run_timer_softirq+0x191>
c103c39a: 8b 46 04 mov 0x4(%esi),%eax
c103c39d: 89 da mov %ebx,%edx
c103c39f: ff 16 call *(%esi)
c103c3a1: 83 c6 08 add $0x8,%esi
c103c3a4: 83 3e 00 cmpl $0x0,(%esi)
c103c3a7: eb ef jmp c103c398 <run_timer_softirq+0x180>
c103c3a9: e8 c7 fc ff ff call c103c075 <rcu_read_unlock_sched_notrace>
trace_timer_expire_exit(timer);
lock_map_release(&lockdep_map);
if (preempt_count != preempt_count()) {
c103c3ae: 89 e0 mov %esp,%eax
c103c3b0: 25 00 e0 ff ff and $0xffffe000,%eax
c103c3b5: 8b 40 14 mov 0x14(%eax),%eax
c103c3b8: 39 45 e8 cmp %eax,-0x18(%ebp)
c103c3bb: 74 3b je c103c3f8 <run_timer_softirq+0x1e0>
WARN_ONCE(1, "timer: %pF preempt leak: %08x -> %08x\n",
c103c3bd: 80 3d 4a 10 00 00 01 cmpb $0x1,0x104a
c103c3c4: 74 25 je c103c3eb <run_timer_softirq+0x1d3>
c103c3c6: 50 push %eax
c103c3c7: ff 75 e8 pushl -0x18(%ebp)
c103c3ca: ff 75 e4 pushl -0x1c(%ebp)
c103c3cd: 68 6a 02 00 00 push $0x26a
c103c3d2: 68 31 04 00 00 push $0x431
c103c3d7: 68 00 00 00 00 push $0x0
c103c3dc: e8 fc ff ff ff call c103c3dd <run_timer_softirq+0x1c5>
c103c3e1: c6 05 4a 10 00 00 01 movb $0x1,0x104a
c103c3e8: 83 c4 18 add $0x18,%esp
* Restore the preempt count. That gives us a decent
* chance to survive and extract information. If the
* callback kept a lock held, bad luck, but not worse
* than the BUG() we had.
*/
preempt_count() = preempt_count;
c103c3eb: 8b 55 e8 mov -0x18(%ebp),%edx
c103c3ee: 89 e0 mov %esp,%eax
c103c3f0: 25 00 e0 ff ff and $0xffffe000,%eax
c103c3f5: 89 50 14 mov %edx,0x14(%eax)
raw_spin_lock_nest_lock(spinlock_check(lock), nest_lock); \
} while (0)
static inline void spin_lock_irq(spinlock_t *lock)
{
raw_spin_lock_irq(&lock->rlock);
c103c3f8: 89 f8 mov %edi,%eax
c103c3fa: e8 fc ff ff ff call c103c3fb <run_timer_softirq+0x1e3>
* list_empty - tests whether a list is empty
* @head: the list to test.
*/
static inline int list_empty(const struct list_head *head)
{
return head->next == head;
c103c3ff: 8b 5d ec mov -0x14(%ebp),%ebx
struct timer_list *timer;
spin_lock_irq(&base->lock);
while (time_after_eq(jiffies, base->timer_jiffies)) {
struct list_head work_list;
struct list_head *head = &work_list;
c103c402: 3b 5d cc cmp -0x34(%ebp),%ebx
c103c405: 0f 85 ee fe ff ff jne c103c2f9 <run_timer_softirq+0xe1>
c103c40b: 89 fb mov %edi,%ebx
static inline void __run_timers(struct tvec_base *base)
{
struct timer_list *timer;
spin_lock_irq(&base->lock);
while (time_after_eq(jiffies, base->timer_jiffies)) {
c103c40d: a1 00 00 00 00 mov 0x0,%eax
c103c412: 8b 4b 08 mov 0x8(%ebx),%ecx
c103c415: 39 c8 cmp %ecx,%eax
c103c417: 0f 89 54 fe ff ff jns c103c271 <run_timer_softirq+0x59>
spin_unlock_irq(&base->lock);
call_timer_fn(timer, fn, data);
spin_lock_irq(&base->lock);
}
}
base->running_timer = NULL;
c103c41d: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx)
raw_spin_unlock_bh(&lock->rlock);
}
static inline void spin_unlock_irq(spinlock_t *lock)
{
raw_spin_unlock_irq(&lock->rlock);
c103c424: 89 d8 mov %ebx,%eax
c103c426: e8 fc ff ff ff call c103c427 <run_timer_softirq+0x20f>
hrtimer_run_pending();
if (time_after_eq(jiffies, base->timer_jiffies))
__run_timers(base);
}
c103c42b: 8d 65 f4 lea -0xc(%ebp),%esp
c103c42e: 5b pop %ebx
c103c42f: 5e pop %esi
c103c430: 5f pop %edi
c103c431: 5d pop %ebp
c103c432: c3 ret
c103c433 <do_sysinfo>:
/**
* do_sysinfo - fill in sysinfo struct
* @info: pointer to buffer to fill
*/
int do_sysinfo(struct sysinfo *info)
{
c103c433: 55 push %ebp
unsigned long mem_total, sav_total;
unsigned int mem_unit, bitcount;
struct timespec tp;
memset(info, 0, sizeof(struct sysinfo));
c103c434: b9 10 00 00 00 mov $0x10,%ecx
/**
* do_sysinfo - fill in sysinfo struct
* @info: pointer to buffer to fill
*/
int do_sysinfo(struct sysinfo *info)
{
c103c439: 89 e5 mov %esp,%ebp
c103c43b: 57 push %edi
c103c43c: 56 push %esi
c103c43d: 53 push %ebx
c103c43e: 89 c3 mov %eax,%ebx
unsigned long mem_total, sav_total;
unsigned int mem_unit, bitcount;
struct timespec tp;
memset(info, 0, sizeof(struct sysinfo));
c103c440: 89 df mov %ebx,%edi
c103c442: 31 c0 xor %eax,%eax
/**
* do_sysinfo - fill in sysinfo struct
* @info: pointer to buffer to fill
*/
int do_sysinfo(struct sysinfo *info)
{
c103c444: 83 ec 08 sub $0x8,%esp
unsigned long mem_total, sav_total;
unsigned int mem_unit, bitcount;
struct timespec tp;
memset(info, 0, sizeof(struct sysinfo));
c103c447: f3 ab rep stos %eax,%es:(%edi)
ktime_get_ts(&tp);
c103c449: 8d 75 ec lea -0x14(%ebp),%esi
c103c44c: 89 f0 mov %esi,%eax
c103c44e: e8 fc ff ff ff call c103c44f <do_sysinfo+0x1c>
monotonic_to_bootbased(&tp);
c103c453: 89 f0 mov %esi,%eax
c103c455: e8 fc ff ff ff call c103c456 <do_sysinfo+0x23>
info->uptime = tp.tv_sec + (tp.tv_nsec ? 1 : 0);
c103c45a: 31 c0 xor %eax,%eax
get_avenrun(info->loads, 0, SI_LOAD_SHIFT - FSHIFT);
c103c45c: b9 05 00 00 00 mov $0x5,%ecx
memset(info, 0, sizeof(struct sysinfo));
ktime_get_ts(&tp);
monotonic_to_bootbased(&tp);
info->uptime = tp.tv_sec + (tp.tv_nsec ? 1 : 0);
c103c461: 83 7d f0 00 cmpl $0x0,-0x10(%ebp)
c103c465: 0f 95 c0 setne %al
get_avenrun(info->loads, 0, SI_LOAD_SHIFT - FSHIFT);
c103c468: 31 d2 xor %edx,%edx
memset(info, 0, sizeof(struct sysinfo));
ktime_get_ts(&tp);
monotonic_to_bootbased(&tp);
info->uptime = tp.tv_sec + (tp.tv_nsec ? 1 : 0);
c103c46a: 03 45 ec add -0x14(%ebp),%eax
c103c46d: 89 03 mov %eax,(%ebx)
get_avenrun(info->loads, 0, SI_LOAD_SHIFT - FSHIFT);
c103c46f: 8d 43 04 lea 0x4(%ebx),%eax
c103c472: e8 fc ff ff ff call c103c473 <do_sysinfo+0x40>
info->procs = nr_threads;
c103c477: a1 00 00 00 00 mov 0x0,%eax
c103c47c: 66 89 43 28 mov %ax,0x28(%ebx)
si_meminfo(info);
c103c480: 89 d8 mov %ebx,%eax
c103c482: e8 fc ff ff ff call c103c483 <do_sysinfo+0x50>
si_swapinfo(info);
c103c487: 89 d8 mov %ebx,%eax
c103c489: e8 fc ff ff ff call c103c48a <do_sysinfo+0x57>
* well, in that case 2.2.x was broken anyways...
*
* -Erik Andersen <andersee@debian.org>
*/
mem_total = info->totalram + info->totalswap;
c103c48e: 8b 53 20 mov 0x20(%ebx),%edx
if (mem_total < info->totalram || mem_total < info->totalswap)
c103c491: 89 d0 mov %edx,%eax
c103c493: 03 43 10 add 0x10(%ebx),%eax
c103c496: 72 3b jb c103c4d3 <do_sysinfo+0xa0>
c103c498: 39 d0 cmp %edx,%eax
c103c49a: 72 37 jb c103c4d3 <do_sysinfo+0xa0>
goto out;
bitcount = 0;
mem_unit = info->mem_unit;
c103c49c: 8b 53 34 mov 0x34(%ebx),%edx
c103c49f: 31 c9 xor %ecx,%ecx
while (mem_unit > 1) {
c103c4a1: eb 0c jmp c103c4af <do_sysinfo+0x7c>
bitcount++;
mem_unit >>= 1;
sav_total = mem_total;
mem_total <<= 1;
c103c4a3: 8d 34 00 lea (%eax,%eax,1),%esi
if (mem_total < sav_total)
c103c4a6: 39 c6 cmp %eax,%esi
c103c4a8: 72 29 jb c103c4d3 <do_sysinfo+0xa0>
if (mem_total < info->totalram || mem_total < info->totalswap)
goto out;
bitcount = 0;
mem_unit = info->mem_unit;
while (mem_unit > 1) {
bitcount++;
c103c4aa: 41 inc %ecx
mem_unit >>= 1;
c103c4ab: 89 f0 mov %esi,%eax
c103c4ad: d1 ea shr %edx
mem_total = info->totalram + info->totalswap;
if (mem_total < info->totalram || mem_total < info->totalswap)
goto out;
bitcount = 0;
mem_unit = info->mem_unit;
while (mem_unit > 1) {
c103c4af: 83 fa 01 cmp $0x1,%edx
c103c4b2: 77 ef ja c103c4a3 <do_sysinfo+0x70>
* with 2.2.x, and also retains compatibility with earlier 2.4.x
* kernels...
*/
info->mem_unit = 1;
info->totalram <<= bitcount;
c103c4b4: d3 63 10 shll %cl,0x10(%ebx)
info->freeram <<= bitcount;
c103c4b7: d3 63 14 shll %cl,0x14(%ebx)
info->sharedram <<= bitcount;
c103c4ba: d3 63 18 shll %cl,0x18(%ebx)
info->bufferram <<= bitcount;
c103c4bd: d3 63 1c shll %cl,0x1c(%ebx)
info->totalswap <<= bitcount;
c103c4c0: d3 63 20 shll %cl,0x20(%ebx)
info->freeswap <<= bitcount;
c103c4c3: d3 63 24 shll %cl,0x24(%ebx)
info->totalhigh <<= bitcount;
c103c4c6: d3 63 2c shll %cl,0x2c(%ebx)
info->freehigh <<= bitcount;
c103c4c9: d3 63 30 shll %cl,0x30(%ebx)
* info->mem_unit and set it to 1. This leaves things compatible
* with 2.2.x, and also retains compatibility with earlier 2.4.x
* kernels...
*/
info->mem_unit = 1;
c103c4cc: c7 43 34 01 00 00 00 movl $0x1,0x34(%ebx)
info->totalhigh <<= bitcount;
info->freehigh <<= bitcount;
out:
return 0;
}
c103c4d3: 5e pop %esi
c103c4d4: 31 c0 xor %eax,%eax
c103c4d6: 5f pop %edi
c103c4d7: 5b pop %ebx
c103c4d8: 5e pop %esi
c103c4d9: 5f pop %edi
c103c4da: 5d pop %ebp
c103c4db: c3 ret
c103c4dc <sys_sysinfo>:
SYSCALL_DEFINE1(sysinfo, struct sysinfo __user *, info)
{
c103c4dc: 55 push %ebp
c103c4dd: 89 e5 mov %esp,%ebp
c103c4df: 53 push %ebx
struct sysinfo val;
do_sysinfo(&val);
c103c4e0: 8d 5d bc lea -0x44(%ebp),%ebx
out:
return 0;
}
SYSCALL_DEFINE1(sysinfo, struct sysinfo __user *, info)
{
c103c4e3: 83 ec 40 sub $0x40,%esp
struct sysinfo val;
do_sysinfo(&val);
c103c4e6: 89 d8 mov %ebx,%eax
c103c4e8: e8 fc ff ff ff call c103c4e9 <sys_sysinfo+0xd>
if (copy_to_user(info, &val, sizeof(struct sysinfo)))
c103c4ed: 8b 45 08 mov 0x8(%ebp),%eax
c103c4f0: 89 da mov %ebx,%edx
c103c4f2: b9 40 00 00 00 mov $0x40,%ecx
c103c4f7: e8 fc ff ff ff call c103c4f8 <sys_sysinfo+0x1c>
c103c4fc: 83 f8 01 cmp $0x1,%eax
c103c4ff: 19 c0 sbb %eax,%eax
return -EFAULT;
return 0;
}
c103c501: 83 c4 40 add $0x40,%esp
{
struct sysinfo val;
do_sysinfo(&val);
if (copy_to_user(info, &val, sizeof(struct sysinfo)))
c103c504: f7 d0 not %eax
c103c506: 83 e0 f2 and $0xfffffff2,%eax
return -EFAULT;
return 0;
}
c103c509: 5b pop %ebx
c103c50a: 5d pop %ebp
c103c50b: c3 ret
c103c50c <sys_gettid>:
}
EXPORT_SYMBOL(schedule_timeout_uninterruptible);
/* Thread ID - the internal kernel "pid" */
SYSCALL_DEFINE0(gettid)
{
c103c50c: 55 push %ebp
return __task_pid_nr_ns(tsk, PIDTYPE_PID, ns);
}
static inline pid_t task_pid_vnr(struct task_struct *tsk)
{
return __task_pid_nr_ns(tsk, PIDTYPE_PID, NULL);
c103c50d: 31 c9 xor %ecx,%ecx
c103c50f: 89 e5 mov %esp,%ebp
c103c511: 31 d2 xor %edx,%edx
c103c513: 64 a1 00 00 00 00 mov %fs:0x0,%eax
c103c519: e8 fc ff ff ff call c103c51a <sys_gettid+0xe>
return task_pid_vnr(current);
}
c103c51e: 5d pop %ebp
c103c51f: c3 ret
c103c520 <lock_timer_base>:
* locked.
*/
static struct tvec_base *lock_timer_base(struct timer_list *timer,
unsigned long *flags)
__acquires(timer->base->lock)
{
c103c520: 55 push %ebp
c103c521: 89 e5 mov %esp,%ebp
c103c523: 57 push %edi
c103c524: 89 d7 mov %edx,%edi
c103c526: 56 push %esi
c103c527: 89 c6 mov %eax,%esi
c103c529: 53 push %ebx
c103c52a: 83 ec 04 sub $0x4,%esp
struct tvec_base *base;
for (;;) {
struct tvec_base *prelock_base = timer->base;
c103c52d: 8b 4e 0c mov 0xc(%esi),%ecx
base = tbase_get_base(prelock_base);
if (likely(base != NULL)) {
c103c530: 89 cb mov %ecx,%ebx
c103c532: 83 e3 fe and $0xfffffffe,%ebx
c103c535: 74 25 je c103c55c <lock_timer_base+0x3c>
spin_lock_irqsave(&base->lock, *flags);
c103c537: 89 d8 mov %ebx,%eax
c103c539: 89 4d f0 mov %ecx,-0x10(%ebp)
c103c53c: e8 fc ff ff ff call c103c53d <lock_timer_base+0x1d>
if (likely(prelock_base == timer->base))
c103c541: 8b 4d f0 mov -0x10(%ebp),%ecx
for (;;) {
struct tvec_base *prelock_base = timer->base;
base = tbase_get_base(prelock_base);
if (likely(base != NULL)) {
spin_lock_irqsave(&base->lock, *flags);
c103c544: 89 07 mov %eax,(%edi)
if (likely(prelock_base == timer->base))
c103c546: 3b 4e 0c cmp 0xc(%esi),%ecx
c103c549: 75 08 jne c103c553 <lock_timer_base+0x33>
/* The timer has migrated to another CPU */
spin_unlock_irqrestore(&base->lock, *flags);
}
cpu_relax();
}
}
c103c54b: 5a pop %edx
c103c54c: 89 d8 mov %ebx,%eax
c103c54e: 5b pop %ebx
c103c54f: 5e pop %esi
c103c550: 5f pop %edi
c103c551: 5d pop %ebp
c103c552: c3 ret
}
static inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
{
raw_spin_unlock_irqrestore(&lock->rlock, flags);
c103c553: 89 c2 mov %eax,%edx
c103c555: 89 d8 mov %ebx,%eax
c103c557: e8 fc ff ff ff call c103c558 <lock_timer_base+0x38>
}
/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
static inline void rep_nop(void)
{
asm volatile("rep; nop" ::: "memory");
c103c55c: f3 90 pause
return base;
/* The timer has migrated to another CPU */
spin_unlock_irqrestore(&base->lock, *flags);
}
cpu_relax();
}
c103c55e: eb cd jmp c103c52d <lock_timer_base+0xd>
c103c560 <try_to_del_timer_sync>:
*
* This function tries to deactivate a timer. Upon successful (ret >= 0)
* exit the timer is not queued and the handler is not running on any CPU.
*/
int try_to_del_timer_sync(struct timer_list *timer)
{
c103c560: 55 push %ebp
c103c561: 89 e5 mov %esp,%ebp
c103c563: 57 push %edi
unsigned long flags;
int ret = -1;
base = lock_timer_base(timer, &flags);
if (base->running_timer == timer)
c103c564: 83 cf ff or $0xffffffff,%edi
*
* This function tries to deactivate a timer. Upon successful (ret >= 0)
* exit the timer is not queued and the handler is not running on any CPU.
*/
int try_to_del_timer_sync(struct timer_list *timer)
{
c103c567: 56 push %esi
c103c568: 53 push %ebx
c103c569: 89 c3 mov %eax,%ebx
c103c56b: 83 ec 04 sub $0x4,%esp
struct tvec_base *base;
unsigned long flags;
int ret = -1;
base = lock_timer_base(timer, &flags);
c103c56e: 8d 55 f0 lea -0x10(%ebp),%edx
c103c571: e8 aa ff ff ff call c103c520 <lock_timer_base>
if (base->running_timer == timer)
c103c576: 39 58 04 cmp %ebx,0x4(%eax)
{
struct tvec_base *base;
unsigned long flags;
int ret = -1;
base = lock_timer_base(timer, &flags);
c103c579: 89 c6 mov %eax,%esi
if (base->running_timer == timer)
c103c57b: 74 39 je c103c5b6 <try_to_del_timer_sync+0x56>
goto out;
timer_stats_timer_clear_start_info(timer);
ret = 0;
if (timer_pending(timer)) {
c103c57d: 31 ff xor %edi,%edi
c103c57f: 83 3b 00 cmpl $0x0,(%ebx)
__timer_stats_timer_set_start_info(timer, __builtin_return_address(0));
}
static inline void timer_stats_timer_clear_start_info(struct timer_list *timer)
{
timer->start_site = NULL;
c103c582: c7 43 20 00 00 00 00 movl $0x0,0x20(%ebx)
c103c589: 74 2b je c103c5b6 <try_to_del_timer_sync+0x56>
detach_timer(timer, 1);
c103c58b: 89 d8 mov %ebx,%eax
c103c58d: ba 01 00 00 00 mov $0x1,%edx
c103c592: e8 f9 fa ff ff call c103c090 <detach_timer>
if (timer->expires == base->next_timer &&
c103c597: 8b 43 08 mov 0x8(%ebx),%eax
c103c59a: 3b 46 0c cmp 0xc(%esi),%eax
c103c59d: 75 12 jne c103c5b1 <try_to_del_timer_sync+0x51>
!tbase_get_deferrable(timer->base))
c103c59f: f6 43 0c 01 testb $0x1,0xc(%ebx)
c103c5a3: 75 0c jne c103c5b1 <try_to_del_timer_sync+0x51>
base->next_timer = base->timer_jiffies;
c103c5a5: 8b 46 08 mov 0x8(%esi),%eax
c103c5a8: 66 bf 01 00 mov $0x1,%di
c103c5ac: 89 46 0c mov %eax,0xc(%esi)
c103c5af: eb 05 jmp c103c5b6 <try_to_del_timer_sync+0x56>
c103c5b1: bf 01 00 00 00 mov $0x1,%edi
c103c5b6: 8b 55 f0 mov -0x10(%ebp),%edx
c103c5b9: 89 f0 mov %esi,%eax
c103c5bb: e8 fc ff ff ff call c103c5bc <try_to_del_timer_sync+0x5c>
}
out:
spin_unlock_irqrestore(&base->lock, flags);
return ret;
}
c103c5c0: 89 f8 mov %edi,%eax
c103c5c2: 59 pop %ecx
c103c5c3: 5b pop %ebx
c103c5c4: 5e pop %esi
c103c5c5: 5f pop %edi
c103c5c6: 5d pop %ebp
c103c5c7: c3 ret
c103c5c8 <del_timer_sync>:
* it has interrupted the softirq that CPU0 is waiting to finish.
*
* The function returns whether it has deactivated a pending timer or not.
*/
int del_timer_sync(struct timer_list *timer)
{
c103c5c8: 55 push %ebp
c103c5c9: 89 e5 mov %esp,%ebp
c103c5cb: 53 push %ebx
c103c5cc: 89 c3 mov %eax,%ebx
#endif
/*
* don't use it in hardirq context, because it
* could lead to deadlock.
*/
WARN_ON(in_irq());
c103c5ce: 89 e0 mov %esp,%eax
c103c5d0: 25 00 e0 ff ff and $0xffffe000,%eax
c103c5d5: f7 40 14 00 00 ff 03 testl $0x3ff0000,0x14(%eax)
c103c5dc: 74 0f je c103c5ed <del_timer_sync+0x25>
c103c5de: ba f4 03 00 00 mov $0x3f4,%edx
c103c5e3: b8 00 00 00 00 mov $0x0,%eax
c103c5e8: e8 fc ff ff ff call c103c5e9 <del_timer_sync+0x21>
for (;;) {
int ret = try_to_del_timer_sync(timer);
c103c5ed: 89 d8 mov %ebx,%eax
c103c5ef: e8 fc ff ff ff call c103c5f0 <del_timer_sync+0x28>
if (ret >= 0)
c103c5f4: 85 c0 test %eax,%eax
c103c5f6: 78 03 js c103c5fb <del_timer_sync+0x33>
return ret;
cpu_relax();
}
}
c103c5f8: 5b pop %ebx
c103c5f9: 5d pop %ebp
c103c5fa: c3 ret
c103c5fb: f3 90 pause
for (;;) {
int ret = try_to_del_timer_sync(timer);
if (ret >= 0)
return ret;
cpu_relax();
}
c103c5fd: eb ee jmp c103c5ed <del_timer_sync+0x25>
c103c5ff <del_timer>:
* The function returns whether it has deactivated a pending timer or not.
* (ie. del_timer() of an inactive timer returns 0, del_timer() of an
* active timer returns 1.)
*/
int del_timer(struct timer_list *timer)
{
c103c5ff: 55 push %ebp
c103c600: 89 e5 mov %esp,%ebp
c103c602: 57 push %edi
struct tvec_base *base;
unsigned long flags;
int ret = 0;
timer_stats_timer_clear_start_info(timer);
if (timer_pending(timer)) {
c103c603: 31 ff xor %edi,%edi
* The function returns whether it has deactivated a pending timer or not.
* (ie. del_timer() of an inactive timer returns 0, del_timer() of an
* active timer returns 1.)
*/
int del_timer(struct timer_list *timer)
{
c103c605: 56 push %esi
c103c606: 53 push %ebx
c103c607: 89 c3 mov %eax,%ebx
c103c609: 83 ec 04 sub $0x4,%esp
struct tvec_base *base;
unsigned long flags;
int ret = 0;
timer_stats_timer_clear_start_info(timer);
if (timer_pending(timer)) {
c103c60c: 83 38 00 cmpl $0x0,(%eax)
c103c60f: c7 40 20 00 00 00 00 movl $0x0,0x20(%eax)
c103c616: 74 44 je c103c65c <del_timer+0x5d>
base = lock_timer_base(timer, &flags);
c103c618: 8d 55 f0 lea -0x10(%ebp),%edx
c103c61b: e8 00 ff ff ff call c103c520 <lock_timer_base>
if (timer_pending(timer)) {
c103c620: 83 3b 00 cmpl $0x0,(%ebx)
unsigned long flags;
int ret = 0;
timer_stats_timer_clear_start_info(timer);
if (timer_pending(timer)) {
base = lock_timer_base(timer, &flags);
c103c623: 89 c6 mov %eax,%esi
if (timer_pending(timer)) {
c103c625: 74 2b je c103c652 <del_timer+0x53>
detach_timer(timer, 1);
c103c627: 89 d8 mov %ebx,%eax
c103c629: ba 01 00 00 00 mov $0x1,%edx
c103c62e: e8 5d fa ff ff call c103c090 <detach_timer>
if (timer->expires == base->next_timer &&
c103c633: 8b 43 08 mov 0x8(%ebx),%eax
c103c636: 3b 46 0c cmp 0xc(%esi),%eax
c103c639: 75 12 jne c103c64d <del_timer+0x4e>
!tbase_get_deferrable(timer->base))
c103c63b: f6 43 0c 01 testb $0x1,0xc(%ebx)
c103c63f: 75 0c jne c103c64d <del_timer+0x4e>
base->next_timer = base->timer_jiffies;
c103c641: 8b 46 08 mov 0x8(%esi),%eax
c103c644: 66 bf 01 00 mov $0x1,%di
c103c648: 89 46 0c mov %eax,0xc(%esi)
c103c64b: eb 05 jmp c103c652 <del_timer+0x53>
c103c64d: bf 01 00 00 00 mov $0x1,%edi
c103c652: 8b 55 f0 mov -0x10(%ebp),%edx
c103c655: 89 f0 mov %esi,%eax
c103c657: e8 fc ff ff ff call c103c658 <del_timer+0x59>
}
spin_unlock_irqrestore(&base->lock, flags);
}
return ret;
}
c103c65c: 5b pop %ebx
c103c65d: 89 f8 mov %edi,%eax
c103c65f: 5b pop %ebx
c103c660: 5e pop %esi
c103c661: 5f pop %edi
c103c662: 5d pop %ebp
c103c663: c3 ret
c103c664 <process_timeout>:
}
#endif
static void process_timeout(unsigned long __data)
{
c103c664: 55 push %ebp
c103c665: 89 e5 mov %esp,%ebp
wake_up_process((struct task_struct *)__data);
c103c667: e8 fc ff ff ff call c103c668 <process_timeout+0x4>
}
c103c66c: 5d pop %ebp
c103c66d: c3 ret
c103c66e <sys_getpid>:
* which case the tgid is the same in all threads of the same group.
*
* This is SMP safe as current->tgid does not change.
*/
SYSCALL_DEFINE0(getpid)
{
c103c66e: 55 push %ebp
c103c66f: 64 a1 00 00 00 00 mov %fs:0x0,%eax
pid_t task_tgid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns);
static inline pid_t task_tgid_vnr(struct task_struct *tsk)
{
return pid_vnr(task_tgid(tsk));
c103c675: 8b 80 20 02 00 00 mov 0x220(%eax),%eax
c103c67b: 89 e5 mov %esp,%ebp
c103c67d: 8b 80 3c 02 00 00 mov 0x23c(%eax),%eax
c103c683: e8 fc ff ff ff call c103c684 <sys_getpid+0x16>
return task_tgid_vnr(current);
}
c103c688: 5d pop %ebp
c103c689: c3 ret
c103c68a <sys_getppid>:
* change from under us. However, we can use a stale
* value of ->real_parent under rcu_read_lock(), see
* release_task()->call_rcu(delayed_put_task_struct).
*/
SYSCALL_DEFINE0(getppid)
{
c103c68a: 55 push %ebp
c103c68b: 89 e5 mov %esp,%ebp
c103c68d: 83 ec 04 sub $0x4,%esp
* block, but only when acquiring spinlocks that are subject to priority
* inheritance.
*/
static inline void rcu_read_lock(void)
{
__rcu_read_lock();
c103c690: e8 fc ff ff ff call c103c691 <sys_getppid+0x7>
c103c695: 64 a1 00 00 00 00 mov %fs:0x0,%eax
c103c69b: 8b 80 08 02 00 00 mov 0x208(%eax),%eax
c103c6a1: 8b 80 20 02 00 00 mov 0x220(%eax),%eax
c103c6a7: 8b 80 3c 02 00 00 mov 0x23c(%eax),%eax
c103c6ad: e8 fc ff ff ff call c103c6ae <sys_getppid+0x24>
*/
static inline void rcu_read_unlock(void)
{
rcu_read_release();
__release(RCU);
__rcu_read_unlock();
c103c6b2: 89 45 fc mov %eax,-0x4(%ebp)
c103c6b5: e8 fc ff ff ff call c103c6b6 <sys_getppid+0x2c>
rcu_read_lock();
pid = task_tgid_vnr(current->real_parent);
rcu_read_unlock();
return pid;
}
c103c6ba: 8b 45 fc mov -0x4(%ebp),%eax
c103c6bd: c9 leave
c103c6be: c3 ret
c103c6bf <sys_alarm>:
/*
* For backwards compatibility? This can be done in libc so Alpha
* and all newer ports shouldn't need it.
*/
SYSCALL_DEFINE1(alarm, unsigned int, seconds)
{
c103c6bf: 55 push %ebp
c103c6c0: 89 e5 mov %esp,%ebp
return alarm_setitimer(seconds);
c103c6c2: 8b 45 08 mov 0x8(%ebp),%eax
c103c6c5: e8 fc ff ff ff call c103c6c6 <sys_alarm+0x7>
}
c103c6ca: 5d pop %ebp
c103c6cb: c3 ret
c103c6cc <run_local_timers>:
/*
* Called by the local, per-CPU timer interrupt on SMP.
*/
void run_local_timers(void)
{
c103c6cc: 55 push %ebp
c103c6cd: 89 e5 mov %esp,%ebp
hrtimer_run_queues();
c103c6cf: e8 fc ff ff ff call c103c6d0 <run_local_timers+0x4>
raise_softirq(TIMER_SOFTIRQ);
c103c6d4: b8 01 00 00 00 mov $0x1,%eax
c103c6d9: e8 fc ff ff ff call c103c6da <run_local_timers+0xe>
}
c103c6de: 5d pop %ebp
c103c6df: c3 ret
c103c6e0 <update_process_times>:
/*
* Called from the timer interrupt handler to charge one tick to the current
* process. user_tick is 1 if the tick is user time, 0 for system.
*/
void update_process_times(int user_tick)
{
c103c6e0: 55 push %ebp
c103c6e1: 89 e5 mov %esp,%ebp
c103c6e3: 57 push %edi
c103c6e4: 56 push %esi
c103c6e5: 53 push %ebx
c103c6e6: 89 c3 mov %eax,%ebx
struct task_struct *p = current;
int cpu = smp_processor_id();
c103c6e8: e8 fc ff ff ff call c103c6e9 <update_process_times+0x9>
/* Note: this timer irq context must be accounted for as well. */
account_process_tick(p, user_tick);
c103c6ed: 89 da mov %ebx,%edx
c103c6ef: 64 8b 3d 00 00 00 00 mov %fs:0x0,%edi
* process. user_tick is 1 if the tick is user time, 0 for system.
*/
void update_process_times(int user_tick)
{
struct task_struct *p = current;
int cpu = smp_processor_id();
c103c6f6: 89 c6 mov %eax,%esi
/* Note: this timer irq context must be accounted for as well. */
account_process_tick(p, user_tick);
c103c6f8: 89 f8 mov %edi,%eax
c103c6fa: e8 fc ff ff ff call c103c6fb <update_process_times+0x1b>
run_local_timers();
c103c6ff: e8 fc ff ff ff call c103c700 <update_process_times+0x20>
rcu_check_callbacks(cpu, user_tick);
c103c704: 89 f0 mov %esi,%eax
c103c706: 89 da mov %ebx,%edx
c103c708: e8 fc ff ff ff call c103c709 <update_process_times+0x29>
printk_tick();
c103c70d: e8 fc ff ff ff call c103c70e <update_process_times+0x2e>
#ifdef CONFIG_IRQ_WORK
if (in_irq())
c103c712: 89 e0 mov %esp,%eax
c103c714: 25 00 e0 ff ff and $0xffffe000,%eax
c103c719: f7 40 14 00 00 ff 03 testl $0x3ff0000,0x14(%eax)
c103c720: 74 05 je c103c727 <update_process_times+0x47>
irq_work_run();
c103c722: e8 fc ff ff ff call c103c723 <update_process_times+0x43>
#endif
scheduler_tick();
c103c727: e8 fc ff ff ff call c103c728 <update_process_times+0x48>
run_posix_cpu_timers(p);
c103c72c: 89 f8 mov %edi,%eax
c103c72e: e8 fc ff ff ff call c103c72f <update_process_times+0x4f>
}
c103c733: 5b pop %ebx
c103c734: 5e pop %esi
c103c735: 5f pop %edi
c103c736: 5d pop %ebp
c103c737: c3 ret
c103c738 <get_next_timer_interrupt>:
/**
* get_next_timer_interrupt - return the jiffy of the next pending timer
* @now: current time (in jiffies)
*/
unsigned long get_next_timer_interrupt(unsigned long now)
{
c103c738: 55 push %ebp
c103c739: 89 e5 mov %esp,%ebp
c103c73b: 57 push %edi
c103c73c: 56 push %esi
c103c73d: 53 push %ebx
c103c73e: 83 ec 2c sub $0x2c,%esp
c103c741: 89 45 e0 mov %eax,-0x20(%ebp)
struct tvec_base *base = __this_cpu_read(tvec_bases);
c103c744: 64 8b 1d 00 00 00 00 mov %fs:0x0,%ebx
/*
* Pretend that there is no timer pending if the cpu is offline.
* Possible pending timers will be migrated later to an active cpu.
*/
if (cpu_is_offline(smp_processor_id()))
c103c74b: e8 fc ff ff ff call c103c74c <get_next_timer_interrupt+0x14>
static inline int variable_test_bit(int nr, volatile const unsigned long *addr)
{
int oldbit;
asm volatile("bt %2,%1\n\t"
c103c750: 8b 15 00 00 00 00 mov 0x0,%edx
c103c756: 0f a3 02 bt %eax,(%edx)
c103c759: 19 c0 sbb %eax,%eax
c103c75b: 85 c0 test %eax,%eax
c103c75d: 75 0c jne c103c76b <get_next_timer_interrupt+0x33>
return now + NEXT_TIMER_MAX_DELTA;
c103c75f: 81 45 e0 ff ff ff 3f addl $0x3fffffff,-0x20(%ebp)
c103c766: e9 91 01 00 00 jmp c103c8fc <get_next_timer_interrupt+0x1c4>
raw_spin_lock_init(&(_lock)->rlock); \
} while (0)
static inline void spin_lock(spinlock_t *lock)
{
raw_spin_lock(&lock->rlock);
c103c76b: 89 d8 mov %ebx,%eax
c103c76d: e8 fc ff ff ff call c103c76e <get_next_timer_interrupt+0x36>
spin_lock(&base->lock);
if (time_before_eq(base->next_timer, base->timer_jiffies))
c103c772: 8b 43 08 mov 0x8(%ebx),%eax
c103c775: 3b 43 0c cmp 0xc(%ebx),%eax
c103c778: 0f 88 12 01 00 00 js c103c890 <get_next_timer_interrupt+0x158>
int index, slot, array, found = 0;
struct timer_list *nte;
struct tvec *varray[4];
/* Look for timer events in tv1. */
index = slot = timer_jiffies & TVR_MASK;
c103c77e: 0f b6 c8 movzbl %al,%ecx
c103c781: 89 ce mov %ecx,%esi
do {
list_for_each_entry(nte, base->tv1.vec + slot, entry) {
c103c783: 8d 7c f3 10 lea 0x10(%ebx,%esi,8),%edi
c103c787: 8b 54 f3 10 mov 0x10(%ebx,%esi,8),%edx
c103c78b: 89 7d dc mov %edi,-0x24(%ebp)
c103c78e: eb 20 jmp c103c7b0 <get_next_timer_interrupt+0x78>
if (tbase_get_deferrable(nte->base))
c103c790: f6 42 0c 01 testb $0x1,0xc(%edx)
c103c794: 74 04 je c103c79a <get_next_timer_interrupt+0x62>
struct tvec *varray[4];
/* Look for timer events in tv1. */
index = slot = timer_jiffies & TVR_MASK;
do {
list_for_each_entry(nte, base->tv1.vec + slot, entry) {
c103c796: 89 fa mov %edi,%edx
c103c798: eb 16 jmp c103c7b0 <get_next_timer_interrupt+0x78>
continue;
found = 1;
expires = nte->expires;
/* Look at the cascade bucket(s)? */
if (!index || slot < index)
c103c79a: 39 ce cmp %ecx,%esi
list_for_each_entry(nte, base->tv1.vec + slot, entry) {
if (tbase_get_deferrable(nte->base))
continue;
found = 1;
expires = nte->expires;
c103c79c: 8b 52 08 mov 0x8(%edx),%edx
/* Look at the cascade bucket(s)? */
if (!index || slot < index)
c103c79f: 7c 08 jl c103c7a9 <get_next_timer_interrupt+0x71>
c103c7a1: 85 c9 test %ecx,%ecx
c103c7a3: 0f 85 e4 00 00 00 jne c103c88d <get_next_timer_interrupt+0x155>
c103c7a9: bf 01 00 00 00 mov $0x1,%edi
c103c7ae: eb 1e jmp c103c7ce <get_next_timer_interrupt+0x96>
struct tvec *varray[4];
/* Look for timer events in tv1. */
index = slot = timer_jiffies & TVR_MASK;
do {
list_for_each_entry(nte, base->tv1.vec + slot, entry) {
c103c7b0: 8b 3a mov (%edx),%edi
c103c7b2: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
c103c7b6: 3b 55 dc cmp -0x24(%ebp),%edx
c103c7b9: 75 d5 jne c103c790 <get_next_timer_interrupt+0x58>
/* Look at the cascade bucket(s)? */
if (!index || slot < index)
goto cascade;
return expires;
}
slot = (slot + 1) & TVR_MASK;
c103c7bb: 46 inc %esi
c103c7bc: 81 e6 ff 00 00 00 and $0xff,%esi
} while (slot != index);
c103c7c2: 39 ce cmp %ecx,%esi
c103c7c4: 75 bd jne c103c783 <get_next_timer_interrupt+0x4b>
* This function needs to be called with interrupts disabled.
*/
static unsigned long __next_timer_interrupt(struct tvec_base *base)
{
unsigned long timer_jiffies = base->timer_jiffies;
unsigned long expires = timer_jiffies + NEXT_TIMER_MAX_DELTA;
c103c7c6: 8d 90 ff ff ff 3f lea 0x3fffffff(%eax),%edx
c103c7cc: 31 ff xor %edi,%edi
slot = (slot + 1) & TVR_MASK;
} while (slot != index);
cascade:
/* Calculate the next cascade event */
if (index)
c103c7ce: 85 c9 test %ecx,%ecx
c103c7d0: 74 07 je c103c7d9 <get_next_timer_interrupt+0xa1>
timer_jiffies += TVR_SIZE - index;
c103c7d2: 05 00 01 00 00 add $0x100,%eax
c103c7d7: 29 c8 sub %ecx,%eax
timer_jiffies >>= TVR_BITS;
c103c7d9: c1 e8 08 shr $0x8,%eax
c103c7dc: 89 45 dc mov %eax,-0x24(%ebp)
/* Check tv2-tv5. */
varray[0] = &base->tv2;
c103c7df: 8d 83 10 08 00 00 lea 0x810(%ebx),%eax
c103c7e5: 89 45 e4 mov %eax,-0x1c(%ebp)
varray[1] = &base->tv3;
c103c7e8: 8d 83 10 0a 00 00 lea 0xa10(%ebx),%eax
c103c7ee: 89 45 e8 mov %eax,-0x18(%ebp)
varray[2] = &base->tv4;
c103c7f1: 8d 83 10 0c 00 00 lea 0xc10(%ebx),%eax
c103c7f7: 89 45 ec mov %eax,-0x14(%ebp)
varray[3] = &base->tv5;
c103c7fa: 8d 83 10 0e 00 00 lea 0xe10(%ebx),%eax
c103c800: 89 45 f0 mov %eax,-0x10(%ebp)
c103c803: c7 45 d8 00 00 00 00 movl $0x0,-0x28(%ebp)
for (array = 0; array < 4; array++) {
struct tvec *varp = varray[array];
c103c80a: 89 5d cc mov %ebx,-0x34(%ebp)
c103c80d: 8b 45 d8 mov -0x28(%ebp),%eax
index = slot = timer_jiffies & TVN_MASK;
c103c810: 8b 4d dc mov -0x24(%ebp),%ecx
varray[1] = &base->tv3;
varray[2] = &base->tv4;
varray[3] = &base->tv5;
for (array = 0; array < 4; array++) {
struct tvec *varp = varray[array];
c103c813: 8b 44 85 e4 mov -0x1c(%ebp,%eax,4),%eax
index = slot = timer_jiffies & TVN_MASK;
c103c817: 83 e1 3f and $0x3f,%ecx
varray[1] = &base->tv3;
varray[2] = &base->tv4;
varray[3] = &base->tv5;
for (array = 0; array < 4; array++) {
struct tvec *varp = varray[array];
c103c81a: 89 45 d0 mov %eax,-0x30(%ebp)
index = slot = timer_jiffies & TVN_MASK;
c103c81d: 89 c8 mov %ecx,%eax
do {
list_for_each_entry(nte, varp->vec + slot, entry) {
c103c81f: 8b 75 d0 mov -0x30(%ebp),%esi
c103c822: 8b 1c c6 mov (%esi,%eax,8),%ebx
c103c825: 8d 34 c6 lea (%esi,%eax,8),%esi
c103c828: 89 75 c8 mov %esi,-0x38(%ebp)
c103c82b: eb 1a jmp c103c847 <get_next_timer_interrupt+0x10f>
if (tbase_get_deferrable(nte->base))
c103c82d: f6 43 0c 01 testb $0x1,0xc(%ebx)
c103c831: 89 d6 mov %edx,%esi
c103c833: 75 0d jne c103c842 <get_next_timer_interrupt+0x10a>
continue;
found = 1;
if (time_before(nte->expires, expires))
c103c835: 8b 73 08 mov 0x8(%ebx),%esi
c103c838: bf 01 00 00 00 mov $0x1,%edi
c103c83d: 39 d6 cmp %edx,%esi
c103c83f: 0f 49 f2 cmovns %edx,%esi
for (array = 0; array < 4; array++) {
struct tvec *varp = varray[array];
index = slot = timer_jiffies & TVN_MASK;
do {
list_for_each_entry(nte, varp->vec + slot, entry) {
c103c842: 8b 5d d4 mov -0x2c(%ebp),%ebx
c103c845: 89 f2 mov %esi,%edx
c103c847: 8b 33 mov (%ebx),%esi
c103c849: 89 75 d4 mov %esi,-0x2c(%ebp)
c103c84c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
c103c850: 3b 5d c8 cmp -0x38(%ebp),%ebx
c103c853: 75 d8 jne c103c82d <get_next_timer_interrupt+0xf5>
}
/*
* Do we still search for the first timer or are
* we looking up the cascade buckets ?
*/
if (found) {
c103c855: 85 ff test %edi,%edi
c103c857: 74 0f je c103c868 <get_next_timer_interrupt+0x130>
/* Look at the cascade bucket(s)? */
if (!index || slot < index)
c103c859: 39 c8 cmp %ecx,%eax
c103c85b: 7c 04 jl c103c861 <get_next_timer_interrupt+0x129>
c103c85d: 85 c9 test %ecx,%ecx
c103c85f: 75 29 jne c103c88a <get_next_timer_interrupt+0x152>
c103c861: bf 01 00 00 00 mov $0x1,%edi
c103c866: eb 08 jmp c103c870 <get_next_timer_interrupt+0x138>
break;
return expires;
}
slot = (slot + 1) & TVN_MASK;
c103c868: 40 inc %eax
c103c869: 83 e0 3f and $0x3f,%eax
} while (slot != index);
c103c86c: 39 c8 cmp %ecx,%eax
c103c86e: 75 af jne c103c81f <get_next_timer_interrupt+0xe7>
if (index)
c103c870: 85 c9 test %ecx,%ecx
c103c872: 74 07 je c103c87b <get_next_timer_interrupt+0x143>
timer_jiffies += TVN_SIZE - index;
c103c874: 83 45 dc 40 addl $0x40,-0x24(%ebp)
c103c878: 29 4d dc sub %ecx,-0x24(%ebp)
varray[0] = &base->tv2;
varray[1] = &base->tv3;
varray[2] = &base->tv4;
varray[3] = &base->tv5;
for (array = 0; array < 4; array++) {
c103c87b: ff 45 d8 incl -0x28(%ebp)
c103c87e: 83 7d d8 04 cmpl $0x4,-0x28(%ebp)
c103c882: 74 06 je c103c88a <get_next_timer_interrupt+0x152>
slot = (slot + 1) & TVN_MASK;
} while (slot != index);
if (index)
timer_jiffies += TVN_SIZE - index;
timer_jiffies >>= TVN_BITS;
c103c884: c1 6d dc 06 shrl $0x6,-0x24(%ebp)
c103c888: eb 83 jmp c103c80d <get_next_timer_interrupt+0xd5>
c103c88a: 8b 5d cc mov -0x34(%ebp),%ebx
*/
if (cpu_is_offline(smp_processor_id()))
return now + NEXT_TIMER_MAX_DELTA;
spin_lock(&base->lock);
if (time_before_eq(base->next_timer, base->timer_jiffies))
base->next_timer = __next_timer_interrupt(base);
c103c88d: 89 53 0c mov %edx,0xc(%ebx)
expires = base->next_timer;
c103c890: 8b 73 0c mov 0xc(%ebx),%esi
raw_spin_lock_irqsave_nested(spinlock_check(lock), flags, subclass); \
} while (0)
static inline void spin_unlock(spinlock_t *lock)
{
raw_spin_unlock(&lock->rlock);
c103c893: 89 d8 mov %ebx,%eax
c103c895: e8 fc ff ff ff call c103c896 <get_next_timer_interrupt+0x15e>
spin_unlock(&base->lock);
if (time_before_eq(expires, now))
c103c89a: 39 75 e0 cmp %esi,-0x20(%ebp)
c103c89d: 79 5d jns c103c8fc <get_next_timer_interrupt+0x1c4>
* event:
*/
static unsigned long cmp_next_hrtimer_event(unsigned long now,
unsigned long expires)
{
ktime_t hr_delta = hrtimer_get_next_event();
c103c89f: e8 fc ff ff ff call c103c8a0 <get_next_timer_interrupt+0x168>
struct timespec tsdelta;
unsigned long delta;
if (hr_delta.tv64 == KTIME_MAX)
c103c8a4: 81 fa ff ff ff 7f cmp $0x7fffffff,%edx
c103c8aa: 75 07 jne c103c8b3 <get_next_timer_interrupt+0x17b>
c103c8ac: 83 f8 ff cmp $0xffffffff,%eax
c103c8af: 75 13 jne c103c8c4 <get_next_timer_interrupt+0x18c>
c103c8b1: eb 46 jmp c103c8f9 <get_next_timer_interrupt+0x1c1>
return expires;
/*
* Expired timer available, let it expire in the next tick
*/
if (hr_delta.tv64 <= 0)
c103c8b3: 83 fa 00 cmp $0x0,%edx
c103c8b6: 7f 0c jg c103c8c4 <get_next_timer_interrupt+0x18c>
c103c8b8: 7c 05 jl c103c8bf <get_next_timer_interrupt+0x187>
c103c8ba: 83 f8 00 cmp $0x0,%eax
c103c8bd: 77 05 ja c103c8c4 <get_next_timer_interrupt+0x18c>
return now + 1;
c103c8bf: ff 45 e0 incl -0x20(%ebp)
c103c8c2: eb 38 jmp c103c8fc <get_next_timer_interrupt+0x1c4>
tsdelta = ktime_to_timespec(hr_delta);
c103c8c4: e8 fc ff ff ff call c103c8c5 <get_next_timer_interrupt+0x18d>
c103c8c9: 89 45 e4 mov %eax,-0x1c(%ebp)
delta = timespec_to_jiffies(&tsdelta);
c103c8cc: 8d 45 e4 lea -0x1c(%ebp),%eax
* Expired timer available, let it expire in the next tick
*/
if (hr_delta.tv64 <= 0)
return now + 1;
tsdelta = ktime_to_timespec(hr_delta);
c103c8cf: 89 55 e8 mov %edx,-0x18(%ebp)
delta = timespec_to_jiffies(&tsdelta);
c103c8d2: e8 fc ff ff ff call c103c8d3 <get_next_timer_interrupt+0x19b>
/*
* Limit the delta to the max value, which is checked in
* tick_nohz_stop_sched_tick():
*/
if (delta > NEXT_TIMER_MAX_DELTA)
c103c8d7: 3d ff ff ff 3f cmp $0x3fffffff,%eax
c103c8dc: 76 07 jbe c103c8e5 <get_next_timer_interrupt+0x1ad>
c103c8de: b8 ff ff ff 3f mov $0x3fffffff,%eax
c103c8e3: eb 0a jmp c103c8ef <get_next_timer_interrupt+0x1b7>
* Take rounding errors in to account and make sure, that it
* expires in the next tick. Otherwise we go into an endless
* ping pong due to tick_nohz_stop_sched_tick() retriggering
* the timer softirq
*/
if (delta < 1)
c103c8e5: 85 c0 test %eax,%eax
c103c8e7: ba 01 00 00 00 mov $0x1,%edx
c103c8ec: 0f 44 c2 cmove %edx,%eax
delta = 1;
now += delta;
c103c8ef: 03 45 e0 add -0x20(%ebp),%eax
if (time_before(now, expires))
c103c8f2: 39 f0 cmp %esi,%eax
c103c8f4: 89 45 e0 mov %eax,-0x20(%ebp)
c103c8f7: 78 03 js c103c8fc <get_next_timer_interrupt+0x1c4>
c103c8f9: 89 75 e0 mov %esi,-0x20(%ebp)
if (time_before_eq(expires, now))
return now;
return cmp_next_hrtimer_event(now, expires);
}
c103c8fc: 8b 45 e0 mov -0x20(%ebp),%eax
c103c8ff: 83 c4 2c add $0x2c,%esp
c103c902: 5b pop %ebx
c103c903: 5e pop %esi
c103c904: 5f pop %edi
c103c905: 5d pop %ebp
c103c906: c3 ret
c103c907 <__timer_stats_timer_set_start_info>:
list_add_tail(&timer->entry, vec);
}
#ifdef CONFIG_TIMER_STATS
void __timer_stats_timer_set_start_info(struct timer_list *timer, void *addr)
{
c103c907: 55 push %ebp
if (timer->start_site)
c103c908: 83 78 20 00 cmpl $0x0,0x20(%eax)
list_add_tail(&timer->entry, vec);
}
#ifdef CONFIG_TIMER_STATS
void __timer_stats_timer_set_start_info(struct timer_list *timer, void *addr)
{
c103c90c: 89 e5 mov %esp,%ebp
c103c90e: 57 push %edi
c103c90f: 56 push %esi
c103c910: 53 push %ebx
if (timer->start_site)
c103c911: 75 25 jne c103c938 <__timer_stats_timer_set_start_info+0x31>
return;
timer->start_site = addr;
memcpy(timer->start_comm, current->comm, TASK_COMM_LEN);
c103c913: 8d 58 24 lea 0x24(%eax),%ebx
c103c916: b9 04 00 00 00 mov $0x4,%ecx
void __timer_stats_timer_set_start_info(struct timer_list *timer, void *addr)
{
if (timer->start_site)
return;
timer->start_site = addr;
c103c91b: 89 50 20 mov %edx,0x20(%eax)
memcpy(timer->start_comm, current->comm, TASK_COMM_LEN);
c103c91e: 89 df mov %ebx,%edi
c103c920: 64 8b 15 00 00 00 00 mov %fs:0x0,%edx
c103c927: 8d b2 dc 02 00 00 lea 0x2dc(%edx),%esi
c103c92d: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
timer->start_pid = current->pid;
c103c92f: 8b 92 00 02 00 00 mov 0x200(%edx),%edx
c103c935: 89 50 1c mov %edx,0x1c(%eax)
}
c103c938: 5b pop %ebx
c103c939: 5e pop %esi
c103c93a: 5f pop %edi
c103c93b: 5d pop %ebp
c103c93c: c3 ret
c103c93d <timer_stats_timer_set_start_info>:
extern void __timer_stats_timer_set_start_info(struct timer_list *timer,
void *addr);
static inline void timer_stats_timer_set_start_info(struct timer_list *timer)
{
if (likely(!timer_stats_active))
c103c93d: 83 3d 00 00 00 00 00 cmpl $0x0,0x0
extern void __timer_stats_timer_set_start_info(struct timer_list *timer,
void *addr);
static inline void timer_stats_timer_set_start_info(struct timer_list *timer)
{
c103c944: 55 push %ebp
c103c945: 89 e5 mov %esp,%ebp
if (likely(!timer_stats_active))
c103c947: 74 08 je c103c951 <timer_stats_timer_set_start_info+0x14>
return;
__timer_stats_timer_set_start_info(timer, __builtin_return_address(0));
c103c949: 8b 55 04 mov 0x4(%ebp),%edx
c103c94c: e8 fc ff ff ff call c103c94d <timer_stats_timer_set_start_info+0x10>
}
c103c951: 5d pop %ebp
c103c952: c3 ret
c103c953 <__mod_timer>:
}
static inline int
__mod_timer(struct timer_list *timer, unsigned long expires,
bool pending_only, int pinned)
{
c103c953: 55 push %ebp
c103c954: 89 e5 mov %esp,%ebp
c103c956: 57 push %edi
c103c957: 89 d7 mov %edx,%edi
c103c959: 56 push %esi
c103c95a: 53 push %ebx
c103c95b: 89 c3 mov %eax,%ebx
c103c95d: 83 ec 10 sub $0x10,%esp
c103c960: 88 4d ec mov %cl,-0x14(%ebp)
struct tvec_base *base, *new_base;
unsigned long flags;
int ret = 0 , cpu;
timer_stats_timer_set_start_info(timer);
c103c963: e8 d5 ff ff ff call c103c93d <timer_stats_timer_set_start_info>
BUG_ON(!timer->function);
c103c968: 83 7b 10 00 cmpl $0x0,0x10(%ebx)
c103c96c: 75 04 jne c103c972 <__mod_timer+0x1f>
c103c96e: 0f 0b ud2a
c103c970: eb fe jmp c103c970 <__mod_timer+0x1d>
base = lock_timer_base(timer, &flags);
c103c972: 8d 55 f0 lea -0x10(%ebp),%edx
c103c975: 89 d8 mov %ebx,%eax
c103c977: e8 a4 fb ff ff call c103c520 <lock_timer_base>
if (timer_pending(timer)) {
c103c97c: 83 3b 00 cmpl $0x0,(%ebx)
int ret = 0 , cpu;
timer_stats_timer_set_start_info(timer);
BUG_ON(!timer->function);
base = lock_timer_base(timer, &flags);
c103c97f: 89 c6 mov %eax,%esi
if (timer_pending(timer)) {
c103c981: 74 1f je c103c9a2 <__mod_timer+0x4f>
detach_timer(timer, 0);
c103c983: 31 d2 xor %edx,%edx
c103c985: 89 d8 mov %ebx,%eax
c103c987: e8 04 f7 ff ff call c103c090 <detach_timer>
if (timer->expires == base->next_timer &&
c103c98c: 8b 43 08 mov 0x8(%ebx),%eax
c103c98f: 3b 46 0c cmp 0xc(%esi),%eax
c103c992: 75 20 jne c103c9b4 <__mod_timer+0x61>
!tbase_get_deferrable(timer->base))
c103c994: f6 43 0c 01 testb $0x1,0xc(%ebx)
c103c998: 75 1a jne c103c9b4 <__mod_timer+0x61>
base->next_timer = base->timer_jiffies;
c103c99a: 8b 46 08 mov 0x8(%esi),%eax
c103c99d: 89 46 0c mov %eax,0xc(%esi)
c103c9a0: eb 12 jmp c103c9b4 <__mod_timer+0x61>
ret = 1;
} else {
if (pending_only)
c103c9a2: 80 7d ec 00 cmpb $0x0,-0x14(%ebp)
c103c9a6: c7 45 e8 00 00 00 00 movl $0x0,-0x18(%ebp)
c103c9ad: 74 0c je c103c9bb <__mod_timer+0x68>
c103c9af: e9 8a 00 00 00 jmp c103ca3e <__mod_timer+0xeb>
c103c9b4: c7 45 e8 01 00 00 00 movl $0x1,-0x18(%ebp)
goto out_unlock;
}
debug_activate(timer, expires);
c103c9bb: 89 fa mov %edi,%edx
c103c9bd: 89 d8 mov %ebx,%eax
c103c9bf: e8 6a f7 ff ff call c103c12e <debug_activate>
cpu = smp_processor_id();
c103c9c4: e8 fc ff ff ff call c103c9c5 <__mod_timer+0x72>
#if defined(CONFIG_NO_HZ) && defined(CONFIG_SMP)
if (!pinned && get_sysctl_timer_migration() && idle_cpu(cpu))
c103c9c9: 83 7d 08 00 cmpl $0x0,0x8(%ebp)
goto out_unlock;
}
debug_activate(timer, expires);
cpu = smp_processor_id();
c103c9cd: 89 c2 mov %eax,%edx
#if defined(CONFIG_NO_HZ) && defined(CONFIG_SMP)
if (!pinned && get_sysctl_timer_migration() && idle_cpu(cpu))
c103c9cf: 75 16 jne c103c9e7 <__mod_timer+0x94>
c103c9d1: 89 55 e4 mov %edx,-0x1c(%ebp)
c103c9d4: e8 fc ff ff ff call c103c9d5 <__mod_timer+0x82>
c103c9d9: 8b 55 e4 mov -0x1c(%ebp),%edx
c103c9dc: 85 c0 test %eax,%eax
c103c9de: 74 07 je c103c9e7 <__mod_timer+0x94>
cpu = get_nohz_timer_target();
c103c9e0: e8 fc ff ff ff call c103c9e1 <__mod_timer+0x8e>
c103c9e5: 89 c2 mov %eax,%edx
#endif
new_base = per_cpu(tvec_bases, cpu);
c103c9e7: 8b 14 95 00 00 00 00 mov 0x0(,%edx,4),%edx
c103c9ee: b8 00 00 00 00 mov $0x0,%eax
c103c9f3: 8b 14 02 mov (%edx,%eax,1),%edx
if (base != new_base) {
c103c9f6: 39 d6 cmp %edx,%esi
#if defined(CONFIG_NO_HZ) && defined(CONFIG_SMP)
if (!pinned && get_sysctl_timer_migration() && idle_cpu(cpu))
cpu = get_nohz_timer_target();
#endif
new_base = per_cpu(tvec_bases, cpu);
c103c9f8: 89 55 ec mov %edx,-0x14(%ebp)
if (base != new_base) {
c103c9fb: 74 27 je c103ca24 <__mod_timer+0xd1>
* However we can't change timer's base while it is running,
* otherwise del_timer_sync() can't detect that the timer's
* handler yet has not finished. This also guarantees that
* the timer is serialized wrt itself.
*/
if (likely(base->running_timer != timer)) {
c103c9fd: 39 5e 04 cmp %ebx,0x4(%esi)
c103ca00: 74 22 je c103ca24 <__mod_timer+0xd1>
}
static inline void
timer_set_base(struct timer_list *timer, struct tvec_base *new_base)
{
timer->base = (struct tvec_base *)((unsigned long)(new_base) |
c103ca02: 83 63 0c 01 andl $0x1,0xc(%ebx)
c103ca06: 89 f0 mov %esi,%eax
c103ca08: e8 fc ff ff ff call c103ca09 <__mod_timer+0xb6>
raw_spin_lock_init(&(_lock)->rlock); \
} while (0)
static inline void spin_lock(spinlock_t *lock)
{
raw_spin_lock(&lock->rlock);
c103ca0d: 8b 45 ec mov -0x14(%ebp),%eax
c103ca10: e8 fc ff ff ff call c103ca11 <__mod_timer+0xbe>
c103ca15: 8b 43 0c mov 0xc(%ebx),%eax
c103ca18: 8b 75 ec mov -0x14(%ebp),%esi
c103ca1b: 83 e0 01 and $0x1,%eax
c103ca1e: 0b 45 ec or -0x14(%ebp),%eax
c103ca21: 89 43 0c mov %eax,0xc(%ebx)
spin_lock(&base->lock);
timer_set_base(timer, base);
}
}
timer->expires = expires;
c103ca24: 89 7b 08 mov %edi,0x8(%ebx)
if (time_before(timer->expires, base->next_timer) &&
c103ca27: 3b 7e 0c cmp 0xc(%esi),%edi
c103ca2a: 79 09 jns c103ca35 <__mod_timer+0xe2>
!tbase_get_deferrable(timer->base))
c103ca2c: f6 43 0c 01 testb $0x1,0xc(%ebx)
c103ca30: 75 03 jne c103ca35 <__mod_timer+0xe2>
base->next_timer = timer->expires;
c103ca32: 89 7e 0c mov %edi,0xc(%esi)
internal_add_timer(base, timer);
c103ca35: 89 da mov %ebx,%edx
c103ca37: 89 f0 mov %esi,%eax
c103ca39: e8 e8 e1 ff ff call c103ac26 <internal_add_timer>
raw_spin_unlock_irq(&lock->rlock);
}
static inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
{
raw_spin_unlock_irqrestore(&lock->rlock, flags);
c103ca3e: 8b 55 f0 mov -0x10(%ebp),%edx
c103ca41: 89 f0 mov %esi,%eax
c103ca43: e8 fc ff ff ff call c103ca44 <__mod_timer+0xf1>
out_unlock:
spin_unlock_irqrestore(&base->lock, flags);
return ret;
}
c103ca48: 8b 45 e8 mov -0x18(%ebp),%eax
c103ca4b: 83 c4 10 add $0x10,%esp
c103ca4e: 5b pop %ebx
c103ca4f: 5e pop %esi
c103ca50: 5f pop %edi
c103ca51: 5d pop %ebp
c103ca52: c3 ret
c103ca53 <msleep>:
/**
* msleep - sleep safely even with waitqueue interruptions
* @msecs: Time in milliseconds to sleep for
*/
void msleep(unsigned int msecs)
{
c103ca53: 55 push %ebp
c103ca54: 89 e5 mov %esp,%ebp
unsigned long timeout = msecs_to_jiffies(msecs) + 1;
c103ca56: e8 fc ff ff ff call c103ca57 <msleep+0x4>
c103ca5b: 40 inc %eax
while (timeout)
c103ca5c: eb 05 jmp c103ca63 <msleep+0x10>
timeout = schedule_timeout_uninterruptible(timeout);
c103ca5e: e8 fc ff ff ff call c103ca5f <msleep+0xc>
*/
void msleep(unsigned int msecs)
{
unsigned long timeout = msecs_to_jiffies(msecs) + 1;
while (timeout)
c103ca63: 85 c0 test %eax,%eax
c103ca65: 75 f7 jne c103ca5e <msleep+0xb>
timeout = schedule_timeout_uninterruptible(timeout);
}
c103ca67: 5d pop %ebp
c103ca68: c3 ret
c103ca69 <msleep_interruptible>:
/**
* msleep_interruptible - sleep waiting for signals
* @msecs: Time in milliseconds to sleep for
*/
unsigned long msleep_interruptible(unsigned int msecs)
{
c103ca69: 55 push %ebp
c103ca6a: 89 e5 mov %esp,%ebp
c103ca6c: 53 push %ebx
unsigned long timeout = msecs_to_jiffies(msecs) + 1;
c103ca6d: e8 fc ff ff ff call c103ca6e <msleep_interruptible+0x5>
c103ca72: 64 8b 1d 00 00 00 00 mov %fs:0x0,%ebx
c103ca79: 40 inc %eax
while (timeout && !signal_pending(current))
c103ca7a: eb 05 jmp c103ca81 <msleep_interruptible+0x18>
timeout = schedule_timeout_interruptible(timeout);
c103ca7c: e8 fc ff ff ff call c103ca7d <msleep_interruptible+0x14>
*/
unsigned long msleep_interruptible(unsigned int msecs)
{
unsigned long timeout = msecs_to_jiffies(msecs) + 1;
while (timeout && !signal_pending(current))
c103ca81: 85 c0 test %eax,%eax
c103ca83: 74 0b je c103ca90 <msleep_interruptible+0x27>
return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
}
static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
{
return test_bit(flag, (unsigned long *)&ti->flags);
c103ca85: 8b 53 04 mov 0x4(%ebx),%edx
}
static __always_inline int constant_test_bit(unsigned int nr, const volatile unsigned long *addr)
{
return ((1UL << (nr % BITS_PER_LONG)) &
(addr[nr / BITS_PER_LONG])) != 0;
c103ca88: 8b 52 08 mov 0x8(%edx),%edx
c103ca8b: 80 e2 04 and $0x4,%dl
c103ca8e: 74 ec je c103ca7c <msleep_interruptible+0x13>
timeout = schedule_timeout_interruptible(timeout);
return jiffies_to_msecs(timeout);
c103ca90: e8 fc ff ff ff call c103ca91 <msleep_interruptible+0x28>
}
c103ca95: 5b pop %ebx
c103ca96: 5d pop %ebp
c103ca97: c3 ret
c103ca98 <mod_timer_pinned>:
* mod_timer_pinned(timer, expires) is equivalent to:
*
* del_timer(timer); timer->expires = expires; add_timer(timer);
*/
int mod_timer_pinned(struct timer_list *timer, unsigned long expires)
{
c103ca98: 55 push %ebp
if (timer->expires == expires && timer_pending(timer))
c103ca99: 39 50 08 cmp %edx,0x8(%eax)
* mod_timer_pinned(timer, expires) is equivalent to:
*
* del_timer(timer); timer->expires = expires; add_timer(timer);
*/
int mod_timer_pinned(struct timer_list *timer, unsigned long expires)
{
c103ca9c: 89 e5 mov %esp,%ebp
if (timer->expires == expires && timer_pending(timer))
c103ca9e: 75 0a jne c103caaa <mod_timer_pinned+0x12>
c103caa0: 83 38 00 cmpl $0x0,(%eax)
c103caa3: b9 01 00 00 00 mov $0x1,%ecx
c103caa8: 75 0c jne c103cab6 <mod_timer_pinned+0x1e>
return 1;
return __mod_timer(timer, expires, false, TIMER_PINNED);
c103caaa: 31 c9 xor %ecx,%ecx
c103caac: 6a 01 push $0x1
c103caae: e8 a0 fe ff ff call c103c953 <__mod_timer>
c103cab3: 89 c1 mov %eax,%ecx
c103cab5: 58 pop %eax
}
c103cab6: 89 c8 mov %ecx,%eax
c103cab8: c9 leave
c103cab9: c3 ret
c103caba <mod_timer>:
* The function returns whether it has modified a pending timer or not.
* (ie. mod_timer() of an inactive timer returns 0, mod_timer() of an
* active timer returns 1.)
*/
int mod_timer(struct timer_list *timer, unsigned long expires)
{
c103caba: 55 push %ebp
c103cabb: 89 e5 mov %esp,%ebp
c103cabd: 56 push %esi
c103cabe: 53 push %ebx
c103cabf: 89 c3 mov %eax,%ebx
c103cac1: 83 ec 04 sub $0x4,%esp
/*
* This is a common optimization triggered by the
* networking code - if the timer is re-modified
* to be the same thing then just return:
*/
if (timer_pending(timer) && timer->expires == expires)
c103cac4: 83 38 00 cmpl $0x0,(%eax)
c103cac7: 74 0a je c103cad3 <mod_timer+0x19>
c103cac9: 39 53 08 cmp %edx,0x8(%ebx)
c103cacc: b8 01 00 00 00 mov $0x1,%eax
c103cad1: 74 53 je c103cb26 <mod_timer+0x6c>
unsigned long expires_limit, mask;
int bit;
expires_limit = expires;
if (timer->slack >= 0) {
c103cad3: 8b 73 18 mov 0x18(%ebx),%esi
c103cad6: 85 f6 test %esi,%esi
c103cad8: 78 05 js c103cadf <mod_timer+0x25>
expires_limit = expires + timer->slack;
c103cada: 8d 34 32 lea (%edx,%esi,1),%esi
c103cadd: eb 12 jmp c103caf1 <mod_timer+0x37>
} else {
unsigned long now = jiffies;
c103cadf: a1 00 00 00 00 mov 0x0,%eax
/* No slack, if already expired else auto slack 0.4% */
if (time_after(expires, now))
c103cae4: 89 d6 mov %edx,%esi
c103cae6: 39 d0 cmp %edx,%eax
c103cae8: 79 07 jns c103caf1 <mod_timer+0x37>
expires_limit = expires + (expires - now)/256;
c103caea: 29 c6 sub %eax,%esi
c103caec: c1 ee 08 shr $0x8,%esi
c103caef: 01 d6 add %edx,%esi
}
mask = expires ^ expires_limit;
c103caf1: 89 f0 mov %esi,%eax
c103caf3: 31 d0 xor %edx,%eax
if (mask == 0)
c103caf5: 85 c0 test %eax,%eax
/* No slack, if already expired else auto slack 0.4% */
if (time_after(expires, now))
expires_limit = expires + (expires - now)/256;
}
mask = expires ^ expires_limit;
c103caf7: 89 45 f4 mov %eax,-0xc(%ebp)
if (mask == 0)
c103cafa: 74 1e je c103cb1a <mod_timer+0x60>
return expires;
bit = find_last_bit(&mask, BITS_PER_LONG);
c103cafc: ba 20 00 00 00 mov $0x20,%edx
c103cb01: 8d 45 f4 lea -0xc(%ebp),%eax
c103cb04: e8 fc ff ff ff call c103cb05 <mod_timer+0x4b>
mask = (1 << bit) - 1;
c103cb09: ba 01 00 00 00 mov $0x1,%edx
c103cb0e: 88 c1 mov %al,%cl
c103cb10: d3 e2 shl %cl,%edx
c103cb12: 4a dec %edx
c103cb13: 89 55 f4 mov %edx,-0xc(%ebp)
expires_limit = expires_limit & ~(mask);
c103cb16: f7 d2 not %edx
c103cb18: 21 f2 and %esi,%edx
if (timer_pending(timer) && timer->expires == expires)
return 1;
expires = apply_slack(timer, expires);
return __mod_timer(timer, expires, false, TIMER_NOT_PINNED);
c103cb1a: 6a 00 push $0x0
c103cb1c: 31 c9 xor %ecx,%ecx
c103cb1e: 89 d8 mov %ebx,%eax
c103cb20: e8 2e fe ff ff call c103c953 <__mod_timer>
c103cb25: 5a pop %edx
}
c103cb26: 8d 65 f8 lea -0x8(%ebp),%esp
c103cb29: 5b pop %ebx
c103cb2a: 5e pop %esi
c103cb2b: 5d pop %ebp
c103cb2c: c3 ret
c103cb2d <add_timer>:
*
* Timers with an ->expires field in the past will be executed in the next
* timer tick.
*/
void add_timer(struct timer_list *timer)
{
c103cb2d: 55 push %ebp
BUG_ON(timer_pending(timer));
c103cb2e: 83 38 00 cmpl $0x0,(%eax)
*
* Timers with an ->expires field in the past will be executed in the next
* timer tick.
*/
void add_timer(struct timer_list *timer)
{
c103cb31: 89 e5 mov %esp,%ebp
BUG_ON(timer_pending(timer));
c103cb33: 74 04 je c103cb39 <add_timer+0xc>
c103cb35: 0f 0b ud2a
c103cb37: eb fe jmp c103cb37 <add_timer+0xa>
mod_timer(timer, timer->expires);
c103cb39: 8b 50 08 mov 0x8(%eax),%edx
c103cb3c: e8 fc ff ff ff call c103cb3d <add_timer+0x10>
}
c103cb41: 5d pop %ebp
c103cb42: c3 ret
c103cb43 <mod_timer_pending>:
* but will not re-activate and modify already deleted timers.
*
* It is useful for unserialized use of timers.
*/
int mod_timer_pending(struct timer_list *timer, unsigned long expires)
{
c103cb43: 55 push %ebp
return __mod_timer(timer, expires, true, TIMER_NOT_PINNED);
c103cb44: b9 01 00 00 00 mov $0x1,%ecx
* but will not re-activate and modify already deleted timers.
*
* It is useful for unserialized use of timers.
*/
int mod_timer_pending(struct timer_list *timer, unsigned long expires)
{
c103cb49: 89 e5 mov %esp,%ebp
return __mod_timer(timer, expires, true, TIMER_NOT_PINNED);
c103cb4b: 6a 00 push $0x0
c103cb4d: e8 01 fe ff ff call c103c953 <__mod_timer>
}
c103cb52: c9 leave
c103cb53: c3 ret
c103cb54 <add_timer_on>:
* @cpu: the CPU to start it on
*
* This is not very scalable on SMP. Double adds are not possible.
*/
void add_timer_on(struct timer_list *timer, int cpu)
{
c103cb54: 55 push %ebp
c103cb55: 89 e5 mov %esp,%ebp
c103cb57: 57 push %edi
c103cb58: 89 d7 mov %edx,%edi
c103cb5a: 56 push %esi
c103cb5b: 53 push %ebx
c103cb5c: 89 c3 mov %eax,%ebx
c103cb5e: 83 ec 04 sub $0x4,%esp
struct tvec_base *base = per_cpu(tvec_bases, cpu);
c103cb61: 8b 14 95 00 00 00 00 mov 0x0(,%edx,4),%edx
c103cb68: b8 00 00 00 00 mov $0x0,%eax
c103cb6d: 8b 34 10 mov (%eax,%edx,1),%esi
unsigned long flags;
timer_stats_timer_set_start_info(timer);
c103cb70: 89 d8 mov %ebx,%eax
c103cb72: e8 c6 fd ff ff call c103c93d <timer_stats_timer_set_start_info>
BUG_ON(timer_pending(timer) || !timer->function);
c103cb77: 83 3b 00 cmpl $0x0,(%ebx)
c103cb7a: 75 06 jne c103cb82 <add_timer_on+0x2e>
c103cb7c: 83 7b 10 00 cmpl $0x0,0x10(%ebx)
c103cb80: 75 04 jne c103cb86 <add_timer_on+0x32>
c103cb82: 0f 0b ud2a
c103cb84: eb fe jmp c103cb84 <add_timer_on+0x30>
spin_lock_irqsave(&base->lock, flags);
c103cb86: 89 f0 mov %esi,%eax
c103cb88: e8 fc ff ff ff call c103cb89 <add_timer_on+0x35>
timer_set_base(timer, base);
debug_activate(timer, timer->expires);
c103cb8d: 8b 53 08 mov 0x8(%ebx),%edx
struct tvec_base *base = per_cpu(tvec_bases, cpu);
unsigned long flags;
timer_stats_timer_set_start_info(timer);
BUG_ON(timer_pending(timer) || !timer->function);
spin_lock_irqsave(&base->lock, flags);
c103cb90: 89 45 f0 mov %eax,-0x10(%ebp)
}
static inline void
timer_set_base(struct timer_list *timer, struct tvec_base *new_base)
{
timer->base = (struct tvec_base *)((unsigned long)(new_base) |
c103cb93: 8b 43 0c mov 0xc(%ebx),%eax
c103cb96: 83 e0 01 and $0x1,%eax
c103cb99: 09 f0 or %esi,%eax
c103cb9b: 89 43 0c mov %eax,0xc(%ebx)
timer_stats_timer_set_start_info(timer);
BUG_ON(timer_pending(timer) || !timer->function);
spin_lock_irqsave(&base->lock, flags);
timer_set_base(timer, base);
debug_activate(timer, timer->expires);
c103cb9e: 89 d8 mov %ebx,%eax
c103cba0: e8 89 f5 ff ff call c103c12e <debug_activate>
if (time_before(timer->expires, base->next_timer) &&
c103cba5: 8b 43 08 mov 0x8(%ebx),%eax
c103cba8: 3b 46 0c cmp 0xc(%esi),%eax
c103cbab: 79 09 jns c103cbb6 <add_timer_on+0x62>
!tbase_get_deferrable(timer->base))
c103cbad: f6 43 0c 01 testb $0x1,0xc(%ebx)
c103cbb1: 75 03 jne c103cbb6 <add_timer_on+0x62>
base->next_timer = timer->expires;
c103cbb3: 89 46 0c mov %eax,0xc(%esi)
internal_add_timer(base, timer);
c103cbb6: 89 da mov %ebx,%edx
c103cbb8: 89 f0 mov %esi,%eax
c103cbba: e8 67 e0 ff ff call c103ac26 <internal_add_timer>
* active. We are protected against the other CPU fiddling
* with the timer by holding the timer base lock. This also
* makes sure that a CPU on the way to idle can not evaluate
* the timer wheel.
*/
wake_up_idle_cpu(cpu);
c103cbbf: 89 f8 mov %edi,%eax
c103cbc1: e8 fc ff ff ff call c103cbc2 <add_timer_on+0x6e>
c103cbc6: 8b 55 f0 mov -0x10(%ebp),%edx
c103cbc9: 89 f0 mov %esi,%eax
c103cbcb: e8 fc ff ff ff call c103cbcc <add_timer_on+0x78>
spin_unlock_irqrestore(&base->lock, flags);
}
c103cbd0: 59 pop %ecx
c103cbd1: 5b pop %ebx
c103cbd2: 5e pop %esi
c103cbd3: 5f pop %edi
c103cbd4: 5d pop %ebp
c103cbd5: c3 ret
Disassembly of section .cpuinit.text:
c103ab38 <timer_cpu_notify>:
tbase_get_deferrable(timer->base));
}
static unsigned long round_jiffies_common(unsigned long j, int cpu,
bool force_up)
{
c103ab38: 55 push %ebp
unsigned long action, void *hcpu)
{
long cpu = (long)hcpu;
int err;
switch(action) {
c103ab39: 83 fa 07 cmp $0x7,%edx
* The skew is done by adding 3*cpunr, then round, then subtract this
* extra offset again.
*/
j += cpu * 3;
rem = j % HZ;
c103ab3c: 89 e5 mov %esp,%ebp
c103ab3e: 57 push %edi
c103ab3f: 56 push %esi
c103ab40: 53 push %ebx
tbase_get_deferrable(timer->base));
}
static unsigned long round_jiffies_common(unsigned long j, int cpu,
bool force_up)
{
c103ab41: 89 cb mov %ecx,%ebx
unsigned long action, void *hcpu)
{
long cpu = (long)hcpu;
int err;
switch(action) {
c103ab43: 0f 84 49 01 00 00 je c103ac92 <timer_cpu_notify+0x15a>
* in the caller. Nothing more. We could take
* MAX_SCHEDULE_TIMEOUT from one of the negative value
* but I' d like to return a valid offset (>=0) to allow
* the caller to do everything it want with the retval.
*/
schedule();
c103ab49: 77 0b ja c103ab56 <timer_cpu_notify+0x1e>
tbase_get_deferrable(timer->base));
}
static unsigned long round_jiffies_common(unsigned long j, int cpu,
bool force_up)
{
c103ab4b: 83 fa 03 cmp $0x3,%edx
* MAX_SCHEDULE_TIMEOUT from one of the negative value
* but I' d like to return a valid offset (>=0) to allow
* the caller to do everything it want with the retval.
*/
schedule();
goto out;
c103ab4e: 0f 85 12 02 00 00 jne c103ad66 <timer_cpu_notify+0x22e>
* The skew is done by adding 3*cpunr, then round, then subtract this
* extra offset again.
*/
j += cpu * 3;
rem = j % HZ;
c103ab54: eb 13 jmp c103ab69 <timer_cpu_notify+0x31>
c103ab56: 83 fa 13 cmp $0x13,%edx
int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE,
(void *)(long)smp_processor_id());
init_timer_stats();
BUG_ON(err != NOTIFY_OK);
c103ab59: 74 0e je c103ab69 <timer_cpu_notify+0x31>
c103ab5b: 83 fa 17 cmp $0x17,%edx
c103ab5e: 0f 85 02 02 00 00 jne c103ad66 <timer_cpu_notify+0x22e>
c103ab64: e9 29 01 00 00 jmp c103ac92 <timer_cpu_notify+0x15a>
{
int j;
struct tvec_base *base;
static char __cpuinitdata tvec_base_done[NR_CPUS];
if (!tvec_base_done[cpu]) {
c103ab69: 80 bb 0c 00 00 00 00 cmpb $0x0,0xc(%ebx)
if (timeout < 0) {
printk(KERN_ERR "schedule_timeout: wrong timeout "
"value %lx\n", timeout);
dump_stack();
current->state = TASK_RUNNING;
goto out;
c103ab70: 0f 85 85 00 00 00 jne c103abfb <timer_cpu_notify+0xc3>
j -= cpu * 3;
if (j <= jiffies) /* rounding ate our timeout entirely; */
return original;
return j;
}
c103ab76: 80 3d 49 10 00 00 00 cmpb $0x0,0x1049
c103ab7d: 74 67 je c103abe6 <timer_cpu_notify+0xae>
int index = kmalloc_index(size);
if (index == 0)
return NULL;
return kmalloc_caches[index];
c103ab7f: a1 34 00 00 00 mov 0x34,%eax
return kmalloc_large(size, flags);
if (!(flags & SLUB_DMA)) {
struct kmem_cache *s = kmalloc_slab(size);
if (!s)
c103ab84: be 10 00 00 00 mov $0x10,%esi
c103ab89: 85 c0 test %eax,%eax
*
* The return value is the rounded version of the @j parameter.
*/
unsigned long __round_jiffies(unsigned long j, int cpu)
{
return round_jiffies_common(j, cpu, false);
c103ab8b: 74 11 je c103ab9e <timer_cpu_notify+0x66>
return ZERO_SIZE_PTR;
return kmem_cache_alloc_trace(s, flags, size);
c103ab8d: b9 40 10 00 00 mov $0x1040,%ecx
unsigned long __round_jiffies_relative(unsigned long j, int cpu)
{
unsigned long j0 = jiffies;
/* Use j0 because jiffies might change while we run */
return round_jiffies_common(j + j0, cpu, false) - j0;
c103ab92: ba d0 80 00 00 mov $0x80d0,%edx
*
* The return value is the rounded version of the @j parameter.
*/
unsigned long __round_jiffies_relative(unsigned long j, int cpu)
{
unsigned long j0 = jiffies;
c103ab97: e8 fc ff ff ff call c103ab98 <timer_cpu_notify+0x60>
}
expire = timeout + jiffies;
setup_timer_on_stack(&timer, process_timeout, (unsigned long)current);
__mod_timer(&timer, expire, false, TIMER_NOT_PINNED);
c103ab9c: 89 c6 mov %eax,%esi
* The APs use this path later in boot
*/
base = kmalloc_node(sizeof(*base),
GFP_KERNEL | __GFP_ZERO,
cpu_to_node(cpu));
if (!base)
c103ab9e: 85 f6 test %esi,%esi
if (boot_done) {
/*
* The APs use this path later in boot
*/
base = kmalloc_node(sizeof(*base),
c103aba0: 89 f2 mov %esi,%edx
GFP_KERNEL | __GFP_ZERO,
cpu_to_node(cpu));
if (!base)
c103aba2: b8 0d 80 00 00 mov $0x800d,%eax
{
unsigned long j0 = jiffies;
/* Use j0 because jiffies might change while we run */
return round_jiffies_common(j + j0, cpu, false) - j0;
}
c103aba7: 0f 84 be 01 00 00 je c103ad6b <timer_cpu_notify+0x233>
cpu_to_node(cpu));
if (!base)
return -ENOMEM;
/* Make sure that tvec_base is 2 byte aligned */
if (tbase_get_deferrable(base)) {
c103abad: f7 c6 01 00 00 00 test $0x1,%esi
del_singleshot_timer_sync(&timer);
/* Remove the timer from the object tracker */
destroy_timer_on_stack(&timer);
timeout = expire - jiffies;
c103abb3: 74 20 je c103abd5 <timer_cpu_notify+0x9d>
if (!base)
return -ENOMEM;
/* Make sure that tvec_base is 2 byte aligned */
if (tbase_get_deferrable(base)) {
WARN_ON(1);
c103abb5: ba 51 06 00 00 mov $0x651,%edx
* The return value is the rounded version of the @j parameter.
*/
unsigned long round_jiffies(unsigned long j)
{
return round_jiffies_common(j, raw_smp_processor_id(), false);
}
c103abba: b8 00 00 00 00 mov $0x0,%eax
*
* The return value is the rounded version of the @j parameter.
*/
unsigned long round_jiffies_relative(unsigned long j)
{
return __round_jiffies_relative(j, raw_smp_processor_id());
c103abbf: e8 fc ff ff ff call c103abc0 <timer_cpu_notify+0x88>
return -ENOMEM;
/* Make sure that tvec_base is 2 byte aligned */
if (tbase_get_deferrable(base)) {
WARN_ON(1);
kfree(base);
c103abc4: 89 f0 mov %esi,%eax
c103abc6: e8 fc ff ff ff call c103abc7 <timer_cpu_notify+0x8f>
* The return value is the rounded version of the @j parameter.
*/
unsigned long round_jiffies_relative(unsigned long j)
{
return __round_jiffies_relative(j, raw_smp_processor_id());
}
c103abcb: b8 0d 80 00 00 mov $0x800d,%eax
* of firing does not matter too much, as long as they don't fire too
* early.
*/
unsigned long __round_jiffies_up(unsigned long j, int cpu)
{
return round_jiffies_common(j, cpu, true);
c103abd0: e9 96 01 00 00 jmp c103ad6b <timer_cpu_notify+0x233>
c103abd5: 8b 0c 9d 00 00 00 00 mov 0x0(,%ebx,4),%ecx
* round down. This is useful for timeouts for which the exact time
* of firing does not matter too much, as long as they don't fire too
* early.
*/
unsigned long __round_jiffies_up_relative(unsigned long j, int cpu)
{
c103abdc: b8 00 00 00 00 mov $0x0,%eax
return schedule_timeout(timeout);
}
EXPORT_SYMBOL(schedule_timeout_interruptible);
signed long __sched schedule_timeout_killable(signed long timeout)
{
c103abe1: 89 34 08 mov %esi,(%eax,%ecx,1)
* round down. This is useful for timeouts for which the exact time
* of firing does not matter too much, as long as they don't fire too
* early.
*/
unsigned long __round_jiffies_up_relative(unsigned long j, int cpu)
{
c103abe4: eb 0c jmp c103abf2 <timer_cpu_notify+0xba>
* This is for the boot CPU - we use compile-time
* static initialisation because per-cpu memory isn't
* ready yet and because the memory allocators are not
* initialised either.
*/
boot_done = 1;
c103abe6: c6 05 49 10 00 00 01 movb $0x1,0x1049
unsigned long __round_jiffies_up_relative(unsigned long j, int cpu)
{
unsigned long j0 = jiffies;
/* Use j0 because jiffies might change while we run */
return round_jiffies_common(j + j0, cpu, true) - j0;
c103abed: ba 00 00 00 00 mov $0x0,%edx
* initialised either.
*/
boot_done = 1;
base = &boot_tvec_bases;
}
tvec_base_done[cpu] = 1;
c103abf2: c6 83 0c 00 00 00 01 movb $0x1,0xc(%ebx)
c103abf9: eb 0f jmp c103ac0a <timer_cpu_notify+0xd2>
} else {
base = per_cpu(tvec_bases, cpu);
c103abfb: 8b 14 9d 00 00 00 00 mov 0x0(,%ebx,4),%edx
* We can use __set_current_state() here because schedule_timeout() calls
* schedule() unconditionally.
*/
signed long __sched schedule_timeout_interruptible(signed long timeout)
{
__set_current_state(TASK_INTERRUPTIBLE);
c103ac02: b8 00 00 00 00 mov $0x0,%eax
return schedule_timeout(timeout);
c103ac07: 8b 14 10 mov (%eax,%edx,1),%edx
tvec_base_done[cpu] = 1;
} else {
base = per_cpu(tvec_bases, cpu);
}
spin_lock_init(&base->lock);
c103ac0a: c7 02 00 00 00 00 movl $0x0,(%edx)
* of firing does not matter too much, as long as they don't fire too
* early.
*/
unsigned long round_jiffies_up_relative(unsigned long j)
{
return __round_jiffies_up_relative(j, raw_smp_processor_id());
c103ac10: 31 c0 xor %eax,%eax
}
spin_lock_init(&base->lock);
for (j = 0; j < TVN_SIZE; j++) {
INIT_LIST_HEAD(base->tv5.vec + j);
c103ac12: 8d 8c c2 10 0e 00 00 lea 0xe10(%edx,%eax,8),%ecx
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
c103ac19: 89 8c c2 10 0e 00 00 mov %ecx,0xe10(%edx,%eax,8)
list->prev = list;
c103ac20: 89 8c c2 14 0e 00 00 mov %ecx,0xe14(%edx,%eax,8)
}
EXPORT_SYMBOL_GPL(set_timer_slack);
static void internal_add_timer(struct tvec_base *base, struct timer_list *timer)
{
unsigned long expires = timer->expires;
c103ac27: 8d 8c c2 10 0c 00 00 lea 0xc10(%edx,%eax,8),%ecx
unsigned long idx = expires - base->timer_jiffies;
c103ac2e: 89 8c c2 10 0c 00 00 mov %ecx,0xc10(%edx,%eax,8)
struct list_head *vec;
if (idx < TVR_SIZE) {
c103ac35: 89 8c c2 14 0c 00 00 mov %ecx,0xc14(%edx,%eax,8)
spin_lock_init(&base->lock);
for (j = 0; j < TVN_SIZE; j++) {
INIT_LIST_HEAD(base->tv5.vec + j);
INIT_LIST_HEAD(base->tv4.vec + j);
INIT_LIST_HEAD(base->tv3.vec + j);
c103ac3c: 8d 8c c2 10 0a 00 00 lea 0xa10(%edx,%eax,8),%ecx
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
c103ac43: 89 8c c2 10 0a 00 00 mov %ecx,0xa10(%edx,%eax,8)
list->prev = list;
c103ac4a: 89 8c c2 14 0a 00 00 mov %ecx,0xa14(%edx,%eax,8)
if (idx < TVR_SIZE) {
int i = expires & TVR_MASK;
vec = base->tv1.vec + i;
} else if (idx < 1 << (TVR_BITS + TVN_BITS)) {
int i = (expires >> TVR_BITS) & TVN_MASK;
vec = base->tv2.vec + i;
c103ac51: 8d 8c c2 10 08 00 00 lea 0x810(%edx,%eax,8),%ecx
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
c103ac58: 89 8c c2 10 08 00 00 mov %ecx,0x810(%edx,%eax,8)
list->prev = list;
c103ac5f: 89 8c c2 14 08 00 00 mov %ecx,0x814(%edx,%eax,8)
base = per_cpu(tvec_bases, cpu);
}
spin_lock_init(&base->lock);
for (j = 0; j < TVN_SIZE; j++) {
c103ac66: 40 inc %eax
c103ac67: 83 f8 40 cmp $0x40,%eax
} else if (idx < 1 << (TVR_BITS + TVN_BITS)) {
int i = (expires >> TVR_BITS) & TVN_MASK;
vec = base->tv2.vec + i;
} else if (idx < 1 << (TVR_BITS + 2 * TVN_BITS)) {
int i = (expires >> (TVR_BITS + TVN_BITS)) & TVN_MASK;
vec = base->tv3.vec + i;
c103ac6a: 75 a6 jne c103ac12 <timer_cpu_notify+0xda>
c103ac6c: 30 c0 xor %al,%al
INIT_LIST_HEAD(base->tv4.vec + j);
INIT_LIST_HEAD(base->tv3.vec + j);
INIT_LIST_HEAD(base->tv2.vec + j);
}
for (j = 0; j < TVR_SIZE; j++)
INIT_LIST_HEAD(base->tv1.vec + j);
c103ac6e: 8d 4c c2 10 lea 0x10(%edx,%eax,8),%ecx
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
c103ac72: 89 4c c2 10 mov %ecx,0x10(%edx,%eax,8)
list->prev = list;
c103ac76: 89 4c c2 14 mov %ecx,0x14(%edx,%eax,8)
INIT_LIST_HEAD(base->tv5.vec + j);
INIT_LIST_HEAD(base->tv4.vec + j);
INIT_LIST_HEAD(base->tv3.vec + j);
INIT_LIST_HEAD(base->tv2.vec + j);
}
for (j = 0; j < TVR_SIZE; j++)
c103ac7a: 40 inc %eax
c103ac7b: 3d 00 01 00 00 cmp $0x100,%eax
} else if (idx < 1 << (TVR_BITS + 2 * TVN_BITS)) {
int i = (expires >> (TVR_BITS + TVN_BITS)) & TVN_MASK;
vec = base->tv3.vec + i;
} else if (idx < 1 << (TVR_BITS + 3 * TVN_BITS)) {
int i = (expires >> (TVR_BITS + 2 * TVN_BITS)) & TVN_MASK;
vec = base->tv4.vec + i;
c103ac80: 75 ec jne c103ac6e <timer_cpu_notify+0x136>
INIT_LIST_HEAD(base->tv2.vec + j);
}
for (j = 0; j < TVR_SIZE; j++)
INIT_LIST_HEAD(base->tv1.vec + j);
base->timer_jiffies = jiffies;
c103ac82: a1 00 00 00 00 mov 0x0,%eax
c103ac87: 89 42 08 mov %eax,0x8(%edx)
base->next_timer = base->timer_jiffies;
c103ac8a: 89 42 0c mov %eax,0xc(%edx)
c103ac8d: e9 d4 00 00 00 jmp c103ad66 <timer_cpu_notify+0x22e>
} else if ((signed long) idx < 0) {
/*
* Can happen if you add a timer with expires == jiffies,
* or you set a timer to go off in the past
*/
vec = base->tv1.vec + (base->timer_jiffies & TVR_MASK);
c103ac92: a1 00 00 00 00 mov 0x0,%eax
c103ac97: 0f a3 18 bt %ebx,(%eax)
c103ac9a: 19 c0 sbb %eax,%eax
{
struct tvec_base *old_base;
struct tvec_base *new_base;
int i;
BUG_ON(cpu_online(cpu));
c103ac9c: 85 c0 test %eax,%eax
if (idx > 0xffffffffUL) {
idx = 0xffffffffUL;
expires = idx + base->timer_jiffies;
}
i = (expires >> (TVR_BITS + 3 * TVN_BITS)) & TVN_MASK;
vec = base->tv5.vec + i;
c103ac9e: 74 04 je c103aca4 <timer_cpu_notify+0x16c>
c103aca0: 0f 0b ud2a
c103aca2: eb fe jmp c103aca2 <timer_cpu_notify+0x16a>
struct tvec_base *old_base;
struct tvec_base *new_base;
int i;
BUG_ON(cpu_online(cpu));
old_base = per_cpu(tvec_bases, cpu);
c103aca4: 8b 04 9d 00 00 00 00 mov 0x0(,%ebx,4),%eax
#ifndef CONFIG_DEBUG_LIST
static inline void __list_add(struct list_head *new,
struct list_head *prev,
struct list_head *next)
{
next->prev = new;
c103acab: be 00 00 00 00 mov $0x0,%esi
new->next = next;
new->prev = prev;
c103acb0: 8b 1c 06 mov (%esi,%eax,1),%ebx
prev->next = new;
c103acb3: b8 01 00 00 00 mov $0x1,%eax
}
/*
* Timers are FIFO:
*/
list_add_tail(&timer->entry, vec);
}
c103acb8: e8 fc ff ff ff call c103acb9 <timer_cpu_notify+0x181>
c103acbd: e8 fc ff ff ff call c103acbe <timer_cpu_notify+0x186>
c103acc2: 8b 04 85 00 00 00 00 mov 0x0(,%eax,4),%eax
c103acc9: 8b 3c 30 mov (%eax,%esi,1),%edi
SYSCALL_DEFINE0(getuid)
{
/* Only we change this so SMP safe */
return current_uid();
}
c103accc: 31 f6 xor %esi,%esi
c103acce: 89 f8 mov %edi,%eax
c103acd0: e8 fc ff ff ff call c103acd1 <timer_cpu_notify+0x199>
/*
* The caller is globally serialized and nobody else
* takes two locks at once, deadlock is not possible.
*/
spin_lock_irq(&new_base->lock);
spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING);
c103acd5: 89 d8 mov %ebx,%eax
c103acd7: e8 fc ff ff ff call c103acd8 <timer_cpu_notify+0x1a0>
SYSCALL_DEFINE0(geteuid)
{
/* Only we change this so SMP safe */
return current_euid();
}
c103acdc: 83 7b 04 00 cmpl $0x0,0x4(%ebx)
c103ace0: 74 04 je c103ace6 <timer_cpu_notify+0x1ae>
c103ace2: 0f 0b ud2a
c103ace4: eb fe jmp c103ace4 <timer_cpu_notify+0x1ac>
spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING);
BUG_ON(old_base->running_timer);
for (i = 0; i < TVR_SIZE; i++)
migrate_timer_list(new_base, old_base->tv1.vec + i);
c103ace6: 8d 54 f3 10 lea 0x10(%ebx,%esi,8),%edx
c103acea: 89 f8 mov %edi,%eax
spin_lock_irq(&new_base->lock);
spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING);
BUG_ON(old_base->running_timer);
for (i = 0; i < TVR_SIZE; i++)
c103acec: 46 inc %esi
migrate_timer_list(new_base, old_base->tv1.vec + i);
c103aced: e8 af 15 00 00 call c103c2a1 <run_timer_softirq+0x89>
spin_lock_irq(&new_base->lock);
spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING);
BUG_ON(old_base->running_timer);
for (i = 0; i < TVR_SIZE; i++)
c103acf2: 81 fe 00 01 00 00 cmp $0x100,%esi
c103acf8: 75 ec jne c103ace6 <timer_cpu_notify+0x1ae>
c103acfa: 66 31 f6 xor %si,%si
migrate_timer_list(new_base, old_base->tv1.vec + i);
for (i = 0; i < TVN_SIZE; i++) {
migrate_timer_list(new_base, old_base->tv2.vec + i);
c103acfd: 8d 94 f3 10 08 00 00 lea 0x810(%ebx,%esi,8),%edx
SYSCALL_DEFINE0(getegid)
{
/* Only we change this so SMP safe */
return current_egid();
}
c103ad04: 89 f8 mov %edi,%eax
c103ad06: e8 af 15 00 00 call c103c2ba <run_timer_softirq+0xa2>
for (i = 0; i < TVR_SIZE; i++)
migrate_timer_list(new_base, old_base->tv1.vec + i);
for (i = 0; i < TVN_SIZE; i++) {
migrate_timer_list(new_base, old_base->tv2.vec + i);
migrate_timer_list(new_base, old_base->tv3.vec + i);
c103ad0b: 8d 94 f3 10 0a 00 00 lea 0xa10(%ebx,%esi,8),%edx
c103ad12: 89 f8 mov %edi,%eax
c103ad14: e8 af 15 00 00 call c103c2c8 <run_timer_softirq+0xb0>
*/
static inline void list_replace(struct list_head *old,
struct list_head *new)
{
new->next = old->next;
new->next->prev = new;
c103ad19: 8d 94 f3 10 0c 00 00 lea 0xc10(%ebx,%esi,8),%edx
* If @old was empty, it will be overwritten.
*/
static inline void list_replace(struct list_head *old,
struct list_head *new)
{
new->next = old->next;
c103ad20: 89 f8 mov %edi,%eax
new->next->prev = new;
c103ad22: e8 af 15 00 00 call c103c2d6 <run_timer_softirq+0xbe>
migrate_timer_list(new_base, old_base->tv4.vec + i);
migrate_timer_list(new_base, old_base->tv5.vec + i);
c103ad27: 8d 94 f3 10 0e 00 00 lea 0xe10(%ebx,%esi,8),%edx
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
c103ad2e: 89 f8 mov %edi,%eax
BUG_ON(old_base->running_timer);
for (i = 0; i < TVR_SIZE; i++)
migrate_timer_list(new_base, old_base->tv1.vec + i);
for (i = 0; i < TVN_SIZE; i++) {
c103ad30: 46 inc %esi
list->prev = list;
c103ad31: e8 af 15 00 00 call c103c2e5 <run_timer_softirq+0xcd>
c103ad36: 83 fe 40 cmp $0x40,%esi
c103ad39: 75 c2 jne c103acfd <timer_cpu_notify+0x1c5>
raw_spin_lock_irqsave_nested(spinlock_check(lock), flags, subclass); \
} while (0)
static inline void spin_unlock(spinlock_t *lock)
{
raw_spin_unlock(&lock->rlock);
c103ad3b: 89 d8 mov %ebx,%eax
c103ad3d: e8 fc ff ff ff call c103ad3e <timer_cpu_notify+0x206>
raw_spin_unlock_bh(&lock->rlock);
}
static inline void spin_unlock_irq(spinlock_t *lock)
{
raw_spin_unlock_irq(&lock->rlock);
c103ad42: 89 f8 mov %edi,%eax
c103ad44: e8 fc ff ff ff call c103ad45 <timer_cpu_notify+0x20d>
migrate_timer_list(new_base, old_base->tv5.vec + i);
}
spin_unlock(&old_base->lock);
spin_unlock_irq(&new_base->lock);
put_cpu_var(tvec_bases);
c103ad49: b8 01 00 00 00 mov $0x1,%eax
* We are removing _all_ timers from the list, so we
* don't have to detach them individually.
*/
list_for_each_entry_safe(timer, tmp, &tv_list, entry) {
BUG_ON(tbase_get_base(timer->base) != base);
internal_add_timer(base, timer);
c103ad4e: e8 fc ff ff ff call c103ad4f <timer_cpu_notify+0x217>
c103ad53: 89 e0 mov %esp,%eax
/*
* We are removing _all_ timers from the list, so we
* don't have to detach them individually.
*/
list_for_each_entry_safe(timer, tmp, &tv_list, entry) {
c103ad55: 25 00 e0 ff ff and $0xffffe000,%eax
c103ad5a: 8b 40 08 mov 0x8(%eax),%eax
BUG_ON(tbase_get_base(timer->base) != base);
internal_add_timer(base, timer);
}
return index;
}
c103ad5d: a8 08 test $0x8,%al
c103ad5f: 74 05 je c103ad66 <timer_cpu_notify+0x22e>
c103ad61: e8 fc ff ff ff call c103ad62 <timer_cpu_notify+0x22a>
c103ad66: b8 01 00 00 00 mov $0x1,%eax
#endif
default:
break;
}
return NOTIFY_OK;
}
c103ad6b: 5b pop %ebx
c103ad6c: 5e pop %esi
c103ad6d: 5f pop %edi
c103ad6e: 5d pop %ebp
/**
* timer_start - called when the timer is started
* @timer: pointer to struct timer_list
* @expires: the timers expiry time
*/
TRACE_EVENT(timer_start,
c103ad6f: c3 ret
Disassembly of section .init.text:
c103ab38 <init_timers>:
tbase_get_deferrable(timer->base));
}
static unsigned long round_jiffies_common(unsigned long j, int cpu,
bool force_up)
{
c103ab38: 55 push %ebp
unsigned long action, void *hcpu)
{
long cpu = (long)hcpu;
int err;
switch(action) {
c103ab39: 89 e5 mov %esp,%ebp
* It's not worth to care about 3dnow prefetches for the K6
* because they are microcoded there and very slow.
*/
static inline void prefetch(const void *x)
{
alternative_input(BASE_PREFETCH,
c103ab3b: 53 push %ebx
* The skew is done by adding 3*cpunr, then round, then subtract this
* extra offset again.
*/
j += cpu * 3;
rem = j % HZ;
c103ab3c: e8 fc ff ff ff call c103ab3d <init_timers+0x5>
tbase_get_deferrable(timer->base));
}
static unsigned long round_jiffies_common(unsigned long j, int cpu,
bool force_up)
{
c103ab41: ba 03 00 00 00 mov $0x3,%edx
unsigned long action, void *hcpu)
{
long cpu = (long)hcpu;
int err;
switch(action) {
c103ab46: 89 c1 mov %eax,%ecx
c103ab48: b8 00 00 00 00 mov $0x0,%eax
* 3 jiffies. This 3 jiffies came originally from the mm/ code which
* already did this.
* The skew is done by adding 3*cpunr, then round, then subtract this
* extra offset again.
*/
j += cpu * 3;
c103ab4d: e8 fc ff ff ff call c103ab4e <init_timers+0x16>
c103ab52: 89 c3 mov %eax,%ebx
rem = j % HZ;
c103ab54: e8 fc ff ff ff call c103ab55 <init_timers+0x1d>
int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE,
(void *)(long)smp_processor_id());
init_timer_stats();
BUG_ON(err != NOTIFY_OK);
c103ab59: 4b dec %ebx
c103ab5a: 74 04 je c103ab60 <init_timers+0x28>
c103ab5c: 0f 0b ud2a
c103ab5e: eb fe jmp c103ab5e <init_timers+0x26>
register_cpu_notifier(&timers_nb);
c103ab60: b8 00 00 00 00 mov $0x0,%eax
c103ab65: e8 fc ff ff ff call c103ab66 <init_timers+0x2e>
open_softirq(TIMER_SOFTIRQ, run_timer_softirq);
c103ab6a: ba e0 16 00 00 mov $0x16e0,%edx
j = j - rem + HZ;
/* now that we have rounded, subtract the extra skew again */
j -= cpu * 3;
if (j <= jiffies) /* rounding ate our timeout entirely; */
c103ab6f: b8 01 00 00 00 mov $0x1,%eax
* But never round down if @force_up is set.
*/
if (rem < HZ/4 && !force_up) /* round down */
j = j - rem;
else /* round up */
j = j - rem + HZ;
c103ab74: e8 fc ff ff ff call c103ab75 <init_timers+0x3d>
/* now that we have rounded, subtract the extra skew again */
j -= cpu * 3;
if (j <= jiffies) /* rounding ate our timeout entirely; */
c103ab79: 5b pop %ebx
c103ab7a: 5d pop %ebp
c103ab7b: c3 ret
Disassembly of section .altinstr_replacement:
c103ab38 <.altinstr_replacement>:
tbase_get_deferrable(timer->base));
}
static unsigned long round_jiffies_common(unsigned long j, int cpu,
bool force_up)
{
c103ab38: 0f 18 07 prefetchnta (%edi)
c103ab3b: 0f 18 06 prefetchnta (%esi)
Disassembly of section .sched.text:
c103ab38 <schedule_timeout>:
c103ab38: 55 push %ebp
unsigned long action, void *hcpu)
{
long cpu = (long)hcpu;
int err;
switch(action) {
c103ab39: 89 e5 mov %esp,%ebp
c103ab3b: 56 push %esi
* The skew is done by adding 3*cpunr, then round, then subtract this
* extra offset again.
*/
j += cpu * 3;
rem = j % HZ;
c103ab3c: 89 c6 mov %eax,%esi
c103ab3e: 53 push %ebx
c103ab3f: 83 ec 34 sub $0x34,%esp
signed long __sched schedule_timeout(signed long timeout)
{
struct timer_list timer;
unsigned long expire;
switch (timeout)
c103ab42: 3d ff ff ff 7f cmp $0x7fffffff,%eax
unsigned long action, void *hcpu)
{
long cpu = (long)hcpu;
int err;
switch(action) {
c103ab47: 75 07 jne c103ab50 <schedule_timeout+0x18>
* in the caller. Nothing more. We could take
* MAX_SCHEDULE_TIMEOUT from one of the negative value
* but I' d like to return a valid offset (>=0) to allow
* the caller to do everything it want with the retval.
*/
schedule();
c103ab49: e8 fc ff ff ff call c103ab4a <schedule_timeout+0x12>
goto out;
c103ab4e: eb 6a jmp c103abba <schedule_timeout+0x82>
* The skew is done by adding 3*cpunr, then round, then subtract this
* extra offset again.
*/
j += cpu * 3;
rem = j % HZ;
c103ab50: 85 c0 test %eax,%eax
* 3 jiffies. This 3 jiffies came originally from the mm/ code which
* already did this.
* The skew is done by adding 3*cpunr, then round, then subtract this
* extra offset again.
*/
j += cpu * 3;
c103ab52: 79 20 jns c103ab74 <schedule_timeout+0x3c>
rem = j % HZ;
c103ab54: 50 push %eax
c103ab55: 68 91 02 00 00 push $0x291
int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE,
(void *)(long)smp_processor_id());
init_timer_stats();
BUG_ON(err != NOTIFY_OK);
c103ab5a: e8 fc ff ff ff call c103ab5b <schedule_timeout+0x23>
* that will tell you if something is gone wrong and where.
*/
if (timeout < 0) {
printk(KERN_ERR "schedule_timeout: wrong timeout "
"value %lx\n", timeout);
dump_stack();
c103ab5f: e8 fc ff ff ff call c103ab60 <schedule_timeout+0x28>
c103ab64: 64 a1 00 00 00 00 mov %fs:0x0,%eax
init_timer_stats();
BUG_ON(err != NOTIFY_OK);
register_cpu_notifier(&timers_nb);
open_softirq(TIMER_SOFTIRQ, run_timer_softirq);
c103ab6a: c7 00 00 00 00 00 movl $0x0,(%eax)
if (timeout < 0) {
printk(KERN_ERR "schedule_timeout: wrong timeout "
"value %lx\n", timeout);
dump_stack();
current->state = TASK_RUNNING;
goto out;
c103ab70: 5a pop %edx
c103ab71: 59 pop %ecx
c103ab72: eb 46 jmp c103abba <schedule_timeout+0x82>
* But never round down if @force_up is set.
*/
if (rem < HZ/4 && !force_up) /* round down */
j = j - rem;
else /* round up */
j = j - rem + HZ;
c103ab74: a1 00 00 00 00 mov 0x0,%eax
/* now that we have rounded, subtract the extra skew again */
j -= cpu * 3;
if (j <= jiffies) /* rounding ate our timeout entirely; */
c103ab79: 8d 5d c4 lea -0x3c(%ebp),%ebx
c103ab7c: 31 c9 xor %ecx,%ecx
c103ab7e: 31 d2 xor %edx,%edx
return original;
return j;
}
c103ab80: c7 45 d4 2c 1b 00 00 movl $0x1b2c,-0x2c(%ebp)
current->state = TASK_RUNNING;
goto out;
}
}
expire = timeout + jiffies;
c103ab87: 01 c6 add %eax,%esi
c103ab89: 64 a1 00 00 00 00 mov %fs:0x0,%eax
* The return value is the rounded version of the @j parameter.
*/
unsigned long __round_jiffies(unsigned long j, int cpu)
{
return round_jiffies_common(j, cpu, false);
}
c103ab8f: 89 45 d8 mov %eax,-0x28(%ebp)
unsigned long __round_jiffies_relative(unsigned long j, int cpu)
{
unsigned long j0 = jiffies;
/* Use j0 because jiffies might change while we run */
return round_jiffies_common(j + j0, cpu, false) - j0;
c103ab92: 89 d8 mov %ebx,%eax
* to lock contention or spurious cache line bouncing.
*
* The return value is the rounded version of the @j parameter.
*/
unsigned long __round_jiffies_relative(unsigned long j, int cpu)
{
c103ab94: e8 fc ff ff ff call c103ab95 <schedule_timeout+0x5d>
}
expire = timeout + jiffies;
setup_timer_on_stack(&timer, process_timeout, (unsigned long)current);
__mod_timer(&timer, expire, false, TIMER_NOT_PINNED);
c103ab99: 89 f2 mov %esi,%edx
c103ab9b: 31 c9 xor %ecx,%ecx
unsigned long __round_jiffies_relative(unsigned long j, int cpu)
{
unsigned long j0 = jiffies;
/* Use j0 because jiffies might change while we run */
return round_jiffies_common(j + j0, cpu, false) - j0;
c103ab9d: 89 d8 mov %ebx,%eax
* The APs use this path later in boot
*/
base = kmalloc_node(sizeof(*base),
GFP_KERNEL | __GFP_ZERO,
cpu_to_node(cpu));
if (!base)
c103ab9f: 6a 00 push $0x0
if (boot_done) {
/*
* The APs use this path later in boot
*/
base = kmalloc_node(sizeof(*base),
c103aba1: e8 17 1e 00 00 call c103c9bd <__mod_timer+0x6a>
{
unsigned long j0 = jiffies;
/* Use j0 because jiffies might change while we run */
return round_jiffies_common(j + j0, cpu, false) - j0;
}
c103aba6: e8 fc ff ff ff call c103aba7 <schedule_timeout+0x6f>
expire = timeout + jiffies;
setup_timer_on_stack(&timer, process_timeout, (unsigned long)current);
__mod_timer(&timer, expire, false, TIMER_NOT_PINNED);
schedule();
del_singleshot_timer_sync(&timer);
c103abab: 89 d8 mov %ebx,%eax
cpu_to_node(cpu));
if (!base)
return -ENOMEM;
/* Make sure that tvec_base is 2 byte aligned */
if (tbase_get_deferrable(base)) {
c103abad: e8 fc ff ff ff call c103abae <schedule_timeout+0x76>
del_singleshot_timer_sync(&timer);
/* Remove the timer from the object tracker */
destroy_timer_on_stack(&timer);
timeout = expire - jiffies;
c103abb2: a1 00 00 00 00 mov 0x0,%eax
if (!base)
return -ENOMEM;
/* Make sure that tvec_base is 2 byte aligned */
if (tbase_get_deferrable(base)) {
WARN_ON(1);
c103abb7: 29 c6 sub %eax,%esi
c103abb9: 58 pop %eax
* The return value is the rounded version of the @j parameter.
*/
unsigned long round_jiffies(unsigned long j)
{
return round_jiffies_common(j, raw_smp_processor_id(), false);
}
c103abba: 31 c0 xor %eax,%eax
* of this is to have the CPU wake up less, which saves power.
*
* The return value is the rounded version of the @j parameter.
*/
unsigned long round_jiffies_relative(unsigned long j)
{
c103abbc: 85 f6 test %esi,%esi
c103abbe: 0f 49 c6 cmovns %esi,%eax
timeout = expire - jiffies;
out:
return timeout < 0 ? 0 : timeout;
}
c103abc1: 8d 65 f8 lea -0x8(%ebp),%esp
return -ENOMEM;
/* Make sure that tvec_base is 2 byte aligned */
if (tbase_get_deferrable(base)) {
WARN_ON(1);
kfree(base);
c103abc4: 5b pop %ebx
c103abc5: 5e pop %esi
c103abc6: 5d pop %ebp
c103abc7: c3 ret
c103abc8 <schedule_timeout_uninterruptible>:
return schedule_timeout(timeout);
}
EXPORT_SYMBOL(schedule_timeout_killable);
signed long __sched schedule_timeout_uninterruptible(signed long timeout)
{
c103abc8: 55 push %ebp
c103abc9: 89 e5 mov %esp,%ebp
* The return value is the rounded version of the @j parameter.
*/
unsigned long round_jiffies_relative(unsigned long j)
{
return __round_jiffies_relative(j, raw_smp_processor_id());
}
c103abcb: 64 8b 15 00 00 00 00 mov %fs:0x0,%edx
}
EXPORT_SYMBOL(schedule_timeout_killable);
signed long __sched schedule_timeout_uninterruptible(signed long timeout)
{
__set_current_state(TASK_UNINTERRUPTIBLE);
c103abd2: c7 02 02 00 00 00 movl $0x2,(%edx)
return schedule_timeout(timeout);
c103abd8: e8 fc ff ff ff call c103abd9 <schedule_timeout_uninterruptible+0x11>
unsigned long __round_jiffies_up_relative(unsigned long j, int cpu)
{
unsigned long j0 = jiffies;
/* Use j0 because jiffies might change while we run */
return round_jiffies_common(j + j0, cpu, true) - j0;
c103abdd: 5d pop %ebp
c103abde: c3 ret
c103abdf <schedule_timeout_killable>:
return schedule_timeout(timeout);
}
EXPORT_SYMBOL(schedule_timeout_interruptible);
signed long __sched schedule_timeout_killable(signed long timeout)
{
c103abdf: 55 push %ebp
c103abe0: 89 e5 mov %esp,%ebp
* round down. This is useful for timeouts for which the exact time
* of firing does not matter too much, as long as they don't fire too
* early.
*/
unsigned long __round_jiffies_up_relative(unsigned long j, int cpu)
{
c103abe2: 64 8b 15 00 00 00 00 mov %fs:0x0,%edx
}
EXPORT_SYMBOL(schedule_timeout_interruptible);
signed long __sched schedule_timeout_killable(signed long timeout)
{
__set_current_state(TASK_KILLABLE);
c103abe9: c7 02 82 00 00 00 movl $0x82,(%edx)
return schedule_timeout(timeout);
c103abef: e8 fc ff ff ff call c103abf0 <schedule_timeout_killable+0x11>
{
unsigned long j0 = jiffies;
/* Use j0 because jiffies might change while we run */
return round_jiffies_common(j + j0, cpu, true) - j0;
}
c103abf4: 5d pop %ebp
c103abf5: c3 ret
c103abf6 <schedule_timeout_interruptible>:
/*
* We can use __set_current_state() here because schedule_timeout() calls
* schedule() unconditionally.
*/
signed long __sched schedule_timeout_interruptible(signed long timeout)
{
c103abf6: 55 push %ebp
* round down. This is useful for timeouts for which the exact time
* of firing does not matter too much, as long as they don't fire too
* early.
*/
unsigned long round_jiffies_up(unsigned long j)
{
c103abf7: 89 e5 mov %esp,%ebp
c103abf9: 64 8b 15 00 00 00 00 mov %fs:0x0,%edx
* We can use __set_current_state() here because schedule_timeout() calls
* schedule() unconditionally.
*/
signed long __sched schedule_timeout_interruptible(signed long timeout)
{
__set_current_state(TASK_INTERRUPTIBLE);
c103ac00: c7 02 01 00 00 00 movl $0x1,(%edx)
return schedule_timeout(timeout);
c103ac06: e8 fc ff ff ff call c103ac07 <schedule_timeout_interruptible+0x11>
* early.
*/
unsigned long round_jiffies_up(unsigned long j)
{
return round_jiffies_common(j, raw_smp_processor_id(), true);
}
c103ac0b: 5d pop %ebp
c103ac0c: c3 ret
記錄分析oops所在static函數__next_timer_interrupt的彙編如下:
77e: movzbl %al, %ecx
781: mov %ecx, %esi
783: lea 0x10(%ebx, %esi, 8), %edi
787: mov 0x10(%ebx, %esi, 8), %edx
78b: %edi, -0x24(%ebp)
78e: jmp 0x7b0
= =b> %esi指timer_jiffies & 0xff; 0x10指tvec_base到tv1的偏移量;
lea後%edi為tv1.vec[%esi]的地址, struct *list_head類型;
mov後%edx為該地址所存儲數字的值, 對應list_head->next,下一鏈表的首地址;
790: testb $0x1, 0xc(%edx)
794: je 0x79a
= =b> %edx指nte,如果(nte->base & 1) == 0,跳到0x79a,表示got not deferrable
796: mov %edi, %edx
798: jmp 0x7b0
= =b> %edi為prefetch了的鏈表頭,為struct *list_head類型,下一遍歷經過的鏈表頭
79a: cmp %ecx, %esi
79c: mov 0x8(%edx), %edx
79f: jl 0x7a9
= =b> %ecx指index,%esi指slot,如果slot比index小則跳到0x7a9; 0x8(%edx)指nte->expires
7a1: test %ecx, %ecx
7a3: jne 0x88d
= =b> %ecx指index,如果(index & index) != 0即index != 0,則跳到0x88d
7a9: mov $0x1, %edi
7ae: jmp 0x7ce
= =b> 這裡是猜的,這裡%edi變成了found = 1?將要跳到cascade
7b0: mov (%edx), %edi
7b2: lea 0x0(%esi, %eiz, 1), %esi
7b6: cmp -0x24(%ebp), %edx
7b9: jne 0x790
= =b> 想了解lea eiz的朋友,讀這篇文章吧 http://www.technovelty.org/arch/the-quickest-way-to-do-nothing.html
-0x24(%ebp)為0x78b所存儲的首鏈表地址,如果鏈表沒遍歷完則跳到0x790
7bb: inc %esi
7bc: and $0xff, %esi
7c2: cmp %ecx %esi
7c4: jne 0x783
= =b> %esi指slot, %ecx指index,index與(slot+1) & 0xff比較,如果不同則跳到0x783
7ce: test %ecx, %ecx
7d0: je 0x7d9
= =b> 如果index為0,跳到0x7d9
7d2: add $0x100, %eax
7d7: sub %ecx, %eax
7d9: shr 0x08, %eax
7dc: mov %eax, -0x24(%ebp)
= =b> %ecx指index,%eax指timer_jiffies,timer_jiffies += 0x100 - index,然後將其右移8位
7df: lea 0x810(%ebx), %eax
7e5: mov %eax, -0x1c(%ebp)
7e8: lea 0xa10(%ebx), %eax
7ee: mov %eax, -0x18(%ebp)
7f1: lea 0xc10(%ebx), %eax
7f7: mov %eax, -0x14(%ebp)
7fa: lea 0xe10(%ebx), %eax
800: mov %eax, -0x10(%ebp)
= =b> -0x1c(%ebp)為varray[0],-0x18(%ebp)為varray[1],-0x14(%ebp)為varray[2],
-0x10(%ebp)為varray[3]
803: movl $0x0, -0x28(%ebp)
80a: mov %ebx, -0x34(%ebp)
80d: mov -0x28(%ebp), %eax
810: mov -0x24(%ebp), %ecx
813: mov -0x1c(%ebp, %eax, 4), %eax
817: and $0x3f, %ecx
81a: mov %eax, -0x30(%ebp)
= =b> %eax是varray[x]的值, %ecx是timer_jiffies即index; -0x34(%ebp)保存base,
-0x30(%ebp)保存varray[x],-0x28(%ebp)保存varray的下標,-0x24(%ebp)保存timer_jiffies
81d: mov %ecx, %eax
81f: mov -0x30(%ebp), %esi
822: mov (%esi, %eax, 8), %ebx
825: lea (%esi, %eax, 8), %esi
828: %esi, -0x38(%ebp)
82b: jmp 0x847
= =b> varray[x]保存struct tvec *類型,tvec裡第timer_jiffies個list_head的地址保存在%esi,
list_head->next的值保存在%ebx,-0x38(%ebp)保存list_head這個鏈表頭以進行遍歷
82d: testb $0x1, 0xc(%ebx)
831: mov %edx, %esi
833: jne 0x842
= =b> %ebx指nte,0xc(%ebx)指nte->base; 如果(nte->base & 1) == 1,跳到0x842,表示got deferrable;
%edx為expires
835: mov 0x8(%ebx), %esi
838: mov $0x1, %edi
83d: cmp %edx, %esi
83f: cmovns %edx, %esi
= =b> %ebx是list_head的地址,嵌套於sturct timer_list *類型中,所以%0x8(%ebx)指timer_list.expires;
%edx指expires, %edi是found, %esi是nte->expires; 如果nte->expires大於或等於expires,%esi代替為expires
842: mov -0x2c(%ebp), %ebx
845: mov %esi, %edx
= =b> 參考0x847的註釋,%ebx賦值為下一鏈表頭地址; %esi在這裡是expires
847: mov (%ebx), %esi
849: mov %esi, -0x2c(%ebp)
84c: lea 0x0(%esi, %eiz, 1)
850: cmp -0x38(%ebp), %ebx
853: jne 0x82d
= =b> 這裡的代碼跟0x7b0非常像; %ebx是下一鏈表頭的地址,%esi為下下一鏈表頭的地址,
-0x2c(%ebp)保存下下一鏈表頭地址; 比較是否遍歷到最早那個鏈表頭,否則跳到0x82d
855: test %edi, %edi
857: je 0x868
= =b> %edi指found,如果沒有找到則跳到0x868
859: cmp %ecx, %eax
85b: jl 0x861
= =b> %ecx指index,%eax指slot,如果slot比index小,跳到0x861
85d: test %ecx, %ecx
85f: jne 0x88a
= =b> 如果index不為0,跳到0x88a
861: mov $0x1, %edi
866: jmp 0x870
= =b> 這裡%edi指found?猜的
868: inc %eax
869: and $0x3f, %eax
86c: cmp %ecx, %eax
86e: jne 0x81f
= =b> %eax指slot,%ecx指index,如果不相等則跳到0x81f
870: test %ecx, %ecx
872: je 0x87b
= =b> 如果index等於0跳到0x87b
874: addl $0x40, -0x24(%ebp)
878: sub %ecx, -0x24(%ebp)
= =b> -0x24(%ebp)保存timer_jiffies,%ecx為index
87b: incl -0x28(%ebp)
87e: cmpl $0x4, -0x28(%ebp)
882: je 0x88a
= =b> -0x28(%ebp)為varray[x]的下標,如果下標達到4跳到0x88a
884: shrl $0x6, -0x24(%ebp)
888: jmp 0x80d
= =b> -0x24(%ebp)保存timer_jiffies
88a: mov -0x34(%ebp), %ebx
88d: mov %edx, 0xc(%ebx)
890: mov 0xc(%ebx), %esi
893: mov %ebx, %eax
895: call 0xc14ce8e2 <_raw_spin_unlock>
= =b> 0xc(%ebx)指base->next_timer,-0x34(%ebp)保存了base,%edx指expires
機器碼8b 33所在的地址為0xc103c847