diff --git a/drivers/virtio-blk.cc b/drivers/virtio-blk.cc index 31b74f2179615428fe77ab1aff2c03111ade9942..18c38b161db01de4f8b91149f48d46d2ecfcbb7a 100644 --- a/drivers/virtio-blk.cc +++ b/drivers/virtio-blk.cc @@ -185,8 +185,9 @@ void virtio_blk::response_worker() { virtio_d(fmt("\t ----> IRQ: virtio_d - blk thread awaken")); int i = 0; + u32 len; - while((req = static_cast<virtio_blk_req*>(queue->get_buf())) != nullptr) { + while((req = static_cast<virtio_blk_req*>(queue->get_buf(&len))) != nullptr) { virtio_d(fmt("\t got response:%d = %d ") % i++ % (int)req->status->status); virtio_blk_outhdr* header = reinterpret_cast<virtio_blk_outhdr*>(req->req_header); diff --git a/drivers/virtio-net.cc b/drivers/virtio-net.cc index c6bbda8a2e338e3bedb745dab8c758c6a056efba..80f22346af12472b98b41d321e48697dc4f54dd6 100644 --- a/drivers/virtio-net.cc +++ b/drivers/virtio-net.cc @@ -238,9 +238,10 @@ namespace virtio { }); int i = 0; + u32 len; virtio_net_req * req; - while((req = static_cast<virtio_net_req*>(queue->get_buf())) != nullptr) { + while((req = static_cast<virtio_net_req*>(queue->get_buf(&len))) != nullptr) { auto ii = req->payload._nodes.begin(); ii++; @@ -398,10 +399,11 @@ namespace virtio { void virtio_net::tx_gc() { int i = 0; + u32 len; virtio_net_req * req; vring* queue = get_virt_queue(1); - while((req = static_cast<virtio_net_req*>(queue->get_buf())) != nullptr) { + while((req = static_cast<virtio_net_req*>(queue->get_buf(&len))) != nullptr) { virtio_net_d(fmt("%s: gc %d") % __FUNCTION__ % i++); delete req; diff --git a/drivers/virtio-vring.cc b/drivers/virtio-vring.cc index ed13319922189cf0379aeacf2f5a733ea1d48e0c..f55b04e32b4d32e3ec266f2028dbc3a92279fe23 100644 --- a/drivers/virtio-vring.cc +++ b/drivers/virtio-vring.cc @@ -138,7 +138,7 @@ namespace virtio { } void* - vring::get_buf() + vring::get_buf(u32 *len) { return with_lock(_lock, [=] { vring_used_elem elem; @@ -157,6 +157,7 @@ namespace virtio { virtio_d(fmt("get used: guest head=%d use_elem[head].id=%d") % used_ptr % _used->_used_elements[used_ptr]._id); elem = _used->_used_elements[used_ptr]; int idx = elem._id; + *len = elem._len; if (_desc[idx]._flags & vring_desc::VRING_DESC_F_INDIRECT) { free(mmu::phys_to_virt(_desc[idx]._paddr)); diff --git a/drivers/virtio-vring.hh b/drivers/virtio-vring.hh index 8b932ed6d11ccc6354f65ed088b7a0e04b41819f..a6e299ba50b5fc6c09f26b4278a3bffc00e54236 100644 --- a/drivers/virtio-vring.hh +++ b/drivers/virtio-vring.hh @@ -119,7 +119,7 @@ class virtio_driver; // Ring operations bool add_buf(sglist* sg, u16 out, u16 in, void* cookie); - void* get_buf(); + void* get_buf(u32 *len); bool used_ring_not_empty(); bool avail_ring_not_empty(); // when the available ring has x descriptors as room it means that