From f09df8d82dee8a180bb81cbb03e2cc349e0cb462 Mon Sep 17 00:00:00 2001 From: daniel-k Date: Mon, 29 Aug 2016 16:07:37 +0200 Subject: [PATCH] kernel/syscall: make lwip lock irq-safe --- hermit/kernel/syscall.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/hermit/kernel/syscall.c b/hermit/kernel/syscall.c index 2d331f6f8..40de2e786 100644 --- a/hermit/kernel/syscall.c +++ b/hermit/kernel/syscall.c @@ -44,7 +44,7 @@ #include //TODO: don't use one big kernel lock to comminicate with all proxies -static spinlock_t lwip_lock = SPINLOCK_INIT; +static spinlock_irqsave_t lwip_lock = SPINLOCK_IRQSAVE_INIT; extern spinlock_irqsave_t stdio_lock; extern int32_t isle; @@ -85,7 +85,7 @@ void NORETURN sys_exit(int arg) { sys_exit_t sysargs = {__NR_exit, arg}; - spinlock_lock(&lwip_lock); + spinlock_irqsave_lock(&lwip_lock); if (libc_sd >= 0) { int s = libc_sd; @@ -93,7 +93,7 @@ void NORETURN sys_exit(int arg) lwip_write(s, &sysargs, sizeof(sysargs)); libc_sd = -1; - spinlock_unlock(&lwip_lock); + spinlock_irqsave_unlock(&lwip_lock); // switch to LwIP thread reschedule(); @@ -102,7 +102,7 @@ void NORETURN sys_exit(int arg) idle_poll = 0; } else { idle_poll = 0; - spinlock_unlock(&lwip_lock); + spinlock_irqsave_unlock(&lwip_lock); } do_exit(arg); @@ -129,9 +129,9 @@ ssize_t sys_read(int fd, char* buf, size_t len) return ret; } - spinlock_lock(&lwip_lock); + spinlock_irqsave_lock(&lwip_lock); if (libc_sd < 0) { - spinlock_unlock(&lwip_lock); + spinlock_irqsave_unlock(&lwip_lock); return -ENOSYS; } @@ -147,7 +147,7 @@ ssize_t sys_read(int fd, char* buf, size_t len) { ret = lwip_read(s, buf+i, j-i); if (ret < 0) { - spinlock_unlock(&lwip_lock); + spinlock_irqsave_unlock(&lwip_lock); return ret; } @@ -155,7 +155,7 @@ ssize_t sys_read(int fd, char* buf, size_t len) } } - spinlock_unlock(&lwip_lock); + spinlock_irqsave_unlock(&lwip_lock); return j; } @@ -189,10 +189,10 @@ ssize_t sys_write(int fd, const char* buf, size_t len) return ret; } - spinlock_lock(&lwip_lock); + spinlock_irqsave_lock(&lwip_lock); if (libc_sd < 0) { - spinlock_unlock(&lwip_lock); + spinlock_irqsave_unlock(&lwip_lock); spinlock_irqsave_lock(&stdio_lock); for(i=0; i