On Sat, 23 Sep 2023 15:38:40 +0300 Vitaliy Makkoveev <m...@openbsd.org> wrote: > This makes ifnet protection consistent. Execute vmt_tclo_tick() timeout > handler in process context to allow context switch within > vmt_tclo_broadcastip().
ok yasuoka > Index: sys/dev/pv/vmt.c > =================================================================== > RCS file: /cvs/src/sys/dev/pv/vmt.c,v > retrieving revision 1.30 > diff -u -p -r1.30 vmt.c > --- sys/dev/pv/vmt.c 7 Jan 2023 06:40:21 -0000 1.30 > +++ sys/dev/pv/vmt.c 23 Sep 2023 12:15:27 -0000 > @@ -471,7 +471,7 @@ vmt_attach(struct device *parent, struct > > config_mountroot(self, vmt_tick_hook); > > - timeout_set(&sc->sc_tclo_tick, vmt_tclo_tick, sc); > + timeout_set_proc(&sc->sc_tclo_tick, vmt_tclo_tick, sc); > timeout_add_sec(&sc->sc_tclo_tick, 1); > sc->sc_tclo_ping = 1; > > @@ -899,9 +899,12 @@ vmt_tclo_broadcastip(struct vmt_softc *s > { > struct ifnet *iface; > struct sockaddr_in *guest_ip; > + char ip[INET_ADDRSTRLEN]; > > /* find first available ipv4 address */ > guest_ip = NULL; > + > + NET_LOCK_SHARED(); > TAILQ_FOREACH(iface, &ifnetlist, if_list) { > struct ifaddr *iface_addr; > > @@ -918,14 +921,14 @@ vmt_tclo_broadcastip(struct vmt_softc *s > continue; > > guest_ip = satosin(iface_addr->ifa_addr); > + inet_ntop(AF_INET, &guest_ip->sin_addr, ip, > + sizeof(ip)); > break; > } > } > + NET_UNLOCK_SHARED(); > > if (guest_ip != NULL) { > - char ip[INET_ADDRSTRLEN]; > - > - inet_ntop(AF_INET, &guest_ip->sin_addr, ip, sizeof(ip)); > if (vm_rpc_send_rpci_tx(sc, "info-set guestinfo.ip %s", > ip) != 0) { > DPRINTF("%s: unable to send guest IP address\n",