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
This commit is contained in:
parent
64ff0fd836
commit
158b68ec4a
@ -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 *sc)
|
||||
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",
|
||||
|
Loading…
Reference in New Issue
Block a user