From e7c521a53a7084cb476ecbc9e8123fbcd7f05a35 Mon Sep 17 00:00:00 2001 From: Pierre-Hugues Husson Date: Thu, 25 Feb 2016 20:10:07 +0100 Subject: [PATCH] lkl: Warn if lkl_create_syscall_thread seems unproperly used --- arch/lkl/include/uapi/asm/host_ops.h | 2 ++ arch/lkl/kernel/syscalls.c | 24 +++++++++++++++++++++--- tools/lkl/lib/posix-host.c | 12 ++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/arch/lkl/include/uapi/asm/host_ops.h b/arch/lkl/include/uapi/asm/host_ops.h index 2697af38527356..5f5b0c3e7018a2 100644 --- a/arch/lkl/include/uapi/asm/host_ops.h +++ b/arch/lkl/include/uapi/asm/host_ops.h @@ -23,6 +23,7 @@ struct lkl_sem_t; * @sem_free - free a host semaphore * @sem_up - perform an up operation on the semaphore * @sem_down - perform a down operation on the semaphore + * @sem_get - return the current value of semahpore. To be used only for sanity checking * * @mutex_alloc - allocate and initialize a host mutex * @mutex_free - free a host mutex @@ -66,6 +67,7 @@ struct lkl_host_operations { void (*sem_free)(struct lkl_sem_t *sem); void (*sem_up)(struct lkl_sem_t *sem); void (*sem_down)(struct lkl_sem_t *sem); + int (*sem_get)(struct lkl_sem_t *sem); struct lkl_mutex_t *(*mutex_alloc)(void); void (*mutex_free)(struct lkl_mutex_t *mutex); diff --git a/arch/lkl/kernel/syscalls.c b/arch/lkl/kernel/syscalls.c index 7cc5a4358d99cf..ec714375b58a6f 100644 --- a/arch/lkl/kernel/syscalls.c +++ b/arch/lkl/kernel/syscalls.c @@ -147,16 +147,31 @@ static int syscall_thread_data_init(struct syscall_thread_data *data, return 0; } -long lkl_syscall(long no, long *params) -{ +static struct syscall_thread_data *lkl_syscall_data(void) { struct syscall_thread_data *data = NULL; - struct syscall s; if (lkl_ops->tls_get) data = lkl_ops->tls_get(syscall_thread_data_key); if (!data) data = &default_syscall_thread_data; + return data; +} + +static int lkl_syscall_wouldblock(void) { + struct syscall_thread_data *data = lkl_syscall_data(); + + if(!lkl_ops->sem_get) + return 0; + + return !lkl_ops->sem_get(data->mutex); +} + +long lkl_syscall(long no, long *params) +{ + struct syscall_thread_data *data = lkl_syscall_data(); + struct syscall s; + s.no = no; s.params = params; @@ -196,6 +211,9 @@ int lkl_create_syscall_thread(void) return ret; } + if(lkl_syscall_wouldblock()) + pr_warn("lkl: Calling lkl_create_syscall_thread will block\n"); + params[0] = (long)data; ret = lkl_syscall(__NR_create_syscall_thread, params); if (ret < 0) { diff --git a/tools/lkl/lib/posix-host.c b/tools/lkl/lib/posix-host.c index 32b4bcbd047435..4bd7fbbccceca9 100644 --- a/tools/lkl/lib/posix-host.c +++ b/tools/lkl/lib/posix-host.c @@ -123,6 +123,17 @@ static void sem_down(struct lkl_sem_t *sem) #endif /* _POSIX_SEMAPHORES */ } +static int sem_get(struct lkl_sem_t *sem) { + int v = 0; +#ifdef _POSIX_SEMAPHORES + WARN_UNLESS(sem_getvalue(&sem->sem, &v)); +#else + WARN_PTHREAD(pthread_mutex_lock(&sem->lock)); + v = sem->count; + WARN_PTHREAD(pthread_mutex_unlock(&sem->lock)); +#endif /* _POSIX_SEMAPHORES */ + return v; +} static struct lkl_mutex_t *mutex_alloc(void) { @@ -268,6 +279,7 @@ struct lkl_host_operations lkl_host_ops = { .sem_free = sem_free, .sem_up = sem_up, .sem_down = sem_down, + .sem_get = sem_get, .mutex_alloc = mutex_alloc, .mutex_free = mutex_free, .mutex_lock = mutex_lock,