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 <[email protected]>
> + *
> + * 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 <[email protected]>
> + *
> + * 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
[email protected]:/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