On 12 Nov 01:52, David Gwynne wrote:
> this updates a diff i had from a few years ago to move the vioblk
> handling in vmd into a separate thread.
> 
> basically disk io in your virtual machine should not block the vcpu from
> running now.
> 
> just throwing this out so people can give it a go and kick it around.
> 
> Index: Makefile
> ===================================================================
> RCS file: /cvs/src/usr.sbin/vmd/Makefile,v
> retrieving revision 1.28
> diff -u -p -r1.28 Makefile
> --- Makefile  10 Nov 2022 11:46:39 -0000      1.28
> +++ Makefile  11 Nov 2022 15:51:50 -0000
> @@ -5,7 +5,7 @@
>  PROG=                vmd
>  SRCS=                vmd.c control.c log.c priv.c proc.c config.c vmm.c
>  SRCS+=               vm.c loadfile_elf.c pci.c virtio.c i8259.c mc146818.c
> -SRCS+=               ns8250.c i8253.c dhcp.c packet.c mmio.c
> +SRCS+=               ns8250.c i8253.c dhcp.c packet.c mmio.c task.c
>  SRCS+=               parse.y atomicio.c vioscsi.c vioraw.c vioqcow2.c 
> fw_cfg.c
>  SRCS+=               vm_agentx.c
>  
> Index: task.c
> ===================================================================
> RCS file: task.c
> diff -N task.c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ task.c    11 Nov 2022 15:51:50 -0000
> @@ -0,0 +1,158 @@
> +/*   $OpenBSD: task.c,v 1.2 2018/06/19 17:12:34 reyk Exp $ */
> +
> +/*
> + * Copyright (c) 2017 David Gwynne <d...@openbsd.org>
> + *
> + * Permission to use, copy, modify, and distribute this software for any
> + * purpose with or without fee is hereby granted, provided that the above
> + * copyright notice and this permission notice appear in all copies.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +
> +#include <errno.h>
> +#include <stddef.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <unistd.h>
> +#include <pthread.h>
> +#include <pthread_np.h>
> +
> +#include "task.h"
> +
> +#define ISSET(_v, _m)        ((_v) & (_m))
> +#define SET(_v, _m)  ((_v) |= (_m))
> +#define CLR(_v, _m)  ((_v) &= ~(_m))
> +
> +struct taskq {
> +     pthread_t                 thread;
> +     struct task_list          list;
> +     pthread_mutex_t           mtx;
> +     pthread_cond_t            cv;
> +};
> +
> +#define TASK_ONQUEUE         (1 << 0)
> +
> +static void *taskq_run(void *);
> +
> +struct taskq *
> +taskq_create(const char *name)
> +{
> +     struct taskq *tq;
> +     int error;
> +
> +     tq = malloc(sizeof(*tq));
> +     if (tq == NULL)
> +             return (NULL);
> +
> +     TAILQ_INIT(&tq->list);
> +
> +     error = pthread_mutex_init(&tq->mtx, NULL);
> +     if (error != 0)
> +             goto free;
> +
> +     error = pthread_cond_init(&tq->cv, NULL);
> +     if (error != 0)
> +             goto mtx;
> +
> +     error = pthread_create(&tq->thread, NULL, taskq_run, tq);
> +     if (error != 0)
> +             goto cv;
> +
> +     pthread_set_name_np(tq->thread, name);
> +
> +     return (tq);
> +
> +cv:
> +     pthread_cond_destroy(&tq->cv);
> +mtx:
> +     pthread_mutex_destroy(&tq->mtx); /* can this really fail? */
> +free:
> +     free(tq);
> +
> +     errno = error;
> +     return (NULL);
> +}
> +
> +static void *
> +taskq_run(void *tqarg)
> +{
> +     struct taskq *tq = tqarg;
> +     struct task *t;
> +
> +     void (*t_func)(void *);
> +     void *t_arg;
> +
> +     for (;;) {
> +             pthread_mutex_lock(&tq->mtx);
> +             while ((t = TAILQ_FIRST(&tq->list)) == NULL)
> +                     pthread_cond_wait(&tq->cv, &tq->mtx);
> +
> +             TAILQ_REMOVE(&tq->list, t, t_entry);
> +             CLR(t->t_flags, TASK_ONQUEUE);
> +
> +             t_func = t->t_func;
> +             t_arg = t->t_arg;
> +
> +             pthread_mutex_unlock(&tq->mtx);
> +
> +             (*t_func)(t_arg);
> +     }
> +
> +     return (NULL);
> +}
> +
> +void
> +task_set(struct task *t, void (*fn)(void *), void *arg)
> +{
> +     t->t_func = fn;
> +     t->t_arg = arg;
> +     t->t_flags = 0;
> +}
> +
> +int
> +task_add(struct taskq *tq, struct task *t)
> +{
> +     int rv = 1;
> +
> +     if (ISSET(t->t_flags, TASK_ONQUEUE))
> +             return (0);
> +
> +     pthread_mutex_lock(&tq->mtx);
> +     if (ISSET(t->t_flags, TASK_ONQUEUE))
> +             rv = 0;
> +     else {
> +             SET(t->t_flags, TASK_ONQUEUE);
> +             TAILQ_INSERT_TAIL(&tq->list, t, t_entry);
> +             pthread_cond_signal(&tq->cv);
> +     }
> +     pthread_mutex_unlock(&tq->mtx);
> +
> +     return (rv);
> +}
> +
> +int
> +task_del(struct taskq *tq, struct task *t)
> +{
> +     int rv = 1;
> +
> +     if (!ISSET(t->t_flags, TASK_ONQUEUE))
> +             return (0);
> +
> +     pthread_mutex_lock(&tq->mtx);
> +     if (!ISSET(t->t_flags, TASK_ONQUEUE))
> +             rv = 0;
> +     else {
> +             TAILQ_REMOVE(&tq->list, t, t_entry);
> +             CLR(t->t_flags, TASK_ONQUEUE);
> +     }
> +     pthread_mutex_unlock(&tq->mtx);
> +
> +     return (rv);
> +}
> Index: task.h
> ===================================================================
> RCS file: task.h
> diff -N task.h
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ task.h    11 Nov 2022 15:51:50 -0000
> @@ -0,0 +1,43 @@
> +/*   $OpenBSD: task.h,v 1.1 2017/09/15 02:39:33 dlg Exp $ */
> +
> +/*
> + * Copyright (c) 2013 David Gwynne <d...@openbsd.org>
> + *
> + * Permission to use, copy, modify, and distribute this software for any
> + * purpose with or without fee is hereby granted, provided that the above
> + * copyright notice and this permission notice appear in all copies.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +
> +#ifndef _TASK_H_
> +#define _TASK_H_
> +
> +#include <sys/queue.h>
> +
> +struct taskq;
> +
> +struct task {
> +     TAILQ_ENTRY(task) t_entry;
> +     void            (*t_func)(void *);
> +     void            *t_arg;
> +     unsigned int    t_flags;
> +};
> +
> +TAILQ_HEAD(task_list, task);
> +
> +#define TASK_INITIALIZER(_f, _a)  {{ NULL, NULL }, (_f), (_a), 0 }
> +
> +struct taskq *taskq_create(const char *);
> +
> +void          task_set(struct task *, void (*)(void *), void *);
> +int           task_add(struct taskq *, struct task *);
> +int           task_del(struct taskq *, struct task *);
> +
> +#endif /* _TASK_H_ */
> Index: virtio.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/vmd/virtio.c,v
> retrieving revision 1.97
> diff -u -p -r1.97 virtio.c
> --- virtio.c  29 Aug 2021 18:01:32 -0000      1.97
> +++ virtio.c  11 Nov 2022 15:51:51 -0000
> @@ -46,6 +46,7 @@
>  #include "virtio.h"
>  #include "vmd.h"
>  #include "vmm.h"
> +#include "task.h"
>  
>  extern char *__progname;
>  struct viornd_dev viornd;
> @@ -54,6 +55,8 @@ struct vionet_dev *vionet;
>  struct vioscsi_dev *vioscsi;
>  struct vmmci_dev vmmci;
>  
> +struct taskq *iotq;
> +
>  int nr_vionet;
>  int nr_vioblk;
>  
> @@ -294,11 +297,17 @@ virtio_rnd_io(int dir, uint16_t reg, uin
>  void
>  vioblk_update_qa(struct vioblk_dev *dev)
>  {
> +     struct vioblk_queue *vbq;
> +
>       /* Invalid queue? */
>       if (dev->cfg.queue_select > 0)
>               return;
>  
> -     dev->vq[dev->cfg.queue_select].qa = dev->cfg.queue_address;
> +     vbq = &dev->vbq[dev->cfg.queue_select];
> +
> +     vbq->vq.qa = dev->cfg.queue_address;
> +     vbq->ring = vaddr_mem(dev->cfg.queue_address * VIRTIO_PAGE_SIZE,
> +         vring_size(VIOBLK_QUEUE_SIZE));
>  }
>  
>  void
> @@ -311,8 +320,8 @@ vioblk_update_qs(struct vioblk_dev *dev)
>       }
>  
>       /* Update queue address/size based on queue select */
> -     dev->cfg.queue_address = dev->vq[dev->cfg.queue_select].qa;
> -     dev->cfg.queue_size = dev->vq[dev->cfg.queue_select].qs;
> +     dev->cfg.queue_address = dev->vbq[dev->cfg.queue_select].vq.qa;
> +     dev->cfg.queue_size = dev->vbq[dev->cfg.queue_select].vq.qs;
>  }
>  
>  static void
> @@ -421,77 +430,59 @@ vioblk_finish_write(struct ioinfo *info)
>  /*
>   * XXX in various cases, ds should be set to VIRTIO_BLK_S_IOERR, if we can
>   */
> -int
> -vioblk_notifyq(struct vioblk_dev *dev)
> +void
> +vioblk_notifyq(void *arg)
>  {
> -     uint64_t q_gpa;
> -     uint32_t vr_sz;
> -     uint16_t idx, cmd_desc_idx, secdata_desc_idx, ds_desc_idx;
> -     uint8_t ds;
> -     int cnt, ret;
> +     struct vioblk_queue *vbq = arg;
> +     struct vioblk_dev *dev = vbq->dev;
> +     struct virtio_vq_info *vq = &vbq->vq;
> +     uint16_t cmd_desc_idx, secdata_desc_idx, ds_desc_idx;
>       off_t secbias;
>       char *vr;
>       struct vring_desc *desc, *cmd_desc, *secdata_desc, *ds_desc;
>       struct vring_avail *avail;
>       struct vring_used *used;
>       struct virtio_blk_req_hdr cmd;
> +     unsigned int prod, cons, cnt;
> +     uint8_t ds;
>  
> -     ret = 0;
> -
> -     /* Invalid queue? */
> -     if (dev->cfg.queue_notify > 0)
> -             return (0);
> -
> -     vr_sz = vring_size(VIOBLK_QUEUE_SIZE);
> -     q_gpa = dev->vq[dev->cfg.queue_notify].qa;
> -     q_gpa = q_gpa * VIRTIO_PAGE_SIZE;
> -
> -     vr = calloc(1, vr_sz);
> +     vr = vbq->ring;
>       if (vr == NULL) {
> -             log_warn("calloc error getting vioblk ring");
> -             return (0);
> -     }
> -
> -     if (read_mem(q_gpa, vr, vr_sz)) {
> -             log_warnx("error reading gpa 0x%llx", q_gpa);
> -             goto out;
> +             log_warnx("%s: ring is not initialized", __func__);
> +             return;
>       }
>  
>       /* Compute offsets in ring of descriptors, avail ring, and used ring */
>       desc = (struct vring_desc *)(vr);
> -     avail = (struct vring_avail *)(vr +
> -         dev->vq[dev->cfg.queue_notify].vq_availoffset);
> -     used = (struct vring_used *)(vr +
> -         dev->vq[dev->cfg.queue_notify].vq_usedoffset);
> +     avail = (struct vring_avail *)(vr + vq->vq_availoffset);
> +     used = (struct vring_used *)(vr + vq->vq_usedoffset);
>  
> -     idx = dev->vq[dev->cfg.queue_notify].last_avail & VIOBLK_QUEUE_MASK;
> +     cons = vq->last_avail & VIOBLK_QUEUE_MASK;
> +     prod = avail->idx & VIOBLK_QUEUE_MASK;
>  
> -     if ((avail->idx & VIOBLK_QUEUE_MASK) == idx) {
> -             log_warnx("vioblk queue notify - nothing to do?");
> -             goto out;
> -     }
> -
> -     while (idx != (avail->idx & VIOBLK_QUEUE_MASK)) {
> +     if (cons == prod)
> +             return;
>  
> -             cmd_desc_idx = avail->ring[idx] & VIOBLK_QUEUE_MASK;
> +     do {
> +             cmd_desc_idx = avail->ring[cons] & VIOBLK_QUEUE_MASK;
>               cmd_desc = &desc[cmd_desc_idx];
>  
>               if ((cmd_desc->flags & VRING_DESC_F_NEXT) == 0) {
>                       log_warnx("unchained vioblk cmd descriptor received "
>                           "(idx %d)", cmd_desc_idx);
> -                     goto out;
> +                     break;
>               }
>  
>               /* Read command from descriptor ring */
>               if (cmd_desc->flags & VRING_DESC_F_WRITE) {
>                       log_warnx("vioblk: unexpected writable cmd descriptor "
>                           "%d", cmd_desc_idx);
> -                     goto out;
> +                     return;
>               }
>               if (read_mem(cmd_desc->addr, &cmd, sizeof(cmd))) {
>                       log_warnx("vioblk: command read_mem error @ 0x%llx",
>                           cmd_desc->addr);
> -                     goto out;
> +                     break;
>               }
>  
>               switch (cmd.type) {
> @@ -565,6 +556,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
>                       ds_desc = secdata_desc;
>  
>                       ds = VIRTIO_BLK_S_OK;
> +
>                       break;
>               case VIRTIO_BLK_T_OUT:
>                       secdata_desc_idx = cmd_desc->next & VIOBLK_QUEUE_MASK;
> @@ -691,22 +683,20 @@ vioblk_notifyq(struct vioblk_dev *dev)
>                       goto out;
>               }
>  
> -             ret = 1;
>               dev->cfg.isr_status = 1;
>               used->ring[used->idx & VIOBLK_QUEUE_MASK].id = cmd_desc_idx;
>               used->ring[used->idx & VIOBLK_QUEUE_MASK].len = cmd_desc->len;
> +             __sync_synchronize();
>               used->idx++;
>  
> -             dev->vq[dev->cfg.queue_notify].last_avail = avail->idx &
> -                 VIOBLK_QUEUE_MASK;
> -             if (write_mem(q_gpa, vr, vr_sz))
> -                     log_warnx("%s: error writing vio ring", __func__);
> +             cons++;
> +             cons &= VIOBLK_QUEUE_MASK;
> +     } while (cons != prod);
>  
> -             idx = (idx + 1) & VIOBLK_QUEUE_MASK;
> -     }
>  out:
> -     free(vr);
> -     return (ret);
> +     vq->last_avail = cons;
> +     dev->cfg.isr_status = 1;
> +     vcpu_assert_pic_irq(dev->vm_id, 0, dev->irq);
>  }
>  
>  int
> @@ -739,8 +729,8 @@ virtio_blk_io(int dir, uint16_t reg, uin
>                       break;
>               case VIRTIO_CONFIG_QUEUE_NOTIFY:
>                       dev->cfg.queue_notify = *data;
> -                     if (vioblk_notifyq(dev))
> -                             *intr = 1;
> +                     task_add(iotq, &dev->vbq[0].t);
> +                     *intr = 1;
>                       break;
>               case VIRTIO_CONFIG_DEVICE_STATUS:
>                       dev->cfg.device_status = *data;
> @@ -754,7 +744,7 @@ virtio_blk_io(int dir, uint16_t reg, uin
>                               dev->cfg.queue_select = 0;
>                               dev->cfg.queue_notify = 0;
>                               dev->cfg.isr_status = 0;
> -                             dev->vq[0].last_avail = 0;
> +                             dev->vbq[0].vq.last_avail = 0;
>                               vcpu_deassert_pic_irq(dev->vm_id, 0, dev->irq);
>                       }
>                       break;
> @@ -1897,8 +1887,14 @@ virtio_init(struct vmd_vm *vm, int child
>                       return;
>               }
>  
> +             iotq = taskq_create("vioblk");
> +             if (iotq == NULL)
> +                     fatalx("unable to create vioblk taskq");
> +
>               /* One virtio block device for each disk defined in vcp */
>               for (i = 0; i < vcp->vcp_ndisks; i++) {
> +                     struct virtio_vq_info *vq;
> +
>                       if (pci_add_device(&id, PCI_VENDOR_QUMRANET,
>                           PCI_PRODUCT_QUMRANET_VIO_BLOCK,
>                           PCI_CLASS_MASS_STORAGE,
> @@ -1915,13 +1911,16 @@ virtio_init(struct vmd_vm *vm, int child
>                                   "device", __progname);
>                               return;
>                       }
> -                     vioblk[i].vq[0].qs = VIOBLK_QUEUE_SIZE;
> -                     vioblk[i].vq[0].vq_availoffset =
> +
> +                     vq = &vioblk[i].vbq[0].vq;
> +                     vq->qs = VIOBLK_QUEUE_SIZE;
> +                     vq->vq_availoffset =
>                           sizeof(struct vring_desc) * VIOBLK_QUEUE_SIZE;
> -                     vioblk[i].vq[0].vq_usedoffset = VIRTQUEUE_ALIGN(
> +                     vq->vq_usedoffset = VIRTQUEUE_ALIGN(
>                           sizeof(struct vring_desc) * VIOBLK_QUEUE_SIZE
>                           + sizeof(uint16_t) * (2 + VIOBLK_QUEUE_SIZE));
> -                     vioblk[i].vq[0].last_avail = 0;
> +                     vq->last_avail = 0;
> +
>                       vioblk[i].cfg.device_feature = VIRTIO_BLK_F_SIZE_MAX;
>                       vioblk[i].max_xfer = 1048576;
>                       vioblk[i].pci_id = id;
> @@ -1935,6 +1934,10 @@ virtio_init(struct vmd_vm *vm, int child
>                               return;
>                       }
>                       vioblk[i].sz /= 512;
> +
> +                     vioblk[i].vbq[0].dev = &vioblk[i];
> +                     task_set(&vioblk[i].vbq[0].t,
> +                         vioblk_notifyq, &vioblk[i].vbq[0]);
>               }
>       }
>  
> Index: virtio.h
> ===================================================================
> RCS file: /cvs/src/usr.sbin/vmd/virtio.h,v
> retrieving revision 1.42
> diff -u -p -r1.42 virtio.h
> --- virtio.h  4 May 2022 23:17:25 -0000       1.42
> +++ virtio.h  11 Nov 2022 15:51:51 -0000
> @@ -24,6 +24,7 @@
>  #include <event.h>
>  
>  #include "vmd.h"
> +#include "task.h"
>  
>  #ifndef _VIRTIO_H_
>  #define _VIRTIO_H_
> @@ -167,10 +168,22 @@ struct viornd_dev {
>       uint32_t vm_id;
>  };
>  
> +/*
> + * vioblk
> + */
> +
> +struct vioblk_queue {
> +     struct vioblk_dev       *dev;
> +     void                    *ring;
> +     struct virtio_vq_info    vq;
> +     struct task              t;
> +     struct event             ev;
> +};
> +
>  struct vioblk_dev {
>       struct virtio_io_cfg cfg;
>  
> -     struct virtio_vq_info vq[VIRTIO_MAX_QUEUES];
> +     struct vioblk_queue vbq[VIRTIO_MAX_QUEUES];
>       struct virtio_backing file;
>  
>       uint64_t sz;
> @@ -181,7 +194,8 @@ struct vioblk_dev {
>       uint32_t vm_id;
>  };
>  
> -/* vioscsi will use at least 3 queues - 5.6.2 Virtqueues
> +/*
> + * vioscsi will use at least 3 queues - 5.6.2 Virtqueues
>   * Current implementation will use 3
>   * 0 - control
>   * 1 - event
> @@ -301,7 +315,7 @@ int vioblk_restore(int, struct vmop_crea
>      int[][VM_MAX_BASE_PER_DISK]);
>  void vioblk_update_qs(struct vioblk_dev *);
>  void vioblk_update_qa(struct vioblk_dev *);
> -int vioblk_notifyq(struct vioblk_dev *);
> +void vioblk_notifyq(void *);
>  
>  int virtio_net_io(int, uint16_t, uint32_t *, uint8_t *, void *, uint8_t);
>  int vionet_dump(int);
> Index: vm.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/vmd/vm.c,v
> retrieving revision 1.76
> diff -u -p -r1.76 vm.c
> --- vm.c      11 Nov 2022 10:52:44 -0000      1.76
> +++ vm.c      11 Nov 2022 15:51:51 -0000
> @@ -1990,6 +1990,31 @@ read_mem(paddr_t src, void *buf, size_t 
>       return (0);
>  }
>  
> +void *
> +vaddr_mem(paddr_t src, size_t len)
> +{
> +     struct vm_mem_range *vmr;
> +     size_t off;
> +
> +     vmr = find_gpa_range(&current_vm->vm_params.vmc_params, src, len);
> +     if (vmr == NULL) {
> +             errno = EINVAL;
> +             log_warn("%s: failed - invalid memory range src = 0x%lx, "
> +                 "len = 0x%zx", __func__, src, len);
> +             return (NULL);
> +     }
> +
> +     off = src - vmr->vmr_gpa;
> +     if (len > (vmr->vmr_size - off)) {
> +             errno = ENOMEM;
> +             log_warn("%s: failed - invalid memory range src = 0x%lx, "
> +                 "len = 0x%zx", __func__, src, len);
> +             return (NULL);
> +     }
> +
> +     return ((char *)vmr->vmr_va + off);
> +}
> +
>  /*
>   * vcpu_assert_pic_irq
>   *
> Index: vmd.h
> ===================================================================
> RCS file: /cvs/src/usr.sbin/vmd/vmd.h,v
> retrieving revision 1.111
> diff -u -p -r1.111 vmd.h
> --- vmd.h     31 Oct 2022 14:02:11 -0000      1.111
> +++ vmd.h     11 Nov 2022 15:51:51 -0000
> @@ -454,6 +454,7 @@ int        vmm_pipe(struct vmd_vm *, int, void
>  void  mutex_lock(pthread_mutex_t *);
>  void  mutex_unlock(pthread_mutex_t *);
>  int   read_mem(paddr_t, void *buf, size_t);
> +void *vaddr_mem(paddr_t, size_t);
>  int   start_vm(struct vmd_vm *, int);
>  __dead void vm_shutdown(unsigned int);
>  void  vm_pipe_init(struct vm_dev_pipe *, void (*)(int, short, void *));
> 

Hi David,

vms are not booting with this patch applied (I'm at the latest snap):

zarathustra:~$ vmctl start -c ansible01                                         
       
Connected to /dev/ttyp3 (speed 115200)                                          
       
Using drive 0, partition 3.
Loading...... 
probing: pc0 com0 mem[638K 1022M a20=on]                                        
       
disk: hd0+                                
>> OpenBSD/amd64 BOOT 3.55
\                                                                               
       
com0: 115200 baud 
switching console to com0     
>> OpenBSD/amd64 BOOT 3.55                                                      
>>        
boot>                                                                           
       
NOTE: random seed is being reused.
booting hd0a:/bsd: 15635736+3781640+299088+0+1175552 
[1114510+128+1226376+929125]=0x170da00
entry point at 0xffffffff81001000
[ using 3271168 bytes of bsd ELF symbol table ]
Copyright (c) 1982, 1986, 1989, 1991, 1993
        The Regents of the University of California.  All rights reserved.
Copyright (c) 1995-2022 OpenBSD. All rights reserved.  https://www.OpenBSD.org
                                           
OpenBSD 7.2-current (GENERIC) #796: Tue Nov 15 21:59:04 MST 2022
    dera...@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC
real mem = 1056952320 (1007MB)
avail mem = 1007677440 (960MB)    
random: good seed from bootblocks
mpath0 at root
scsibus0 at mpath0: 256 targets
mainbus0 at root
bios0 at mainbus0: SMBIOS rev. 2.4 @ 0xf36e0 (10 entries)
bios0: vendor SeaBIOS version "1.14.0p0-OpenBSD-vmm" date 01/01/2011
bios0: OpenBSD VMM                   
acpi at bios0 not configured
cpu0 at mainbus0: (uniprocessor)
cpu0: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz, 2803.29 MHz, 06-8c-01
cpu0: 
FPU,VME,DE,PSE,TSC,MSR,PAE,CX8,SEP,PGE,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,HV,NXE,P
AGE1GB,LONG,LAHF,ABM,3DNOWP,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,ERMS,RDSEED,ADX,SMAP,CLFLUSHOPT,CLWB,SHA,UMIP,PKU,MD_CLEAR,MELTDOWN
cpu0: 48KB 64b/line 12-way D-cache, 32KB 64b/line 8-way I-cache, 1MB 64b/line 
20-way L2 cache, 12MB 64b/line 12-way L3 cache
cpu0: smt 0, core 0, package 0
cpu0: using VERW MDS workaround
pvbus0 at mainbus0: OpenBSD
pvclock0 at pvbus0
pci0 at mainbus0 bus 0
pchb0 at pci0 dev 0 function 0 "OpenBSD VMM Host" rev 0x00
virtio0 at pci0 dev 1 function 0 "Qumranet Virtio RNG" rev 0x00
viornd0 at virtio0
virtio0: irq 3
virtio1 at pci0 dev 2 function 0 "Qumranet Virtio Network" rev 0x00
vio0 at virtio1: address fe:e1:bb:d1:79:81
virtio1: irq 5
virtio2 at pci0 dev 3 function 0 "Qumranet Virtio Storage" rev 0x00
vioblk0 at virtio2
scsibus1 at vioblk0: 1 targets
sd0 at scsibus1 targ 0 lun 0: <VirtIO, Block Device, >
sd0: 10240MB, 512 bytes/sector, 20971520 sectors
virtio2: irq 6
virtio3 at pci0 dev 4 function 0 "OpenBSD VMM Control" rev 0x00
vmmci0 at virtio3
virtio3: irq 7
isa0 at mainbus0
isadma0 at isa0
com0 at isa0 port 0x3f8/8 irq 4: ns8250, no fifo
com0: console
vscsi0 at root
scsibus2 at vscsi0: 256 targets
softraid0 at root
scsibus3 at softraid0: 256 targets

vmd started with -dvvv:

zarathustra# /usr/sbin/vmd -dvvv                                                
                                                                           
13:53:37 [101/1495]
startup
vm_register: registering vm 1
/etc/vm.conf:21: vm "default" registered (disabled)
vm_register: registering vm 2
/etc/vm.conf:28: vm "debian01" registered (disabled)
vm_register: registering vm 3
/etc/vm.conf:36: vm "vaultwarden01" registered (disabled)
vm_register: registering vm 4
/etc/vm.conf:41: vm "saltmaster01" registered (disabled)
vm_register: registering vm 5
/etc/vm.conf:46: vm "saltmaster02" registered (disabled)
vm_register: registering vm 6
/etc/vm.conf:51: vm "saltmaster03" registered (disabled)
vm_register: registering vm 7
/etc/vm.conf:57: vm "saltminion01" registered (disabled)
vm_register: registering vm 8
/etc/vm.conf:65: vm "jitsi01" registered (disabled)
vm_register: registering vm 9
/etc/vm.conf:71: vm "vault01" registered (disabled)
vm_register: registering vm 10
/etc/vm.conf:77: vm "vault02" registered (disabled)
vm_register: registering vm 11
/etc/vm.conf:83: vm "vault03" registered (disabled)
vm_register: registering vm 12
/etc/vm.conf:91: vm "root_ca" registered (disabled)
vm_register: registering vm 13
/etc/vm.conf:97: vm "code" registered (disabled)
vm_register: registering vm 14
/etc/vm.conf:106: vm "rhel8" registered (disabled)
vm_register: registering vm 15
/etc/vm.conf:116: vm "rhel9" registered (disabled)
vm_register: registering vm 16
/etc/vm.conf:126: vm "satellite" registered (disabled)
vm_register: registering vm 17
/etc/vm.conf:138: vm "saltdev" registered (disabled)
vm_register: registering vm 18
/etc/vm.conf:151: vm "ports" registered (disabled)
vm_register: registering vm 19
/etc/vm.conf:158: vm "ansible01" registered (disabled)
vm_register: registering vm 20
/etc/vm.conf:165: vm "ansible02" registered (disabled)
/etc/vm.conf:168: switch "uplink" registered
warning: macro 'ramdisk' not used
warning: macro 'sets' not used
vm_priv_brconfig: interface veb0 description switch1-uplink
vmd_configure: setting staggered start configuration to parallelism: 8 and 
delay: 30
vmd_configure: starting vms in staggered fashion
start_vm_batch: starting batch of 8 vms
start_vm_batch: not starting vm ansible01 (disabled)
start_vm_batch: done starting vms
config_getconfig: control retrieving config 
config_getconfig: vmm retrieving config
config_getconfig: agentx retrieving config
config_getconfig: priv retrieving config
vm_opentty: vm ansible01 tty /dev/ttyp3 uid 1000 gid 4 mode 620
vm_register: registering vm 19
vm_priv_ifconfig: interface tap0 description vm19-if0-ansible01
vm_priv_ifconfig: switch "uplink" interface veb0 add tap0
vm_priv_ifconfig: interface tap0 address 100.64.19.2/31
ansible01: started vm 19 successfully, tty /dev/ttyp3
loadfile_bios: loaded BIOS image
run_vm: initializing hardware for vm ansible01
pic_set_elcr: setting level triggered mode for irq 3
pic_set_elcr: setting level triggered mode for irq 5
virtio_init: vm "ansible01" vio0 lladdr fe:e1:bb:d1:79:81, local
pic_set_elcr: setting level triggered mode for irq 6
qc2_open: qcow2 disk version 3 size 10737418240 end 4609212416 snap 0
pic_set_elcr: setting level triggered mode for irq 7
run_vm: starting vcpu threads for vm ansible01
vcpu_reset: resetting vcpu 0 for vm 4
run_vm: waiting on events for VM ansible01
ansible01: received tap addr fe:e1:ba:d4:a9:b0 for nic 0
vcpu_exit_fw_cfg: selector 0x0000
vcpu_exit_fw_cfg: selector 0x0001
fw_cfg_handle_dma: selector 0x0019
fw_cfg_file_dir: file directory with 1 files
       4B 0020 etc/screen-and-debug
fw_cfg_handle_dma: selector 0x000d
fw_cfg_select: unhandled selector d
fw_cfg_handle_dma: selector 0x000f
fw_cfg_select: unhandled selector f
fw_cfg_handle_dma: selector 0x8000
fw_cfg_select: unhandled selector 8000
fw_cfg_handle_dma: selector 0x8001
fw_cfg_select: unhandled selector 8001
fw_cfg_handle_dma: selector 0x0019
fw_cfg_file_dir: file directory with 1 files
       4B 0020 etc/screen-and-debug
fw_cfg_handle_dma: selector 0x8003
fw_cfg_select: unhandled selector 8003
fw_cfg_handle_dma: selector 0x0004
i8259_write_datareg: master pic, reset IRQ vector to 0x8
i8259_write_datareg: slave pic, reset IRQ vector to 0x70
fw_cfg_handle_dma: selector 0x000f
fw_cfg_select: unhandled selector f
fw_cfg_handle_dma: selector 0x0005
fw_cfg_select: unhandled selector 5
vcpu_exit_i8253: channel 0 reset, mode=2, start=65535
fw_cfg_handle_dma: selector 0x0020
fw_cfg_select_file: accessing file etc/screen-and-debug
virtio_blk_io: device reset
vcpu_process_com_lcr: set baudrate = 115200 
SIOCAIFADDR: Device busy
vcpu_process_com_lcr: set baudrate = 115200 
vcpu_process_com_lcr: set baudrate = 115200 
vcpu_exit_i8253: channel 0 reset, mode=2, start=65535
vcpu_process_com_lcr: set baudrate = 115200 
i8259_write_datareg: master pic, reset IRQ vector to 0x20
i8259_write_datareg: slave pic, reset IRQ vector to 0x28
vcpu_exit_i8253: channel 0 reset, mode=2, start=11932
virtio_net_io: device reset
virtio_blk_io: device reset
vcpu_process_com_lcr: set baudrate = 115200 
vcpu_exit_i8253_misc: counter 2 clear, returning 0x0
vcpu_exit_i8253_misc: discarding data written to PIT misc port
vcpu_exit_i8253_misc: counter 2 clear, returning 0x0
vcpu_exit_i8253_misc: discarding data written to PIT misc port
vcpu_exit_i8253_misc: counter 2 clear, returning 0x0

My vm.conf:

ROOT="/home/vmm"
ramdisk="/bsd.rd"
sets="/home/www/mirror/pub/OpenBSD/snapshots/amd64/"

vm "ansible01" {
        disable
        memory 1024M
        disk $ROOT/ansible01.qcow2
        local interface { switch "uplink" }
        owner uwerler
}

switch "uplink" {
        interface veb0
}


Regards Uwe


-- 
wq: ~uw

Reply via email to