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(¤t_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