From c5962440106abf9b92b9c79f9469ed41ee9a7088 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 7 Sep 2024 11:21:38 -0300 Subject: [PATCH] io: use isr->priv --- kernel-src/io/block/nvme.c | 10 +++------- kernel-src/io/block/vioblk.c | 12 ++---------- kernel-src/io/net/vionet.c | 19 +++++-------------- kernel-src/io/virtio.c | 3 --- 4 files changed, 10 insertions(+), 34 deletions(-) diff --git a/kernel-src/io/block/nvme.c b/kernel-src/io/block/nvme.c index 1eb2f136..b33a57ad 100644 --- a/kernel-src/io/block/nvme.c +++ b/kernel-src/io/block/nvme.c @@ -294,18 +294,15 @@ static void nvme_dpc(context_t *, dpcarg_t arg) { spinlock_release(&pair->lock); } -static hashtable_t irqtable; - static void nvme_irq(isr_t *isr, context_t *context) { - void *v; - __assert(hashtable_get(&irqtable, &v, &isr->id, sizeof(isr->id)) == 0); - queuepair_t *pair = v; + queuepair_t *pair = isr->priv; dpc_enqueue(&pair->dpc, nvme_dpc, pair); } + static isr_t *msixnewisrforqueue(queuepair_t *queuepair) { isr_t *isr = interrupt_allocate(nvme_irq, ARCH_EOI, IPL_DISK); __assert(isr); - __assert(hashtable_set(&irqtable, queuepair, &isr->id, sizeof(isr->id), true) == 0); + isr->priv = queuepair; return isr; } @@ -764,7 +761,6 @@ static void initcontroller(pcienum_t *e) { } void nvme_init() { - __assert(hashtable_init(&irqtable, 10) == 0); int i = 0; for (;;) { pcienum_t *e = pci_getenum(PCI_CLASS_STORAGE, PCI_SUBCLASS_STORAGE_NVM, -1, -1, -1, -1, i++); diff --git a/kernel-src/io/block/vioblk.c b/kernel-src/io/block/vioblk.c index 003dfb6d..4422295a 100644 --- a/kernel-src/io/block/vioblk.c +++ b/kernel-src/io/block/vioblk.c @@ -34,8 +34,6 @@ typedef struct { #define HEADER_TYPE_READ 0 #define HEADER_TYPE_WRITE 1 -static hashtable_t inttable; // int id -> vioblkdev - static void vioblk_dpc(context_t *context, dpcarg_t arg) { vioblkdev_t *blkdev = arg; volatile viobuffer_t *buffers = VIO_QUEUE_BUFFERS(&blkdev->queue); @@ -55,9 +53,7 @@ static void vioblk_dpc(context_t *context, dpcarg_t arg) { } static void vioblk_irq(isr_t *isr, context_t *context) { - void *v; - __assert(hashtable_get(&inttable, &v, &isr->id, sizeof(isr->id)) == 0); - vioblkdev_t *blkdev = v; + vioblkdev_t *blkdev = isr->priv; dpc_enqueue(&blkdev->queuedpc, vioblk_dpc, blkdev); } @@ -176,9 +172,9 @@ int vioblk_newdevice(viodevice_t *viodevice) { isr_t *isr = interrupt_allocate(vioblk_irq, ARCH_EOI, IPL_DISK); __assert(isr); + isr->priv = blkdev; pci_msixadd(viodevice->e, 0, INTERRUPT_IDTOVECTOR(isr->id), 0, 0); pci_msixsetmask(viodevice->e, 0); - __assert(hashtable_set(&inttable, blkdev, &isr->id, sizeof(isr->id), true) == 0); // initialize queue size_t size = min(QUEUE_MAX_SIZE, virtio_queuesize(viodevice, 0)); @@ -205,7 +201,3 @@ int vioblk_newdevice(viodevice_t *viodevice) { return 0; } - -void vioblk_init() { - __assert(hashtable_init(&inttable, 10) == 0); -} diff --git a/kernel-src/io/net/vionet.c b/kernel-src/io/net/vionet.c index 6aaff523..ddf57683 100644 --- a/kernel-src/io/net/vionet.c +++ b/kernel-src/io/net/vionet.c @@ -38,8 +38,6 @@ typedef struct { uint16_t buffercount; } __attribute__((packed)) vioframe_t; -static hashtable_t irqtable; // isr id -> netdev - static void rx_dpc(context_t *context, dpcarg_t arg) { vionetdev_t *netdev = arg; volatile viobuffer_t *buffers = VIO_QUEUE_BUFFERS(&netdev->rxqueue); @@ -54,9 +52,7 @@ static void rx_dpc(context_t *context, dpcarg_t arg) { } static void rx_irq(isr_t *isr, context_t *context) { - void *v; - __assert(hashtable_get(&irqtable, &v, &isr->id, sizeof(isr->id)) == 0); - vionetdev_t *netdev = v; + vionetdev_t *netdev = isr->priv; dpc_enqueue(&netdev->txdpc, rx_dpc, netdev); } @@ -77,9 +73,7 @@ static void tx_dpc(context_t *context, dpcarg_t arg) { } static void tx_irq(isr_t *isr, context_t *context) { - void *v; - __assert(hashtable_get(&irqtable, &v, &isr->id, sizeof(isr->id)) == 0); - vionetdev_t *netdev = v; + vionetdev_t *netdev = isr->priv; dpc_enqueue(&netdev->txdpc, tx_dpc, netdev); } @@ -196,12 +190,13 @@ int vionet_newdevice(viodevice_t *viodevice) { isr_t *rxisr = interrupt_allocate(rx_irq, ARCH_EOI, IPL_NET); __assert(rxisr); pci_msixadd(viodevice->e, 0, INTERRUPT_IDTOVECTOR(rxisr->id), 1, 0); - __assert(hashtable_set(&irqtable, netdev, &rxisr->id, sizeof(rxisr->id), true) == 0); + rxisr->priv = netdev; isr_t *txisr = interrupt_allocate(tx_irq, ARCH_EOI, IPL_NET); __assert(txisr); pci_msixadd(viodevice->e, 1, INTERRUPT_IDTOVECTOR(txisr->id), 1, 0); - __assert(hashtable_set(&irqtable, netdev, &txisr->id, sizeof(txisr->id), true) == 0); + txisr->priv = netdev; + pci_msixsetmask(viodevice->e, 0); virtio_enablequeue(viodevice, 0); @@ -236,7 +231,3 @@ int vionet_newdevice(viodevice_t *viodevice) { return 0; } - -void vionet_init() { - __assert(hashtable_init(&irqtable, 20) == 0); -} diff --git a/kernel-src/io/virtio.c b/kernel-src/io/virtio.c index 3af4b385..6e395c44 100644 --- a/kernel-src/io/virtio.c +++ b/kernel-src/io/virtio.c @@ -166,9 +166,6 @@ static void virtio_newdevice(pcienum_t *e) { } void virtio_init() { - vioblk_init(); - vionet_init(); - for (int dev = VIRTIO_DEVICE_MIN; dev <= VIRTIO_DEVICE_MAX; ++dev) { int i = 0; for (;;) {