vmm: Make all task functions return void *
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 11 Apr 2017 20:37:55 +0000 (16:37 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 3 May 2017 16:13:02 +0000 (12:13 -0400)
I avoided this for a while, but it makes the upcoming changes to 2LSs
easier.  GCC wants to be able to spawn a thread that returns a void *, and
its simpler to have all VMM task threads do it than to special case it.

Besides, it's a matter of time until someone wants to spawn and join on a
task thread inside the VMM.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tests/vmm/vmrunkernel.c
user/vmm/include/vmm/sched.h
user/vmm/include/vmm/virtio.h
user/vmm/include/vmm/virtio_blk.h
user/vmm/include/vmm/virtio_lguest_console.h
user/vmm/include/vmm/virtio_net.h
user/vmm/nat.c
user/vmm/sched.c
user/vmm/virtio_blk.c
user/vmm/virtio_lguest_console.c
user/vmm/virtio_net.c

index 25f26dc..9a46cac 100644 (file)
@@ -49,7 +49,7 @@ void vapic_status_dump(FILE *f, void *vapic);
 #define BITOP_ADDR(x) "+m" (*(volatile long *) (x))
 #endif
 
-void timer_thread(void *arg)
+void *timer_thread(void *arg)
 {
        uint8_t vector;
        uint32_t initial_count;
@@ -63,6 +63,7 @@ void timer_thread(void *arg)
                uthread_usleep(1000);
        }
        fprintf(stderr, "SENDING TIMER\n");
+       return 0;
 }
 
 
index f8c9de0..cf022b9 100644 (file)
@@ -46,7 +46,7 @@ struct ctlr_thread {
 
 struct task_thread {
        struct uthread                          uthread;
-       void                                            (*func)(void *);
+       void                                            *(*func)(void *);
        void                                            *arg;
        size_t                                          stacksize;
        void                                            *stacktop;
@@ -81,7 +81,7 @@ int vmm_init(struct virtual_machine *vm, int flags);
 void start_guest_thread(struct guest_thread *gth);
 /* Start and run a task thread. */
 struct task_thread *vmm_run_task(struct virtual_machine *vm,
-                                 void (*func)(void *), void *arg);
+                                 void *(*func)(void *), void *arg);
 
 int vthread_attr_init(struct virtual_machine *vm, int vmmflags);
 int vthread_attr_kernel_init(struct virtual_machine *vm, int vmmflags);
index 30718f8..473d5bf 100644 (file)
@@ -69,7 +69,7 @@ struct virtio_vq {
        uint16_t last_avail;
 
        // The service function that processes buffers for this queue
-       void (*srv_fn)(void *arg);
+       void *(*srv_fn)(void *arg);
 
        // The thread that the service function is running in
        struct task_thread *srv_th;
index b39d855..5c94d4f 100644 (file)
@@ -145,5 +145,5 @@ struct virtio_scsi_inhdr {
 #define VIRTIO_BLK_S_IOERR     1
 #define VIRTIO_BLK_S_UNSUPP    2
 
-void blk_request(void *_vq);
+void *blk_request(void *_vq);
 void blk_init_fn(struct virtio_vq_dev *vqdev, const char *filename);
index 62a0b54..9298891 100644 (file)
@@ -25,5 +25,5 @@
  *     e523caa601f4a7c2fa1ecd040db921baf7453798
  */
 
-void cons_receiveq_fn(void *_vq);
-void cons_transmitq_fn(void *_vq);
+void *cons_receiveq_fn(void *_vq);
+void *cons_transmitq_fn(void *_vq);
index c8e3826..f49ebb0 100644 (file)
@@ -244,5 +244,5 @@ struct virtio_net_ctrl_mq {
 #define VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET        0
 
 void virtio_net_set_mac(struct virtio_vq_dev *vqdev, uint8_t *guest_mac);
-void net_receiveq_fn(void *_vq);
-void net_transmitq_fn(void *_vq);
+void *net_receiveq_fn(void *_vq);
+void *net_transmitq_fn(void *_vq);
index 02212f3..07ae488 100644 (file)
@@ -370,7 +370,7 @@ static struct ip_nat_map *get_map_by_tuple(uint8_t protocol,
        return map;
 }
 
-static void map_reaper(void *arg)
+static void *map_reaper(void *arg)
 {
        struct ip_nat_map *i, *temp;
        struct ip_nat_map_tailq to_release;
@@ -399,6 +399,7 @@ static void map_reaper(void *arg)
                TAILQ_FOREACH_SAFE(i, &to_release, lookup_tuple, temp)
                        kref_put(&i->kref);
        }
+       return 0;
 }
 
 static void map_dumper(void)
@@ -640,7 +641,7 @@ static void tap_inbound_conv(int fd)
  * A map who's FD fires might already be on the list - it's possible for an FD
  * to drain to 0 and get another packet (thus triggering a tap) before
  * __poll_inbound() notices and removes it from the list. */
-static void fdtap_watcher(void *arg)
+static void *fdtap_watcher(void *arg)
 {
        struct event_msg msg[1];
        struct ip_nat_map *map;
@@ -661,6 +662,7 @@ static void fdtap_watcher(void *arg)
                }
                uth_mutex_unlock(rx_mtx);
        }
+       return 0;
 }
 
 static struct event_queue *get_inbound_evq(void)
index 5258b89..b5c5310 100644 (file)
@@ -496,12 +496,11 @@ static void __task_thread_run(void)
 {
        struct task_thread *tth = (struct task_thread*)current_uthread;
 
-       tth->func(tth->arg);
-       uth_2ls_thread_exit(0);
+       uth_2ls_thread_exit(tth->func(tth->arg));
 }
 
 struct task_thread *vmm_run_task(struct virtual_machine *vm,
-                                 void (*func)(void *), void *arg)
+                                 void *(*func)(void *), void *arg)
 {
        struct task_thread *tth;
        struct uth_thread_attr tth_attr = {.want_tls = TRUE, .detached = TRUE};
index 6d15363..f1f9d00 100644 (file)
@@ -40,7 +40,7 @@ void blk_init_fn(struct virtio_vq_dev *vqdev, const char *filename)
        cfg_d->capacity = len;
 }
 
