svn commit: r302122 - stable/10/sys/dev/hyperv/vmbus
Sepherosa Ziehau
sephe at FreeBSD.org
Thu Jun 23 06:27:43 UTC 2016
Author: sephe
Date: Thu Jun 23 06:27:41 2016
New Revision: 302122
URL: https://svnweb.freebsd.org/changeset/base/302122
Log:
MFC 300576,300644
300576
hyperv/vmbus: Free message taskqueue during interrupt teardown
MFC after: 1 week
Sponsored by: Microsoft OSTC
Differential Revision: https://reviews.freebsd.org/D6506
300644
hyperv/vmbus: Check hyperv_dmamem_alloc return value
Though it is highly unlikely this function would fail w/ BUS_DMA_WAITOK,
we had better to check its return value; better safe then sorry here.
MFC after: 1 week
Sponsored by: Microsoft OSTC
Differential Revision: https://reviews.freebsd.org/D6518
Modified:
stable/10/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
==============================================================================
--- stable/10/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c Thu Jun 23 06:22:48 2016 (r302121)
+++ stable/10/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c Thu Jun 23 06:27:41 2016 (r302122)
@@ -321,24 +321,34 @@ vmbus_synic_teardown(void *arg)
wrmsr(HV_X64_MSR_SIEFP, siefp.as_uint64_t);
}
-static void
+static int
vmbus_dma_alloc(struct vmbus_softc *sc)
{
int cpu;
CPU_FOREACH(cpu) {
+ void *ptr;
+
/*
* Per-cpu messages and event flags.
*/
- VMBUS_PCPU_GET(sc, message, cpu) = hyperv_dmamem_alloc(
- bus_get_dma_tag(sc->vmbus_dev), PAGE_SIZE, 0, PAGE_SIZE,
+ ptr = hyperv_dmamem_alloc(bus_get_dma_tag(sc->vmbus_dev),
+ PAGE_SIZE, 0, PAGE_SIZE,
VMBUS_PCPU_PTR(sc, message_dma, cpu),
BUS_DMA_WAITOK | BUS_DMA_ZERO);
- VMBUS_PCPU_GET(sc, event_flag, cpu) = hyperv_dmamem_alloc(
- bus_get_dma_tag(sc->vmbus_dev), PAGE_SIZE, 0, PAGE_SIZE,
+ if (ptr == NULL)
+ return ENOMEM;
+ VMBUS_PCPU_GET(sc, message, cpu) = ptr;
+
+ ptr = hyperv_dmamem_alloc(bus_get_dma_tag(sc->vmbus_dev),
+ PAGE_SIZE, 0, PAGE_SIZE,
VMBUS_PCPU_PTR(sc, event_flag_dma, cpu),
BUS_DMA_WAITOK | BUS_DMA_ZERO);
+ if (ptr == NULL)
+ return ENOMEM;
+ VMBUS_PCPU_GET(sc, event_flag, cpu) = ptr;
}
+ return 0;
}
static void
@@ -517,6 +527,12 @@ vmbus_intr_teardown(struct vmbus_softc *
taskqueue_free(hv_vmbus_g_context.hv_event_queue[cpu]);
hv_vmbus_g_context.hv_event_queue[cpu] = NULL;
}
+ if (hv_vmbus_g_context.hv_msg_tq[cpu] != NULL) {
+ taskqueue_drain(hv_vmbus_g_context.hv_msg_tq[cpu],
+ &hv_vmbus_g_context.hv_msg_task[cpu]);
+ taskqueue_free(hv_vmbus_g_context.hv_msg_tq[cpu]);
+ hv_vmbus_g_context.hv_msg_tq[cpu] = NULL;
+ }
}
vmbus_vector_free(sc->vmbus_idtvec);
}
@@ -699,7 +715,9 @@ vmbus_bus_init(void)
/*
* Allocate DMA stuffs.
*/
- vmbus_dma_alloc(sc);
+ ret = vmbus_dma_alloc(sc);
+ if (ret != 0)
+ goto cleanup;
if (bootverbose)
printf("VMBUS: Calling smp_rendezvous, smp_started = %d\n",
More information about the svn-src-stable-10
mailing list