From 3093051a8b9a01ea75fa36a7b9c75673efb6835e Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 29 May 2024 16:08:28 -0300 Subject: [PATCH] kernel: remove event_t as it suffered from a lost wakeup issue --- kernel-src/include/event.h | 12 ------------ kernel-src/include/kernel/net.h | 1 - kernel-src/include/kernel/pipefs.h | 1 - kernel-src/io/block/nvme.c | 19 ++++++------------- kernel-src/io/block/vioblk.c | 1 - kernel-src/io/net/arp.c | 4 ---- kernel-src/io/net/loopback.c | 1 - kernel-src/io/net/vionet.c | 14 +++++--------- kernel-src/lib/event.c | 19 ------------------- 9 files changed, 11 insertions(+), 61 deletions(-) delete mode 100644 kernel-src/include/event.h delete mode 100644 kernel-src/lib/event.c diff --git a/kernel-src/include/event.h b/kernel-src/include/event.h deleted file mode 100644 index 9eccebb3..00000000 --- a/kernel-src/include/event.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _EVENT_H -#define _EVENT_H - -#include -typedef semaphore_t event_t; - -int event_wait(event_t *event, bool interruptible); -void event_signal(event_t *event); - -#define EVENT_INIT(x) SEMAPHORE_INIT(x, 0); - -#endif diff --git a/kernel-src/include/kernel/net.h b/kernel-src/include/kernel/net.h index 600148ea..977b27aa 100644 --- a/kernel-src/include/kernel/net.h +++ b/kernel-src/include/kernel/net.h @@ -6,7 +6,6 @@ #include #include -#include #include #include #include diff --git a/kernel-src/include/kernel/pipefs.h b/kernel-src/include/kernel/pipefs.h index b2539d83..6b782dc6 100644 --- a/kernel-src/include/kernel/pipefs.h +++ b/kernel-src/include/kernel/pipefs.h @@ -4,7 +4,6 @@ #include #include #include -#include #include typedef struct pipenode_t { diff --git a/kernel-src/io/block/nvme.c b/kernel-src/io/block/nvme.c index 27018b1f..dc3a35a7 100644 --- a/kernel-src/io/block/nvme.c +++ b/kernel-src/io/block/nvme.c @@ -50,7 +50,6 @@ (sub)->namespace = nsid; #define PAIR_INIT(pair, opcode, fused, memaccess, nsid) \ - EVENT_INIT(&(pair)->event); \ SUB_INIT(&(pair)->sub, opcode, fused, memaccess, nsid); #define SUB_DW0_OPCODE_WRITE 0x1 @@ -222,7 +221,7 @@ typedef struct { typedef struct { compentry_t comp; subentry_t sub; - event_t event; + thread_t *thread; } entrypair_t; typedef struct { @@ -277,7 +276,7 @@ static void nvme_dpc(context_t *, dpcarg_t arg) { int subid = COMP_CMDINFO_CMDID(queue[pair->completion.index].cmdinfo); pair->entries[subid]->comp = queue[pair->completion.index]; - event_signal(&pair->entries[subid]->event); + sched_wakeup(pair->entries[subid]->thread, SCHED_WAKEUP_REASON_NORMAL); pair->entries[subid] = NULL; semaphore_signal(&pair->entrysem); @@ -311,7 +310,7 @@ static isr_t *msixnewisrforqueue(queuepair_t *queuepair) { return isr; } -static void enqueue(queuepair_t *queuepair, entrypair_t *entries) { +static void enqueueandwait(queuepair_t *queuepair, entrypair_t *entries) { bool intstatus = interrupt_set(false); semaphore_wait(&queuepair->entrysem, false); @@ -328,16 +327,10 @@ static void enqueue(queuepair_t *queuepair, entrypair_t *entries) { queuepair->submission.index %= queuepair->submission.entrycount; *queuepair->submission.doorbell = queuepair->submission.index; + sched_preparesleep(false); + entries->thread = _cpu()->thread; spinlock_release(&queuepair->lock); - interrupt_set(intstatus); -} - -static void enqueueandwait(queuepair_t *queuepair, entrypair_t *entries) { - bool intstatus = interrupt_set(false); - - enqueue(queuepair, entries); - event_wait(&entries->event, false); - + sched_yield(); interrupt_set(intstatus); } diff --git a/kernel-src/io/block/vioblk.c b/kernel-src/io/block/vioblk.c index 880c7cff..ea124e4e 100644 --- a/kernel-src/io/block/vioblk.c +++ b/kernel-src/io/block/vioblk.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #define QUEUE_MAX_SIZE 128 diff --git a/kernel-src/io/net/arp.c b/kernel-src/io/net/arp.c index 7b6eead7..8365e191 100644 --- a/kernel-src/io/net/arp.c +++ b/kernel-src/io/net/arp.c @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -26,7 +25,6 @@ typedef struct { static scache_t *entryallocator; static thread_t *handlerthread; -static event_t handlerthreadwakeup; static thread_t *cleanupthread; @@ -277,8 +275,6 @@ void arp_init() { cleanupthread = sched_newthread(cleanupthreadfn, PAGE_SIZE * 4, 0, NULL, NULL); __assert(cleanupthread); - EVENT_INIT(&handlerthreadwakeup); - MUTEX_INIT(&cachelock); SEMAPHORE_INIT(&psem, 0); diff --git a/kernel-src/io/net/loopback.c b/kernel-src/io/net/loopback.c index 9f5345ae..38635322 100644 --- a/kernel-src/io/net/loopback.c +++ b/kernel-src/io/net/loopback.c @@ -3,7 +3,6 @@ #include #include #include -#include #include #include diff --git a/kernel-src/io/net/vionet.c b/kernel-src/io/net/vionet.c index 4bd24ebd..ef4c7e62 100644 --- a/kernel-src/io/net/vionet.c +++ b/kernel-src/io/net/vionet.c @@ -3,7 +3,6 @@ #include #include #include -#include #include #include @@ -18,7 +17,7 @@ typedef struct { viodevice_t *viodevice; vioqueue_t rxqueue; vioqueue_t txqueue; - event_t *txwait[QUEUE_MAX_SIZE]; + thread_t *txwait[QUEUE_MAX_SIZE]; semaphore_t txsem; spinlock_t txlock; dpc_t txdpc; @@ -69,7 +68,7 @@ static void tx_dpc(context_t *context, dpcarg_t arg) { int idx = netdev->txqueue.lastusedindex++ % netdev->txqueue.size; int buffidx = VIO_QUEUE_DEV_RING(&netdev->txqueue)[idx].index; __assert(netdev->txwait[buffidx / 2]); - event_signal(netdev->txwait[buffidx / 2]); + sched_wakeup(netdev->txwait[buffidx / 2], SCHED_WAKEUP_REASON_NORMAL); netdev->txwait[buffidx / 2] = NULL; buffers[buffidx].address = 0; semaphore_signal(&netdev->txsem); @@ -121,9 +120,6 @@ static int vionet_sendpacket(netdev_t *internal, netdesc_t desc, mac_t targetmac memcpy(desc.address, &vioframe, sizeof(vioframe_t)); memcpy((void *)((uintptr_t)desc.address + sizeof(vioframe_t)), ðframe, sizeof(ethframe_t)); - event_t event; - EVENT_INIT(&event); - bool intstatus = interrupt_set(false); semaphore_wait(&netdev->txsem, false); @@ -142,13 +138,13 @@ static int vionet_sendpacket(netdev_t *internal, netdesc_t desc, mac_t targetmac size_t driveridx = VIO_QUEUE_DRV_IDX(&netdev->txqueue)++; VIO_QUEUE_DRV_RING(&netdev->txqueue)[driveridx % netdev->txqueue.size] = idx; - netdev->txwait[idx] = &event; - + sched_preparesleep(false); + netdev->txwait[idx] = _cpu()->thread; *netdev->txqueue.notify = 0; spinlock_release(&netdev->txlock); - event_wait(&event, false); + sched_yield(); interrupt_set(intstatus); return 0; diff --git a/kernel-src/lib/event.c b/kernel-src/lib/event.c deleted file mode 100644 index 9308dfac..00000000 --- a/kernel-src/lib/event.c +++ /dev/null @@ -1,19 +0,0 @@ -#include - -// TODO while this works, it is built upon semaphores and might have some race conditions - -int event_wait(event_t *event, bool interruptible) { - int e = semaphore_wait(event, interruptible); - if (e) - return e; - - if (semaphore_haswaiters(event)) - semaphore_signal(event); - - return 0; -} - -void event_signal(event_t *event) { - if (semaphore_haswaiters(event)) - semaphore_signal(event); -}