-void blk_request(void *_vq)
+void *blk_request(void *_vq)
 {
        struct virtio_vq *vq = _vq;
 
@@ -133,4 +133,5 @@ void blk_request(void *_vq)
                virtio_mmio_set_vring_irq(dev);
                dev->poke_guest(dev->vec, dev->dest);
        }
+       return 0;
 }
index 480d367..c261c2c 100644 (file)
@@ -32,7 +32,7 @@
 #include <vmm/virtio.h>
 #include <vmm/virtio_mmio.h>
 
-void cons_receiveq_fn(void *_vq) // host -> guest
+void *cons_receiveq_fn(void *_vq) // host -> guest
 {
        struct virtio_vq *vq = _vq;
        uint32_t head;
@@ -95,9 +95,10 @@ void cons_receiveq_fn(void *_vq) // host -> guest
                                "The host MUST provide a way for device interrupts to be sent to the guest. The 'poke_guest' function pointer on the vq->vqdev->transport_dev (assumed to be a struct virtio_mmio_dev) was not set.");
        }
        free(iov);
+       return 0;
 }
 
-void cons_transmitq_fn(void *_vq) // guest -> host
+void *cons_transmitq_fn(void *_vq) // guest -> host
 {
        struct virtio_vq *vq = _vq;
        uint32_t head;
@@ -156,4 +157,5 @@ void cons_transmitq_fn(void *_vq) // guest -> host
                                "The host MUST provide a way for device interrupts to be sent to the guest. The 'poke_guest' function pointer on the vq->vqdev->transport_dev (assumed to be a struct virtio_mmio_dev) was not set.");
        }
        free(iov);
+       return 0;
 }
index 9e7d9e3..1271e82 100644 (file)
@@ -49,7 +49,7 @@ void virtio_net_set_mac(struct virtio_vq_dev *vqdev, uint8_t *guest_mac)
 /* net_receiveq_fn receives packets for the guest through the virtio networking
  * device and the _vq virtio queue.
  */
-void net_receiveq_fn(void *_vq)
+void *net_receiveq_fn(void *_vq)
 {
        struct virtio_vq *vq = _vq;
        uint32_t head;
@@ -113,12 +113,13 @@ void net_receiveq_fn(void *_vq)
                virtio_mmio_set_vring_irq(dev);
                dev->poke_guest(dev->vec, dev->dest);
        }
+       return 0;
 }
 
 /* net_transmitq_fn transmits packets from the guest through the virtio
  * networking device through the _vq virtio queue.
  */
-void net_transmitq_fn(void *_vq)
+void *net_transmitq_fn(void *_vq)
 {
        struct virtio_vq *vq = _vq;
        uint32_t head;
@@ -156,4 +157,5 @@ void net_transmitq_fn(void *_vq)
                virtio_mmio_set_vring_irq(dev);
                dev->poke_guest(dev->vec, dev->dest);
        }
+       return 0;
 }