On Friday, September 24, 2010 9:00:44 pm Neel Natu wrote: > Hi, > > This patch fixes the bogus error message from bus_dmamem_alloc() about > the buffer not being aligned properly. > > The problem is that the check is against a virtual address as opposed > to the physical address. contigmalloc() makes guarantees about > the alignment of physical addresses but not the virtual address > mapping it. > > Any objections if I commit this patch?
Hmmm, I guess you are doing super-page alignment rather than sub-page alignment? In general I thought the busdma code only handled sub-page alignment and doesn't fully handle requests for super-page alignment. For example, since it insists on walking individual pages at a time, if you had an alignment setting of 4 pages and passed in a single, aligned 4-page buffer, bus_dma would actually bounce the last 3 pages so that each individual page is 4-page aligned. At least, I think that is what would happen. For sub-page alignment, the virtual and physical address alignments should be the same. > best > Neel > > Index: sys/powerpc/powerpc/busdma_machdep.c > =================================================================== > --- sys/powerpc/powerpc/busdma_machdep.c (revision 213113) > +++ sys/powerpc/powerpc/busdma_machdep.c (working copy) > @@ -529,7 +529,7 @@ > CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", > __func__, dmat, dmat->flags, ENOMEM); > return (ENOMEM); > - } else if ((uintptr_t)*vaddr & (dmat->alignment - 1)) { > + } else if (vtophys(*vaddr) & (dmat->alignment - 1)) { > printf("bus_dmamem_alloc failed to align memory properly.\n"); > } > #ifdef NOTYET > Index: sys/sparc64/sparc64/bus_machdep.c > =================================================================== > --- sys/sparc64/sparc64/bus_machdep.c (revision 213113) > +++ sys/sparc64/sparc64/bus_machdep.c (working copy) > @@ -652,7 +652,7 @@ > } > if (*vaddr == NULL) > return (ENOMEM); > - if ((uintptr_t)*vaddr % dmat->dt_alignment) > + if (vtophys(*vaddr) % dmat->dt_alignment) > printf("%s: failed to align memory properly.\n", __func__); > return (0); > } > Index: sys/ia64/ia64/busdma_machdep.c > =================================================================== > --- sys/ia64/ia64/busdma_machdep.c (revision 213113) > +++ sys/ia64/ia64/busdma_machdep.c (working copy) > @@ -455,7 +455,7 @@ > } > if (*vaddr == NULL) > return (ENOMEM); > - else if ((uintptr_t)*vaddr & (dmat->alignment - 1)) > + else if (vtophys(*vaddr) & (dmat->alignment - 1)) > printf("bus_dmamem_alloc failed to align memory properly.\n"); > return (0); > } > Index: sys/i386/i386/busdma_machdep.c > =================================================================== > --- sys/i386/i386/busdma_machdep.c (revision 213113) > +++ sys/i386/i386/busdma_machdep.c (working copy) > @@ -540,7 +540,7 @@ > CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", > __func__, dmat, dmat->flags, ENOMEM); > return (ENOMEM); > - } else if ((uintptr_t)*vaddr & (dmat->alignment - 1)) { > + } else if (vtophys(*vaddr) & (dmat->alignment - 1)) { > printf("bus_dmamem_alloc failed to align memory properly.\n"); > } > if (flags & BUS_DMA_NOCACHE) > Index: sys/amd64/amd64/busdma_machdep.c > =================================================================== > --- sys/amd64/amd64/busdma_machdep.c (revision 213113) > +++ sys/amd64/amd64/busdma_machdep.c (working copy) > @@ -526,7 +526,7 @@ > CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", > __func__, dmat, dmat->flags, ENOMEM); > return (ENOMEM); > - } else if ((uintptr_t)*vaddr & (dmat->alignment - 1)) { > + } else if (vtophys(*vaddr) & (dmat->alignment - 1)) { > printf("bus_dmamem_alloc failed to align memory properly.\n"); > } > if (flags & BUS_DMA_NOCACHE) > _______________________________________________ > freebsd-hackers@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-hackers > To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org" > -- John Baldwin _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"