From owner-p4-projects@FreeBSD.ORG Tue Jul 12 20:30:59 2005 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 15D7316A420; Tue, 12 Jul 2005 20:30:59 +0000 (GMT) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id DF4CC16A41C for ; Tue, 12 Jul 2005 20:30:58 +0000 (GMT) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id AF73743D49 for ; Tue, 12 Jul 2005 20:30:58 +0000 (GMT) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j6CKUwFx085171 for ; Tue, 12 Jul 2005 20:30:58 GMT (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j6CKUwAq085168 for perforce@freebsd.org; Tue, 12 Jul 2005 20:30:58 GMT (envelope-from peter@freebsd.org) Date: Tue, 12 Jul 2005 20:30:58 GMT Message-Id: <200507122030.j6CKUwAq085168@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm To: Perforce Change Reviews Cc: Subject: PERFORCE change 80051 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Jul 2005 20:30:59 -0000 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 #include +#ifdef NODMAP +#include +#include +#endif #include @@ -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); }