]> Zhao Yanbai Git Server - minix.git/commitdiff
libvirtio: expose result size on packet dequeue 11/2911/1
authorDavid van Moolenbroek <david@minix3.org>
Mon, 1 Dec 2014 17:30:45 +0000 (17:30 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Thu, 4 Dec 2014 12:10:47 +0000 (12:10 +0000)
Change-Id: I49304678895779849abc2528a9f78730f968e712

minix/drivers/net/virtio_net/virtio_net.c
minix/drivers/storage/virtio_blk/virtio_blk.c
minix/include/minix/virtio.h
minix/lib/libvirtio/virtio.c

index e7daa1a6e97c3a677495a5c4691d89493219ff48..2cb381a0215aa26074dfd4497c9124876b556176 100644 (file)
@@ -268,7 +268,7 @@ virtio_net_check_queues(void)
        struct packet *p;
 
        /* Put the received packets into the recv list */
-       while (virtio_from_queue(net_dev, RX_Q, (void **)&p) == 0) {
+       while (virtio_from_queue(net_dev, RX_Q, (void **)&p, NULL) == 0) {
                STAILQ_INSERT_TAIL(&recv_list, p, next);
                in_rx--;
                virtio_net_stats.ets_packetR++;
@@ -277,7 +277,7 @@ virtio_net_check_queues(void)
        /* Packets from the TX queue just indicated they are free to
         * be reused now. inet already knows about them as being sent.
         */
-       while (virtio_from_queue(net_dev, TX_Q, (void **)&p) == 0) {
+       while (virtio_from_queue(net_dev, TX_Q, (void **)&p, NULL) == 0) {
                memset(p->vhdr, 0, sizeof(*p->vhdr));
                memset(p->vdata, 0, MAX_PACK_SIZE);
                STAILQ_INSERT_HEAD(&free_list, p, next);
index 4583101c7f797079a2492f0c23005c76a3f32e4f..d7a3c73383f50396d6ac7fbc29f76d86266a3ef4 100644 (file)
@@ -439,7 +439,7 @@ virtio_blk_device_intr(void)
        thread_id_t *tid;
 
        /* Multiple requests might have finished */
-       while (!virtio_from_queue(blk_dev, 0, (void**)&tid))
+       while (!virtio_from_queue(blk_dev, 0, (void**)&tid, NULL))
                blockdriver_mt_wakeup(*tid);
 }
 
index aec6d4b899e80a32661fd3a6233e587cc3fc58d9..aee338e1c00e5f812075a81d3097e0483b4c5574 100644 (file)
@@ -98,11 +98,12 @@ int virtio_to_queue(struct virtio_device *dev, int qidx,
                        struct vumap_phys *bufs, size_t num, void *data);
 
 /*
- * If the host used a chain of descriptors, return 0 and set data
- * as was given to virtio_to_queue(). If the host has not processed
- * any element returns -1.
+ * If the host used a chain of descriptors, return 0, set data as was given to
+ * virtio_to_queue(), and if len is not NULL, set it to the resulting length.
+ * If the host has not processed any element, return -1.
  */
-int virtio_from_queue(struct virtio_device *dev, int qidx, void **data);
+int virtio_from_queue(struct virtio_device *dev, int qidx, void **data,
+       size_t *len);
 
 /* IRQ related functions */
 void virtio_irq_enable(struct virtio_device *dev);
index 1ff715a04c0c20d562708367c632d5921c049836..95c64cbe05950e4cc06a15e465a0a3168a0cadd7 100644 (file)
@@ -639,7 +639,8 @@ virtio_to_queue(struct virtio_device *dev, int qidx, struct vumap_phys *bufs,
 }
 
 int
-virtio_from_queue(struct virtio_device *dev, int qidx, void **data)
+virtio_from_queue(struct virtio_device *dev, int qidx, void **data,
+       size_t *len)
 {
        struct virtio_queue *q;
        struct vring *vring;
@@ -718,6 +719,9 @@ virtio_from_queue(struct virtio_device *dev, int qidx, void **data)
        *data = q->data[uel->id];
        q->data[uel->id] = NULL;
 
+       if (len != NULL)
+               *len = uel->len;
+
        return 0;
 }