Skip to content

Commit

Permalink
[dev][virtio] use references in a few places for readability purposes
Browse files Browse the repository at this point in the history
  • Loading branch information
travisg committed May 27, 2024
1 parent c6bb1a6 commit c9e27b9
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 33 deletions.
2 changes: 1 addition & 1 deletion dev/virtio/include/dev/virtio/virtio-device.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ class virtio_device {
/* virtio rings */
uint32_t active_rings_bitmap_ = {};
uint16_t ring_len_[MAX_VIRTIO_RINGS] = {};
vring ring_[MAX_VIRTIO_RINGS];
vring ring_[MAX_VIRTIO_RINGS] = {};
};


63 changes: 37 additions & 26 deletions dev/virtio/virtio-device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,43 +33,49 @@ void virtio_device::virtio_free_desc(uint ring_index, uint16_t desc_index) {
DEBUG_ASSERT(ring_index < MAX_VIRTIO_RINGS);
DEBUG_ASSERT(desc_index < ring_len_[ring_index]);

ring_[ring_index].desc[desc_index].next = ring_[ring_index].free_list;
ring_[ring_index].free_list = desc_index;
ring_[ring_index].free_count++;
vring &ring = ring_[ring_index];

ring.desc[desc_index].next = ring.free_list;
ring.free_list = desc_index;
ring.free_count++;
}

uint16_t virtio_device::virtio_alloc_desc(uint ring_index) {
DEBUG_ASSERT(ring_index < MAX_VIRTIO_RINGS);

if (ring_[ring_index].free_count == 0)
vring &ring = ring_[ring_index];

if (ring.free_count == 0)
return 0xffff;

DEBUG_ASSERT(ring_[ring_index].free_list != 0xffff);
DEBUG_ASSERT(ring.free_list != 0xffff);

uint16_t i = ring_[ring_index].free_list;
vring_desc *desc = &ring_[ring_index].desc[i];
ring_[ring_index].free_list = desc->next;
uint16_t i = ring.free_list;
vring_desc *desc = &ring.desc[i];
ring.free_list = desc->next;

ring_[ring_index].free_count--;
ring.free_count--;

return i;
}

vring_desc *virtio_device::virtio_alloc_desc_chain(uint ring_index, size_t count, uint16_t *start_index) {
DEBUG_ASSERT(ring_index < MAX_VIRTIO_RINGS);

if (ring_[ring_index].free_count < count)
vring &ring = ring_[ring_index];

if (ring.free_count < count)
return nullptr;

/* start popping entries off the chain */
vring_desc *last = nullptr;
uint16_t last_index = 0;
while (count > 0) {
uint16_t i = ring_[ring_index].free_list;
vring_desc *desc = &ring_[ring_index].desc[i];
uint16_t i = ring.free_list;
vring_desc *desc = &ring.desc[i];

ring_[ring_index].free_list = desc->next;
ring_[ring_index].free_count--;
ring.free_list = desc->next;
ring.free_count--;

if (last) {
desc->flags = VRING_DESC_F_NEXT;
Expand All @@ -96,10 +102,12 @@ void virtio_device::virtio_submit_chain(uint ring_index, uint16_t desc_index) {
DEBUG_ASSERT(ring_index < MAX_VIRTIO_RINGS);
DEBUG_ASSERT(desc_index < ring_len_[ring_index]);

vring &ring = ring_[ring_index];

/* add the chain to the available list */
vring_avail *avail = ring_[ring_index].avail;
vring_avail *avail = ring.avail;

avail->ring[avail->idx & ring_[ring_index].num_mask] = desc_index;
avail->ring[avail->idx & ring.num_mask] = desc_index;
mb();
avail->idx++;

Expand All @@ -116,8 +124,10 @@ status_t virtio_device::virtio_alloc_ring(uint index, uint16_t len) {

if (len == 0 || !ispow2(len) || len >= UINT16_MAX)
return ERR_INVALID_ARGS;
if (index >= MAX_VIRTIO_RINGS)
return ERR_INVALID_ARGS;

vring *ring = &ring_[index];
vring &ring = ring_[index];

/* allocate a ring */
size_t size = vring_size(len, PAGE_SIZE);
Expand Down Expand Up @@ -152,9 +162,9 @@ status_t virtio_device::virtio_alloc_ring(uint index, uint16_t len) {
#endif

/* initialize the ring */
vring_init(ring, len, vptr, PAGE_SIZE);
ring_[index].free_list = 0xffff;
ring_[index].free_count = 0;
vring_init(&ring, len, vptr, PAGE_SIZE);
ring.free_list = 0xffff;
ring.free_count = 0;
ring_len_[index] = len;

/* add all the descriptors to the free list */
Expand All @@ -180,23 +190,24 @@ handler_return virtio_device::handle_queue_interrupt() {
if ((active_rings_bitmap_ & (1<<r)) == 0)
continue;

vring *ring = &ring_[r];
LTRACEF("ring %u: used flags 0x%hx idx 0x%hx last_used %u\n", r, ring->used->flags, ring->used->idx, ring->last_used);
vring &ring = ring_[r];

LTRACEF("ring %u: used flags 0x%hx idx 0x%hx last_used %u\n", r, ring.used->flags, ring.used->idx, ring.last_used);

uint cur_idx = ring->used->idx;
for (uint i = ring->last_used; i != (cur_idx & ring->num_mask); i = (i + 1) & ring->num_mask) {
uint cur_idx = ring.used->idx;
for (uint i = ring.last_used; i != (cur_idx & ring.num_mask); i = (i + 1) & ring.num_mask) {
LTRACEF("looking at idx %u\n", i);

// process chain
vring_used_elem *used_elem = &ring->used->ring[i];
vring_used_elem *used_elem = &ring.used->ring[i];
LTRACEF("id %u, len %u\n", used_elem->id, used_elem->len);

DEBUG_ASSERT(irq_driver_callback_);
if (irq_driver_callback_(this, r, used_elem) == INT_RESCHEDULE) {
ret = INT_RESCHEDULE;
}

ring->last_used = (ring->last_used + 1) & ring->num_mask;
ring.last_used = (ring.last_used + 1) & ring.num_mask;
}
}

Expand Down
12 changes: 6 additions & 6 deletions dev/virtio/virtio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@
#include <lk/debug.h>
#include <lk/init.h>

void virtio_dump_desc(const vring_desc *desc) {
printf("vring descriptor %p\n", desc);
printf("\taddr 0x%llx\n", desc->addr);
printf("\tlen 0x%x\n", desc->len);
printf("\tflags 0x%hx\n", desc->flags);
printf("\tnext 0x%hx\n", desc->next);
void virtio_dump_desc(const vring_desc &desc) {
printf("vring descriptor %p\n", &desc);
printf("\taddr 0x%llx\n", desc.addr);
printf("\tlen 0x%x\n", desc.len);
printf("\tflags 0x%hx\n", desc.flags);
printf("\tnext 0x%hx\n", desc.next);
}

static void virtio_init(uint level) {
Expand Down

0 comments on commit c9e27b9

Please sign in to comment.