From 2f211cce6d0a07a78c7bd30131ca4e34b281b75e Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Sat, 17 Nov 2018 00:28:57 +0100 Subject: [PATCH] virtio: Replace size return with usedLength in queue_dequeue. The size was in fact the count of physical entries that were used. That number must necessarily be the same as the number given when adding to the queue, so that number isn't really interesting. Consequently none of the users of that API made use of it. Return the used length instead, which is the way virtio signals how much valid data resides in the dequeued buffer. This is for example important to know the frame length of incoming packets in virtio_net. --- headers/private/virtio/virtio.h | 2 +- src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp | 4 ++-- src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h | 2 +- src/add-ons/kernel/bus_managers/virtio/VirtioQueue.cpp | 7 +++---- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/headers/private/virtio/virtio.h b/headers/private/virtio/virtio.h index 68e36446e0..d53d1c2623 100644 --- a/headers/private/virtio/virtio.h +++ b/headers/private/virtio/virtio.h @@ -134,7 +134,7 @@ typedef struct { uint16 (*queue_size)(virtio_queue queue); - void* (*queue_dequeue)(virtio_queue queue, uint16* _size); + void* (*queue_dequeue)(virtio_queue queue, uint32* _usedLength); } virtio_device_interface; diff --git a/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp b/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp index e54e094d7c..753980e487 100644 --- a/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp +++ b/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp @@ -185,10 +185,10 @@ virtio_queue_size(virtio_queue _queue) void* -virtio_queue_dequeue(virtio_queue _queue, uint16* _size) +virtio_queue_dequeue(virtio_queue _queue, uint32* _usedLength) { VirtioQueue *queue = (VirtioQueue *)_queue; - return queue->Dequeue(_size); + return queue->Dequeue(_usedLength); } diff --git a/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h b/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h index f658eda0d7..9b4da99a14 100644 --- a/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h +++ b/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h @@ -131,7 +131,7 @@ public: void EnableInterrupt(); void DisableInterrupt(); - void* Dequeue(uint16* _size = NULL); + void* Dequeue(uint32* _usedLength = NULL); private: void UpdateAvailable(uint16 index); diff --git a/src/add-ons/kernel/bus_managers/virtio/VirtioQueue.cpp b/src/add-ons/kernel/bus_managers/virtio/VirtioQueue.cpp index 6d067c62a3..0220ab9385 100644 --- a/src/add-ons/kernel/bus_managers/virtio/VirtioQueue.cpp +++ b/src/add-ons/kernel/bus_managers/virtio/VirtioQueue.cpp @@ -246,7 +246,7 @@ VirtioQueue::Interrupt() void* -VirtioQueue::Dequeue(uint16 *_size) +VirtioQueue::Dequeue(uint32* _usedLength) { TRACE("Dequeue() fRingUsedIndex: %u\n", fRingUsedIndex); @@ -257,12 +257,11 @@ VirtioQueue::Dequeue(uint16 *_size) TRACE("Dequeue() usedIndex: %u\n", usedIndex); struct vring_used_elem *element = &fRing.used->ring[usedIndex]; uint16 descriptorIndex = element->id; - // uint32 length = element->len; + if (_usedLength != NULL) + *_usedLength = element->len; void* cookie = fDescriptors[descriptorIndex]->Cookie(); uint16 size = fDescriptors[descriptorIndex]->Size(); - if (_size != NULL) - *_size = size; if (size == 0) panic("VirtioQueue::Dequeue() size is zero\n"); fDescriptors[descriptorIndex]->Unset();