Date: Fri, 7 Dec 2012 06:34:20 +0000 (UTC) From: Jeff Roberson <jeff@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r243973 - in projects/physbio/sys: arm/arm ia64/ia64 powerpc/powerpc sparc64/sparc64 x86/x86 Message-ID: <201212070634.qB76YKu1035425@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jeff Date: Fri Dec 7 06:34:20 2012 New Revision: 243973 URL: http://svnweb.freebsd.org/changeset/base/243973 Log: - Normalize load_buffer() address space handling by always requiring a valid pmap pointer. Sponsored by: EMC / Isilon Storage Division Modified: projects/physbio/sys/arm/arm/busdma_machdep-v6.c projects/physbio/sys/arm/arm/busdma_machdep.c projects/physbio/sys/ia64/ia64/busdma_machdep.c projects/physbio/sys/powerpc/powerpc/busdma_machdep.c projects/physbio/sys/sparc64/sparc64/bus_machdep.c projects/physbio/sys/sparc64/sparc64/iommu.c projects/physbio/sys/x86/x86/busdma_machdep.c Modified: projects/physbio/sys/arm/arm/busdma_machdep-v6.c ============================================================================== --- projects/physbio/sys/arm/arm/busdma_machdep-v6.c Fri Dec 7 06:05:34 2012 (r243972) +++ projects/physbio/sys/arm/arm/busdma_machdep-v6.c Fri Dec 7 06:34:20 2012 (r243973) @@ -669,7 +669,7 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm vendaddr = (vm_offset_t)buf + buflen; while (vaddr < vendaddr) { - if (__predict_true(map->pmap == pmap_kernel())) + if (__predict_true(map->pmap == kernel_pmap)) paddr = pmap_kextract(vaddr); else paddr = pmap_extract(map->pmap, vaddr); @@ -718,6 +718,7 @@ static __inline int _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, bus_size_t buflen, + pmap_t pmap, int flags, bus_dma_segment_t *segs, int *segp) @@ -737,12 +738,13 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm sl = NULL; vaddr = (vm_offset_t)buf; bmask = ~(dmat->boundary - 1); + map->pmap = pmap; for (seg = *segp; buflen > 0 ; ) { /* * Get the physical address for this segment. */ - if (__predict_true(map->pmap == pmap_kernel())) + if (__predict_true(map->pmap == kernel_pmap)) curaddr = pmap_kextract(vaddr); else curaddr = pmap_extract(map->pmap, vaddr); @@ -848,10 +850,9 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_ flags |= BUS_DMA_WAITOK; map->callback = callback; map->callback_arg = callback_arg; - map->pmap = kernel_pmap; - error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, flags, - dmat->segments, &nsegs); + error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, kernel_pmap, + flags, dmat->segments, &nsegs); CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", __func__, dmat, dmat->flags, error, nsegs + 1); @@ -887,7 +888,6 @@ _bus_dmamap_load_mbuf_sg(bus_dma_tag_t d int error; M_ASSERTPKTHDR(m0); - map->pmap = kernel_pmap; flags |= BUS_DMA_NOWAIT; *nsegs = -1; @@ -899,7 +899,8 @@ _bus_dmamap_load_mbuf_sg(bus_dma_tag_t d if (m->m_len > 0) { error = _bus_dmamap_load_buffer(dmat, map, m->m_data, m->m_len, - flags, segs, nsegs); + kernel_pmap, flags, segs, + nsegs); } } } else { @@ -957,6 +958,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, int nsegs, error, i; bus_size_t resid; struct iovec *iov; + pmap_t pmap; flags |= BUS_DMA_NOWAIT; resid = uio->uio_resid; @@ -965,9 +967,9 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, if (uio->uio_segflg == UIO_USERSPACE) { KASSERT(uio->uio_td != NULL, ("bus_dmamap_load_uio: USERSPACE but no proc")); - map->pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace); + pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace); } else - map->pmap = kernel_pmap; + pmap = kernel_pmap; nsegs = -1; error = 0; @@ -982,7 +984,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, if (minlen > 0) { error = _bus_dmamap_load_buffer(dmat, map, - addr, minlen, flags, + addr, minlen, pmap, flags, dmat->segments, &nsegs); resid -= minlen; } Modified: projects/physbio/sys/arm/arm/busdma_machdep.c ============================================================================== --- projects/physbio/sys/arm/arm/busdma_machdep.c Fri Dec 7 06:05:34 2012 (r243972) +++ projects/physbio/sys/arm/arm/busdma_machdep.c Fri Dec 7 06:34:20 2012 (r243973) @@ -710,7 +710,7 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm vendaddr = (vm_offset_t)buf + buflen; while (vaddr < vendaddr) { - if (__predict_true(pmap == pmap_kernel())) + if (__predict_true(pmap == kernel_pmap)) paddr = pmap_kextract(vaddr); else paddr = pmap_extract(pmap, vaddr); @@ -781,7 +781,7 @@ bus_dmamap_load_buffer(bus_dma_tag_t dma * XXX Don't support checking for coherent mappings * XXX in user address space. */ - if (__predict_true(pmap == pmap_kernel())) { + if (__predict_true(pmap == kernel_pmap)) { if (pmap_get_pde_pte(pmap, vaddr, &pde, &ptep) == FALSE) return (EFAULT); @@ -951,7 +951,7 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, if (m->m_len > 0) { error = bus_dmamap_load_buffer(dmat, dmat->segments, map, m->m_data, m->m_len, - pmap_kernel(), flags, &nsegs); + kernel_pmap, flags, &nsegs); map->len += m->m_len; } } @@ -995,7 +995,7 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm if (m->m_len > 0) { error = bus_dmamap_load_buffer(dmat, segs, map, m->m_data, m->m_len, - pmap_kernel(), flags, + kernel_pmap, flags, nsegs); map->len += m->m_len; } Modified: projects/physbio/sys/ia64/ia64/busdma_machdep.c ============================================================================== --- projects/physbio/sys/ia64/ia64/busdma_machdep.c Fri Dec 7 06:05:34 2012 (r243972) +++ projects/physbio/sys/ia64/ia64/busdma_machdep.c Fri Dec 7 06:34:20 2012 (r243973) @@ -486,7 +486,7 @@ bus_dmamem_free(bus_dma_tag_t dmat, void */ static int _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, - bus_size_t buflen, struct thread *td, int flags, + bus_size_t buflen, pmap_t pmap, int flags, bus_dma_segment_t *segs, int *segp) { bus_size_t sgsize; @@ -494,16 +494,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm vm_offset_t vaddr; bus_addr_t paddr; int seg; - pmap_t pmap; if (map == NULL) map = &nobounce_dmamap; - if (td != NULL) - pmap = vmspace_pmap(td->td_proc->p_vmspace); - else - pmap = NULL; - if ((dmat->lowaddr < paddr_max || dmat->boundary > 0 || dmat->alignment > 1) && map != &nobounce_dmamap && map->pagesneeded == 0) { @@ -517,10 +511,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm vendaddr = (vm_offset_t)buf + buflen; while (vaddr < vendaddr) { - if (pmap != NULL) - paddr = pmap_extract(pmap, vaddr); - else + if (pmap == kernel_pmap) paddr = pmap_kextract(vaddr); + else + paddr = pmap_extract(pmap, vaddr); if (run_filter(dmat, paddr, 0) != 0) map->pagesneeded++; vaddr += PAGE_SIZE; @@ -558,10 +552,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm /* * Get the physical address for this segment. */ - if (pmap) - curaddr = pmap_extract(pmap, vaddr); - else + if (pmap == kernel_pmap) curaddr = pmap_kextract(vaddr); + else + curaddr = pmap_extract(pmap, vaddr); /* * Compute the segment size, and adjust counts. @@ -634,8 +628,8 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_ map->callback_arg = callback_arg; } - error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags, - dmat->segments, &nsegs); + error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, kernel_pmap, + flags, dmat->segments, &nsegs); if (error == EINPROGRESS) return (error); @@ -668,7 +662,7 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, for (m = m0; m != NULL && error == 0; m = m->m_next) { if (m->m_len > 0) { error = _bus_dmamap_load_buffer(dmat, map, - m->m_data, m->m_len, NULL, flags, + m->m_data, m->m_len, kernel_pmap, flags, dmat->segments, &nsegs); } } @@ -703,7 +697,7 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm for (m = m0; m != NULL && error == 0; m = m->m_next) { if (m->m_len > 0) { error = _bus_dmamap_load_buffer(dmat, map, - m->m_data, m->m_len, NULL, flags, + m->m_data, m->m_len, kernel_pmap, flags, segs, nsegs); } } @@ -725,17 +719,18 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, int nsegs, error, i; bus_size_t resid; struct iovec *iov; - struct thread *td = NULL; + pmap_t pmap; flags |= BUS_DMA_NOWAIT; resid = uio->uio_resid; iov = uio->uio_iov; if (uio->uio_segflg == UIO_USERSPACE) { - td = uio->uio_td; + pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace); KASSERT(td != NULL, ("bus_dmamap_load_uio: USERSPACE but no proc")); - } + } else + pmap = kernel_pmap; nsegs = -1; error = 0; Modified: projects/physbio/sys/powerpc/powerpc/busdma_machdep.c ============================================================================== --- projects/physbio/sys/powerpc/powerpc/busdma_machdep.c Fri Dec 7 06:05:34 2012 (r243972) +++ projects/physbio/sys/powerpc/powerpc/busdma_machdep.c Fri Dec 7 06:34:20 2012 (r243973) @@ -601,10 +601,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm bus_size_t sg_len; sg_len = PAGE_SIZE - ((vm_offset_t)vaddr & PAGE_MASK); - if (pmap) - paddr = pmap_extract(pmap, vaddr); - else + if (pmap == kernel_pmap) paddr = pmap_kextract(vaddr); + else + paddr = pmap_extract(pmap, vaddr); if (run_filter(dmat, paddr) != 0) { sg_len = roundup2(sg_len, dmat->alignment); map->pagesneeded++; @@ -646,10 +646,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm /* * Get the physical address for this segment. */ - if (pmap) - curaddr = pmap_extract(pmap, vaddr); - else + if (pmap == kernel_pmap) curaddr = pmap_kextract(vaddr); + else + curaddr = pmap_extract(pmap, vaddr); /* * Compute the segment size, and adjust counts. @@ -724,8 +724,8 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_ } map->nsegs = -1; - error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags, - map->segments, &map->nsegs); + error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, kernel_pmap, + flags, map->segments, &map->nsegs); map->nsegs++; CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", @@ -779,7 +779,7 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, if (m->m_len > 0) { error = _bus_dmamap_load_buffer(dmat, map, m->m_data, m->m_len, - NULL, flags, + kernel_pmap, flags, map->segments, &map->nsegs); } } @@ -824,7 +824,7 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm if (m->m_len > 0) { error = _bus_dmamap_load_buffer(dmat, map, m->m_data, m->m_len, - NULL, flags, + kernel_pmap, flags, segs, nsegs); } } @@ -871,7 +871,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, ("bus_dmamap_load_uio: USERSPACE but no proc")); pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace); } else - pmap = NULL; + pmap = kernel_pmap; map->nsegs = -1; error = 0; Modified: projects/physbio/sys/sparc64/sparc64/bus_machdep.c ============================================================================== --- projects/physbio/sys/sparc64/sparc64/bus_machdep.c Fri Dec 7 06:05:34 2012 (r243972) +++ projects/physbio/sys/sparc64/sparc64/bus_machdep.c Fri Dec 7 06:34:20 2012 (r243973) @@ -331,19 +331,13 @@ nexus_dmamap_destroy(bus_dma_tag_t dmat, */ static int _nexus_dmamap_load_buffer(bus_dma_tag_t dmat, void *buf, bus_size_t buflen, - struct thread *td, int flags, + pmap_t pmap, int flags, bus_dma_segment_t *segs, int *segp) { bus_size_t sgsize; bus_addr_t curaddr, baddr, bmask; vm_offset_t vaddr = (vm_offset_t)buf; int seg; - pmap_t pmap; - - if (td != NULL) - pmap = vmspace_pmap(td->td_proc->p_vmspace); - else - pmap = NULL; bmask = ~(dmat->dt_boundary - 1); @@ -351,10 +345,10 @@ _nexus_dmamap_load_buffer(bus_dma_tag_t /* * Get the physical address for this segment. */ - if (pmap) - curaddr = pmap_extract(pmap, vaddr); - else + if (pmap == kernel_pmap) curaddr = pmap_kextract(vaddr); + else + curaddr = pmap_extract(pmap, vaddr); /* * Compute the segment size, and adjust counts. @@ -426,8 +420,8 @@ nexus_dmamap_load(bus_dma_tag_t dmat, bu int error, nsegs; nsegs = -1; - error = _nexus_dmamap_load_buffer(dmat, buf, buflen, NULL, flags, - dmat->dt_segments, &nsegs); + error = _nexus_dmamap_load_buffer(dmat, buf, buflen, kernel_pmap, + flags, dmat->dt_segments, &nsegs); if (error == 0) { (*callback)(callback_arg, dmat->dt_segments, nsegs + 1, 0); @@ -457,7 +451,7 @@ nexus_dmamap_load_mbuf(bus_dma_tag_t dma for (m = m0; m != NULL && error == 0; m = m->m_next) { if (m->m_len > 0) { error = _nexus_dmamap_load_buffer(dmat, - m->m_data, m->m_len,NULL, flags, + m->m_data, m->m_len, kernel_pmap, flags, dmat->dt_segments, &nsegs); } } @@ -492,7 +486,7 @@ nexus_dmamap_load_mbuf_sg(bus_dma_tag_t for (m = m0; m != NULL && error == 0; m = m->m_next) { if (m->m_len > 0) { error = _nexus_dmamap_load_buffer(dmat, - m->m_data, m->m_len, NULL, flags, + m->m_data, m->m_len, kernel_pmap, flags, segs, nsegs); } } @@ -514,15 +508,15 @@ nexus_dmamap_load_uio(bus_dma_tag_t dmat int nsegs, error, i; bus_size_t resid; struct iovec *iov; - struct thread *td = NULL; + pmap_t pmap; resid = uio->uio_resid; iov = uio->uio_iov; if (uio->uio_segflg == UIO_USERSPACE) { - td = uio->uio_td; - KASSERT(td != NULL, ("%s: USERSPACE but no proc", __func__)); - } + pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace); + } else + pmap = kernel_pmap; nsegs = -1; error = 0; @@ -537,7 +531,7 @@ nexus_dmamap_load_uio(bus_dma_tag_t dmat if (minlen > 0) { error = _nexus_dmamap_load_buffer(dmat, addr, minlen, - td, flags, dmat->dt_segments, &nsegs); + pmap, flags, dmat->dt_segments, &nsegs); resid -= minlen; } } Modified: projects/physbio/sys/sparc64/sparc64/iommu.c ============================================================================== --- projects/physbio/sys/sparc64/sparc64/iommu.c Fri Dec 7 06:05:34 2012 (r243972) +++ projects/physbio/sys/sparc64/sparc64/iommu.c Fri Dec 7 06:34:20 2012 (r243973) @@ -851,14 +851,13 @@ iommu_dvmamap_destroy(bus_dma_tag_t dt, */ static int iommu_dvmamap_load_buffer(bus_dma_tag_t dt, struct iommu_state *is, - bus_dmamap_t map, void *buf, bus_size_t buflen, struct thread *td, + bus_dmamap_t map, void *buf, bus_size_t buflen, pmap_t pmap, int flags, bus_dma_segment_t *segs, int *segp) { bus_addr_t amask, dvmaddr, dvmoffs; bus_size_t sgsize, esize; vm_offset_t vaddr, voffs; vm_paddr_t curaddr; - pmap_t pmap = NULL; int error, firstpg, sgcnt; u_int slot; @@ -866,9 +865,6 @@ iommu_dvmamap_load_buffer(bus_dma_tag_t if (buflen > dt->dt_maxsize) return (EINVAL); - if (td != NULL) - pmap = vmspace_pmap(td->td_proc->p_vmspace); - vaddr = (vm_offset_t)buf; voffs = vaddr & IO_PAGE_MASK; amask = (*segp == -1) ? dt->dt_alignment - 1 : 0; @@ -888,10 +884,10 @@ iommu_dvmamap_load_buffer(bus_dma_tag_t /* * Get the physical address for this page. */ - if (pmap != NULL) - curaddr = pmap_extract(pmap, vaddr); - else + if (pmap == kernel_pmap) curaddr = pmap_kextract(vaddr); + else + curaddr = pmap_extract(pmap, vaddr); /* * Compute the segment size, and adjust counts. @@ -973,8 +969,8 @@ iommu_dvmamap_load(bus_dma_tag_t dt, bus iommu_map_remq(is, map); IS_UNLOCK(is); - error = iommu_dvmamap_load_buffer(dt, is, map, buf, buflen, NULL, - flags, dt->dt_segments, &seg); + error = iommu_dvmamap_load_buffer(dt, is, map, buf, buflen, + kernel_pmap, flags, dt->dt_segments, &seg); IS_LOCK(is); iommu_map_insq(is, map); @@ -1017,8 +1013,8 @@ iommu_dvmamap_load_mbuf(bus_dma_tag_t dt if (m->m_len == 0) continue; error = iommu_dvmamap_load_buffer(dt, is, map, - m->m_data, m->m_len, NULL, flags, dt->dt_segments, - &nsegs); + m->m_data, m->m_len, kernel_pmap, flags, + dt->dt_segments, &nsegs); } } else error = EINVAL; @@ -1065,7 +1061,7 @@ iommu_dvmamap_load_mbuf_sg(bus_dma_tag_t if (m->m_len == 0) continue; error = iommu_dvmamap_load_buffer(dt, is, map, - m->m_data, m->m_len, NULL, flags, segs, + m->m_data, m->m_len, kernel_pmap, flags, segs, nsegs); } } else @@ -1093,6 +1089,7 @@ iommu_dvmamap_load_uio(bus_dma_tag_t dt, struct thread *td = NULL; bus_size_t minlen, resid; int nsegs = -1, error = 0, i; + pmap-t pmap; if ((map->dm_flags & DMF_LOADED) != 0) { #ifdef DIAGNOSTIC @@ -1110,9 +1107,11 @@ iommu_dvmamap_load_uio(bus_dma_tag_t dt, if (uio->uio_segflg == UIO_USERSPACE) { td = uio->uio_td; - KASSERT(td != NULL, + KASSERT(uio->uio_td != NULL, ("%s: USERSPACE but no proc", __func__)); - } + pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace); + } else + pmap = kernel_pmap; for (i = 0; i < uio->uio_iovcnt && resid != 0 && error == 0; i++) { /* @@ -1124,7 +1123,7 @@ iommu_dvmamap_load_uio(bus_dma_tag_t dt, continue; error = iommu_dvmamap_load_buffer(dt, is, map, - iov[i].iov_base, minlen, td, flags, dt->dt_segments, + iov[i].iov_base, minlen, pmap, flags, dt->dt_segments, &nsegs); resid -= minlen; } Modified: projects/physbio/sys/x86/x86/busdma_machdep.c ============================================================================== --- projects/physbio/sys/x86/x86/busdma_machdep.c Fri Dec 7 06:05:34 2012 (r243972) +++ projects/physbio/sys/x86/x86/busdma_machdep.c Fri Dec 7 06:34:20 2012 (r243973) @@ -604,10 +604,10 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm bus_size_t sg_len; sg_len = PAGE_SIZE - ((vm_offset_t)vaddr & PAGE_MASK); - if (pmap) - paddr = pmap_extract(pmap, vaddr); - else + if (pmap == kernel_pmap) paddr = pmap_kextract(vaddr); + else + paddr = pmap_extract(pmap, vaddr); if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && run_filter(dmat, paddr) != 0) { sg_len = roundup2(sg_len, dmat->alignment); @@ -680,10 +680,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm /* * Get the physical address for this segment. */ - if (pmap) - curaddr = pmap_extract(pmap, vaddr); - else + if (pmap == kernel_pmap) curaddr = pmap_kextract(vaddr); + else + curaddr = pmap_extract(pmap, vaddr); /* * Compute the segment size, and adjust counts. @@ -758,8 +758,8 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_ map->callback_arg = callback_arg; } - error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags, - dmat->segments, &nsegs); + error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, kernel_pmap, + flags, dmat->segments, &nsegs); CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", __func__, dmat, dmat->flags, error, nsegs + 1); @@ -806,7 +806,7 @@ _bus_dmamap_load_mbuf_sg(bus_dma_tag_t d if (m->m_len > 0) { error = _bus_dmamap_load_buffer(dmat, map, m->m_data, m->m_len, - NULL, flags, + kernel_pmap, flags, segs, nsegs); } } @@ -875,7 +875,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, ("bus_dmamap_load_uio: USERSPACE but no proc")); pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace); } else - pmap = NULL; + pmap = kernel_pmap; nsegs = -1; error = 0;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212070634.qB76YKu1035425>