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