mirror of
https://github.com/adulau/aha.git
synced 2024-12-31 21:26:18 +00:00
lockdep: i386: connect the sysexit hook
Run the lockdep_sys_exit hook after all other C code on the syscall return path. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
b351d164e8
commit
c7e872e7da
2 changed files with 17 additions and 0 deletions
|
@ -251,6 +251,7 @@ check_userspace:
|
||||||
jb resume_kernel # not returning to v8086 or userspace
|
jb resume_kernel # not returning to v8086 or userspace
|
||||||
|
|
||||||
ENTRY(resume_userspace)
|
ENTRY(resume_userspace)
|
||||||
|
LOCKDEP_SYS_EXIT
|
||||||
DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
|
DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
|
||||||
# setting need_resched or sigpending
|
# setting need_resched or sigpending
|
||||||
# between sampling and the iret
|
# between sampling and the iret
|
||||||
|
@ -338,6 +339,7 @@ sysenter_past_esp:
|
||||||
jae syscall_badsys
|
jae syscall_badsys
|
||||||
call *sys_call_table(,%eax,4)
|
call *sys_call_table(,%eax,4)
|
||||||
movl %eax,PT_EAX(%esp)
|
movl %eax,PT_EAX(%esp)
|
||||||
|
LOCKDEP_SYS_EXIT
|
||||||
DISABLE_INTERRUPTS(CLBR_ANY)
|
DISABLE_INTERRUPTS(CLBR_ANY)
|
||||||
TRACE_IRQS_OFF
|
TRACE_IRQS_OFF
|
||||||
movl TI_flags(%ebp), %ecx
|
movl TI_flags(%ebp), %ecx
|
||||||
|
@ -377,6 +379,7 @@ syscall_call:
|
||||||
call *sys_call_table(,%eax,4)
|
call *sys_call_table(,%eax,4)
|
||||||
movl %eax,PT_EAX(%esp) # store the return value
|
movl %eax,PT_EAX(%esp) # store the return value
|
||||||
syscall_exit:
|
syscall_exit:
|
||||||
|
LOCKDEP_SYS_EXIT
|
||||||
DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
|
DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
|
||||||
# setting need_resched or sigpending
|
# setting need_resched or sigpending
|
||||||
# between sampling and the iret
|
# between sampling and the iret
|
||||||
|
@ -467,6 +470,7 @@ work_pending:
|
||||||
jz work_notifysig
|
jz work_notifysig
|
||||||
work_resched:
|
work_resched:
|
||||||
call schedule
|
call schedule
|
||||||
|
LOCKDEP_SYS_EXIT
|
||||||
DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
|
DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
|
||||||
# setting need_resched or sigpending
|
# setting need_resched or sigpending
|
||||||
# between sampling and the iret
|
# between sampling and the iret
|
||||||
|
|
|
@ -160,4 +160,17 @@ static inline int raw_irqs_disabled(void)
|
||||||
# define TRACE_IRQS_OFF
|
# define TRACE_IRQS_OFF
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
||||||
|
# define LOCKDEP_SYS_EXIT \
|
||||||
|
pushl %eax; \
|
||||||
|
pushl %ecx; \
|
||||||
|
pushl %edx; \
|
||||||
|
call lockdep_sys_exit; \
|
||||||
|
popl %edx; \
|
||||||
|
popl %ecx; \
|
||||||
|
popl %eax;
|
||||||
|
#else
|
||||||
|
# define LOCKDEP_SYS_EXIT
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue