Without any later realloactions, size is taken from vdsk_dring_alloc(): struct vdisk_dring *vd; ... vd = malloc(sizeof(struct vdsk_dring), M_DEVBUF, M_NOWAIT);
Tested on T4-2 guest domains, altough that of course just means that allocating rings keeps working as before and the free routines are not actually called: vdsk0 at cbus0 chan 0x2: ivec 0x4, 0x5 scsibus1 at vdsk0: 1 targets vdsk1 at cbus0 chan 0x3: ivec 0x6, 0x7 scsibus2 at vdsk1: 1 targets vdsk2 at cbus0 chan 0x4: ivec 0x8, 0x9 scsibus3 at vdsk2: 1 targets vdsk3 at cbus0 chan 0x5: ivec 0xa, 0xb scsibus4 at vdsk3: 1 targets Feedback? OK? diff --git a/sys/arch/sparc64/dev/vdsk.c b/sys/arch/sparc64/dev/vdsk.c index 169bd8399..358e6b40e 100644 --- a/sys/arch/sparc64/dev/vdsk.c +++ b/sys/arch/sparc64/dev/vdsk.c @@ -883,7 +883,7 @@ vdsk_dring_free(bus_dma_tag_t t, struct vdsk_dring *vd) bus_dmamem_unmap(t, (caddr_t)vd->vd_desc, size); bus_dmamem_free(t, &vd->vd_seg, 1); bus_dmamap_destroy(t, vd->vd_map); - free(vd, M_DEVBUF, 0); + free(vd, M_DEVBUF, sizeof(*vd)); } void *