mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 17:54:13 +08:00
5634bd7d2a
kernel/locking/lockdep.c deals with validating locking scenarios for various architectures supported by the kernel. There isn't anything kernel specific going on in lockdep, and when we compare userspace to other architectures that don't have to deal with irqs such as s390, they become all too similar. We wrap kernel/locking/lockdep.c and include/linux/lockdep.h with several headers which allow us to build and use lockdep from userspace. We don't touch the kernel code itself which means that any work done on lockdep in the kernel will automatically benefit userspace lockdep as well! Signed-off-by: Sasha Levin <sasha.levin@oracle.com> Signed-off-by: Peter Zijlstra <peterz@infradead.org> Cc: torvalds@linux-foundation.org Link: http://lkml.kernel.org/r/1371163284-6346-3-git-send-email-sasha.levin@oracle.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
34 lines
672 B
C
34 lines
672 B
C
#include <stddef.h>
|
|
#include <stdbool.h>
|
|
#include <linux/compiler.h>
|
|
#include <linux/lockdep.h>
|
|
#include <unistd.h>
|
|
#include <sys/syscall.h>
|
|
|
|
static __thread struct task_struct current_obj;
|
|
|
|
/* lockdep wants these */
|
|
bool debug_locks = true;
|
|
bool debug_locks_silent;
|
|
|
|
__attribute__((constructor)) static void liblockdep_init(void)
|
|
{
|
|
lockdep_init();
|
|
}
|
|
|
|
__attribute__((destructor)) static void liblockdep_exit(void)
|
|
{
|
|
debug_check_no_locks_held(¤t_obj);
|
|
}
|
|
|
|
struct task_struct *__curr(void)
|
|
{
|
|
if (current_obj.pid == 0) {
|
|
/* Makes lockdep output pretty */
|
|
prctl(PR_GET_NAME, current_obj.comm);
|
|
current_obj.pid = syscall(__NR_gettid);
|
|
}
|
|
|
|
return ¤t_obj;
|
|
}
|