Date: Tue, 12 Jul 2005 20:30:58 GMT From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 80051 for review Message-ID: <200507122030.j6CKUwAq085168@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=80051 Change 80051 by peter@peter_overcee on 2005/07/12 20:30:33 Check in some WIP code that we're experimenting with (default off) at work to see if we're seeing a 4K/2M page alias problem when atomic ops are mixed in. This allows an expensive 4.x style temporary ephemeral mapping for each operation. Affected files ... .. //depot/projects/hammer/sys/amd64/amd64/uio_machdep.c#5 edit Differences ... ==== //depot/projects/hammer/sys/amd64/amd64/uio_machdep.c#5 (text+ko) ==== @@ -48,6 +48,10 @@ #include <vm/vm.h> #include <vm/vm_page.h> +#ifdef NODMAP +#include <vm/vm_extern.h> +#include <vm/vm_kern.h> +#endif #include <machine/vmparam.h> @@ -65,11 +69,17 @@ size_t cnt; int error = 0; int save = 0; +#ifdef NODMAP + vm_offset_t kva; +#endif KASSERT(uio->uio_rw == UIO_READ || uio->uio_rw == UIO_WRITE, ("uiomove_fromphys: mode")); KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == curthread, ("uiomove_fromphys proc")); +#ifdef NODMAP + kva = kmem_alloc_nofault(kernel_map, PAGE_SIZE); +#endif save = td->td_pflags & TDP_DEADLKTREAT; td->td_pflags |= TDP_DEADLKTREAT; while (n > 0 && uio->uio_resid) { @@ -84,8 +94,13 @@ cnt = n; page_offset = offset & PAGE_MASK; cnt = min(cnt, PAGE_SIZE - page_offset); +#ifdef NODMAP + pmap_kenter(kva, VM_PAGE_TO_PHYS(ma[offset >> PAGE_SHIFT])); + cp = (char *)kva + page_offset; +#else cp = (char *)PHYS_TO_DMAP(ma[offset >> PAGE_SHIFT]->phys_addr) + page_offset; +#endif switch (uio->uio_segflg) { case UIO_USERSPACE: if (ticks - PCPU_GET(switchticks) >= hogticks) @@ -106,6 +121,9 @@ case UIO_NOCOPY: break; } +#ifdef NODMAP + pmap_kremove(kva); +#endif iov->iov_base = (char *)iov->iov_base + cnt; iov->iov_len -= cnt; uio->uio_resid -= cnt; @@ -116,5 +134,8 @@ out: if (save == 0) td->td_pflags &= ~TDP_DEADLKTREAT; +#ifdef NODMAP + kmem_free(kernel_map, kva, PAGE_SIZE); +#endif return (error); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200507122030.j6CKUwAq085168>