summaryrefslogtreecommitdiff
path: root/sys/dev/hyperv
diff options
context:
space:
mode:
authoryamaguchi <yamaguchi@NetBSD.org>2021-12-23 04:06:51 +0000
committeryamaguchi <yamaguchi@NetBSD.org>2021-12-23 04:06:51 +0000
commite166e806965eb2fd88a3729c7ddec8bdfc7d7af7 (patch)
tree8dba1add17d88019eaba3252b80be197a9d89806 /sys/dev/hyperv
parentb0e9d05fb6133db2b23e55f404fe3b3b93219bad (diff)
hyper-v: move idt vector allocating to vmbus_init_interrupts_md()
for refactoring And, the deallocating is also moved to vmbus_deinit_interrupts_md(). reviewed by nonaka@n.o.
Diffstat (limited to 'sys/dev/hyperv')
-rw-r--r--sys/dev/hyperv/hypervvar.h6
-rw-r--r--sys/dev/hyperv/vmbus.c50
2 files changed, 32 insertions, 24 deletions
diff --git a/sys/dev/hyperv/hypervvar.h b/sys/dev/hyperv/hypervvar.h
index 2ee80974be5..3c7eb420f8c 100644
--- a/sys/dev/hyperv/hypervvar.h
+++ b/sys/dev/hyperv/hypervvar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: hypervvar.h,v 1.4 2019/12/10 12:20:20 nonaka Exp $ */
+/* $NetBSD: hypervvar.h,v 1.5 2021/12/23 04:06:51 yamaguchi Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -68,8 +68,8 @@ void hyperv_intr(void);
uint32_t hyperv_get_vcpuid(cpuid_t);
struct vmbus_softc;
-void vmbus_init_interrupts_md(struct vmbus_softc *);
-void vmbus_deinit_interrupts_md(struct vmbus_softc *);
+void vmbus_init_interrupts_md(struct vmbus_softc *, cpuid_t);
+void vmbus_deinit_interrupts_md(struct vmbus_softc *, cpuid_t);
void vmbus_init_synic_md(struct vmbus_softc *, cpuid_t);
void vmbus_deinit_synic_md(struct vmbus_softc *, cpuid_t);
diff --git a/sys/dev/hyperv/vmbus.c b/sys/dev/hyperv/vmbus.c
index 2605c13fb69..6c7e79131ed 100644
--- a/sys/dev/hyperv/vmbus.c
+++ b/sys/dev/hyperv/vmbus.c
@@ -1,4 +1,4 @@
-/* $NetBSD: vmbus.c,v 1.14 2021/08/07 16:19:11 thorpej Exp $ */
+/* $NetBSD: vmbus.c,v 1.15 2021/12/23 04:06:51 yamaguchi Exp $ */
/* $OpenBSD: hyperv.c,v 1.43 2017/06/27 13:56:15 mikeb Exp $ */
/*-
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vmbus.c,v 1.14 2021/08/07 16:19:11 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vmbus.c,v 1.15 2021/12/23 04:06:51 yamaguchi Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -68,8 +68,8 @@ static int vmbus_alloc_dma(struct vmbus_softc *);
static void vmbus_free_dma(struct vmbus_softc *);
static int vmbus_init_interrupts(struct vmbus_softc *);
static void vmbus_deinit_interrupts(struct vmbus_softc *);
-static void vmbus_init_synic(void *, void *);
-static void vmbus_deinit_synic(void *, void *);
+static void vmbus_init_interrupts_pcpu(void *, void *);
+static void vmbus_deinit_interrupts_pcpu(void *, void *);
static int vmbus_connect(struct vmbus_softc *);
static int vmbus_cmd(struct vmbus_softc *, void *, size_t, void *, size_t,
@@ -313,8 +313,11 @@ static void
vmbus_attach_deferred(device_t self)
{
struct vmbus_softc *sc = device_private(self);
+ uint64_t xc;
- xc_wait(xc_broadcast(0, vmbus_init_synic, sc, NULL));
+ xc = xc_broadcast(0, vmbus_init_interrupts_pcpu,
+ sc, NULL);
+ xc_wait(xc);
}
int
@@ -404,6 +407,7 @@ vmbus_free_dma(struct vmbus_softc *sc)
static int
vmbus_init_interrupts(struct vmbus_softc *sc)
{
+ uint64_t xc;
TAILQ_INIT(&sc->sc_reqs);
mutex_init(&sc->sc_req_lock, MUTEX_DEFAULT, IPL_NET);
@@ -420,14 +424,15 @@ vmbus_init_interrupts(struct vmbus_softc *sc)
if (sc->sc_msg_sih == NULL)
return -1;
- vmbus_init_interrupts_md(sc);
-
kcpuset_create(&sc->sc_intr_cpuset, true);
if (cold) {
/* Initialize other CPUs later. */
- vmbus_init_synic(sc, NULL);
- } else
- xc_wait(xc_broadcast(0, vmbus_init_synic, sc, NULL));
+ vmbus_init_interrupts_pcpu(sc, NULL);
+ } else {
+ xc = xc_broadcast(0, vmbus_init_interrupts_pcpu,
+ sc, NULL);
+ xc_wait(xc);
+ }
atomic_or_32(&sc->sc_flags, VMBUS_SCFLAG_SYNIC);
return 0;
@@ -436,14 +441,16 @@ vmbus_init_interrupts(struct vmbus_softc *sc)
static void
vmbus_deinit_interrupts(struct vmbus_softc *sc)
{
+ uint64_t xc;
- if (ISSET(sc->sc_flags, VMBUS_SCFLAG_SYNIC)) {
- if (cold)
- vmbus_deinit_synic(sc, NULL);
- else
- xc_wait(xc_broadcast(0, vmbus_deinit_synic, sc, NULL));
- atomic_and_32(&sc->sc_flags, (uint32_t)~VMBUS_SCFLAG_SYNIC);
+ if (cold) {
+ vmbus_deinit_interrupts_pcpu(sc, NULL);
+ } else {
+ xc = xc_broadcast(0, vmbus_deinit_interrupts_pcpu,
+ sc, NULL);
+ xc_wait(xc);
}
+ atomic_and_32(&sc->sc_flags, (uint32_t)~VMBUS_SCFLAG_SYNIC);
/* XXX event_tq */
@@ -451,12 +458,10 @@ vmbus_deinit_interrupts(struct vmbus_softc *sc)
softint_disestablish(sc->sc_msg_sih);
sc->sc_msg_sih = NULL;
}
-
- vmbus_deinit_interrupts_md(sc);
}
static void
-vmbus_init_synic(void *arg1, void *arg2)
+vmbus_init_interrupts_pcpu(void *arg1, void *arg2 __unused)
{
struct vmbus_softc *sc = arg1;
cpuid_t cpu;
@@ -467,6 +472,7 @@ vmbus_init_synic(void *arg1, void *arg2)
cpu = cpu_index(curcpu());
if (!kcpuset_isset(sc->sc_intr_cpuset, cpu)) {
kcpuset_atomic_set(sc->sc_intr_cpuset, cpu);
+ vmbus_init_interrupts_md(sc, cpu);
vmbus_init_synic_md(sc, cpu);
}
@@ -474,7 +480,7 @@ vmbus_init_synic(void *arg1, void *arg2)
}
static void
-vmbus_deinit_synic(void *arg1, void *arg2)
+vmbus_deinit_interrupts_pcpu(void *arg1, void *arg2 __unused)
{
struct vmbus_softc *sc = arg1;
cpuid_t cpu;
@@ -484,7 +490,9 @@ vmbus_deinit_synic(void *arg1, void *arg2)
cpu = cpu_index(curcpu());
if (kcpuset_isset(sc->sc_intr_cpuset, cpu)) {
- vmbus_deinit_synic_md(sc, cpu);
+ if (ISSET(sc->sc_flags, VMBUS_SCFLAG_SYNIC))
+ vmbus_deinit_synic_md(sc, cpu);
+ vmbus_deinit_interrupts_md(sc, cpu);
kcpuset_atomic_clear(sc->sc_intr_cpuset, cpu);
}