Author: jhibbits
Date: Wed Nov 16 05:24:42 2016
New Revision: 308718
URL: https://svnweb.freebsd.org/changeset/base/308718

Log:
  Simplify the page tracking for VA<->PA translations.
  
  Drop the tracking down to the pmap layer, with optimizations to only track
  necessary pages.  This should give a (slight) performance improvement, as well
  as a stability improvement, as the tracking is already mostly handled by the
  pmap layer.

Modified:
  head/sys/contrib/ncsw/inc/xx_ext.h
  head/sys/contrib/ncsw/user/env/xx.c
  head/sys/dev/dpaa/fman.c
  head/sys/dev/dpaa/if_dtsec.c
  head/sys/dev/dpaa/if_dtsec_rm.c
  head/sys/powerpc/booke/pmap.c
  head/sys/powerpc/include/pmap.h
  head/sys/powerpc/mpc85xx/mpc85xx.h
  head/sys/powerpc/mpc85xx/platform_mpc85xx.c

Modified: head/sys/contrib/ncsw/inc/xx_ext.h
==============================================================================
--- head/sys/contrib/ncsw/inc/xx_ext.h  Wed Nov 16 03:54:41 2016        
(r308717)
+++ head/sys/contrib/ncsw/inc/xx_ext.h  Wed Nov 16 05:24:42 2016        
(r308718)
@@ -930,9 +930,4 @@ t_Error XX_IpcSendMessage(t_Handle      
 /** @} */ /* end of xx_ipc group */
 /** @} */ /* end of xx_id group */
 
-/** FreeBSD Specific additions. */
-void XX_TrackInit(void);
-physAddress_t  XX_TrackAddress(void *addr);
-void XX_UntrackAddress(void *addr);
-
 #endif /* __XX_EXT_H */

Modified: head/sys/contrib/ncsw/user/env/xx.c
==============================================================================
--- head/sys/contrib/ncsw/user/env/xx.c Wed Nov 16 03:54:41 2016        
(r308717)
+++ head/sys/contrib/ncsw/user/env/xx.c Wed Nov 16 05:24:42 2016        
(r308718)
@@ -51,6 +51,7 @@
 #include <dev/dpaa/qman.h>
 #include <dev/dpaa/portals.h>
 
+#include <powerpc/mpc85xx/mpc85xx.h>
 #include "error_ext.h"
 #include "std_ext.h"
 #include "list_ext.h"
@@ -124,19 +125,6 @@ struct XX_PortalInfo {
 
 static struct XX_PortalInfo XX_PInfo;
 
-/* The lower 9 bits, through emprical testing, tend to be 0. */
-#define        XX_MALLOC_TRACK_SHIFT   9
-
-typedef struct XX_MallocTrackStruct {
-       LIST_ENTRY(XX_MallocTrackStruct) entries;
-       physAddress_t pa;
-       void *va;
-} XX_MallocTrackStruct;
-
-LIST_HEAD(XX_MallocTrackerList, XX_MallocTrackStruct) *XX_MallocTracker;
-u_long XX_MallocHashMask;
-static XX_MallocTrackStruct * XX_FindTracker(physAddress_t pa);
-
 void
 XX_Exit(int status)
 {
@@ -266,7 +254,6 @@ XX_FreeSmart(void *p)
        KASSERT(XX_MallocSmartMap[start] > 0,
            ("XX_FreeSmart: Double or mid-block free!\n"));
 
-       XX_UntrackAddress(p);
        /* Free region */
        slices = XX_MallocSmartMap[start];
        XX_MallocSmartMapClear(start, slices);
@@ -279,8 +266,6 @@ void
 XX_Free(void *p)
 {
 
-       if (p != NULL)
-               XX_UntrackAddress(p);
        free(p, M_NETCOMMSW);
 }
 
@@ -758,6 +743,11 @@ XX_VirtToPhys(void *addr)
        if (addr == NULL)
                return (-1);
 
+       /* Check CCSR */
+       if ((vm_offset_t)addr >= ccsrbar_va &&
+           (vm_offset_t)addr < ccsrbar_va + ccsrbar_size)
+               return (((vm_offset_t)addr - ccsrbar_va) + ccsrbar_pa);
+
        /* Handle BMAN mappings */
        if (((vm_offset_t)addr >= XX_PInfo.portal_ce_va[BM_PORTAL]) &&
            ((vm_offset_t)addr < XX_PInfo.portal_ce_va[BM_PORTAL] +
@@ -784,10 +774,12 @@ XX_VirtToPhys(void *addr)
                return (XX_PInfo.portal_ci_pa[QM_PORTAL][cpu] +
                    (vm_offset_t)addr - XX_PInfo.portal_ci_va[QM_PORTAL]);
 
-       paddr = XX_TrackAddress(addr);
-       if (paddr == -1)
+       paddr = pmap_kextract((vm_offset_t)addr);
+       if (paddr == 0)
                printf("NetCommSW: "
                    "Unable to translate virtual address 0x%08X!\n", addr);
+       else
+               pmap_track_page(kernel_pmap, (vm_offset_t)addr);
 
        return (paddr);
 }
@@ -795,9 +787,15 @@ XX_VirtToPhys(void *addr)
 void *
 XX_PhysToVirt(physAddress_t addr)
 {
-       XX_MallocTrackStruct *ts;
+       struct pv_entry *pv;
+       vm_page_t page;
        int cpu;
 
+       /* Check CCSR */
+       if (addr >= ccsrbar_pa && addr < ccsrbar_pa + ccsrbar_size)
+               return ((void *)((vm_offset_t)(addr - ccsrbar_pa) +
+                   ccsrbar_va));
+
        cpu = PCPU_GET(cpuid);
 
        /* Handle BMAN mappings */
@@ -826,12 +824,11 @@ XX_PhysToVirt(physAddress_t addr)
                return ((void *)(XX_PInfo.portal_ci_va[QM_PORTAL] +
                    (vm_offset_t)(addr - 
XX_PInfo.portal_ci_pa[QM_PORTAL][cpu])));
 
-       mtx_lock(&XX_MallocTrackLock);
-       ts = XX_FindTracker(addr);
-       mtx_unlock(&XX_MallocTrackLock);
+       page = PHYS_TO_VM_PAGE(addr);
+       pv = TAILQ_FIRST(&page->md.pv_list);
 
-       if (ts != NULL)
-               return ts->va;
+       if (pv != NULL)
+               return ((void *)(pv->pv_va + ((vm_offset_t)addr & PAGE_MASK)));
 
        printf("NetCommSW: "
            "Unable to translate physical address 0x%08llX!\n", addr);
@@ -877,72 +874,3 @@ XX_PortalSetInfo(device_t dev)
 end:
        free(dev_name, M_TEMP);
 }
-
-static inline XX_MallocTrackStruct *
-XX_FindTracker(physAddress_t pa)
-{
-       struct XX_MallocTrackerList *l;
-       XX_MallocTrackStruct *tp;
-
-       l = &XX_MallocTracker[(pa >> XX_MALLOC_TRACK_SHIFT) & 
XX_MallocHashMask];
-
-       LIST_FOREACH(tp, l, entries) {
-               if (tp->pa == pa)
-                       return tp;
-       }
-
-       return NULL;
-}
-
-void
-XX_TrackInit(void)
-{
-       if (XX_MallocTracker == NULL) {
-               XX_MallocTracker = hashinit(64, M_NETCOMMSW_MT,
-                   &XX_MallocHashMask);
-       }
-}
-
-physAddress_t
-XX_TrackAddress(void *addr)
-{
-       physAddress_t pa;
-       struct XX_MallocTrackerList *l;
-       XX_MallocTrackStruct *ts;
-       
-       pa = pmap_kextract((vm_offset_t)addr);
-
-       l = &XX_MallocTracker[(pa >> XX_MALLOC_TRACK_SHIFT) & 
XX_MallocHashMask];
-
-       mtx_lock(&XX_MallocTrackLock);
-       if (XX_FindTracker(pa) == NULL) {
-               ts = malloc(sizeof(*ts), M_NETCOMMSW_MT, M_NOWAIT);
-               if (ts == NULL)
-                       return (-1);
-               ts->va = addr;
-               ts->pa = pa;
-               LIST_INSERT_HEAD(l, ts, entries);
-       }
-       mtx_unlock(&XX_MallocTrackLock);
-
-       return (pa);
-}
-
-void
-XX_UntrackAddress(void *addr)
-{
-       physAddress_t pa;
-       XX_MallocTrackStruct *ts;
-       
-       pa = pmap_kextract((vm_offset_t)addr);
-
-       KASSERT(XX_MallocTracker != NULL,
-           ("Untracking an address before it's even initialized!\n"));
-
-       mtx_lock(&XX_MallocTrackLock);
-       ts = XX_FindTracker(pa);
-       if (ts != NULL)
-               LIST_REMOVE(ts, entries);
-       mtx_unlock(&XX_MallocTrackLock);
-       free(ts, M_NETCOMMSW_MT);
-}

Modified: head/sys/dev/dpaa/fman.c
==============================================================================
--- head/sys/dev/dpaa/fman.c    Wed Nov 16 03:54:41 2016        (r308717)
+++ head/sys/dev/dpaa/fman.c    Wed Nov 16 05:24:42 2016        (r308718)
@@ -273,8 +273,6 @@ fman_attach(device_t dev)
                return (ENXIO);
        }
 
-       XX_TrackInit();
-
        node = ofw_bus_get_node(dev);
        if (OF_getencprop(node, "fsl,qman-channel-range", qchan_range,
            sizeof(qchan_range)) <= 0) {

Modified: head/sys/dev/dpaa/if_dtsec.c
==============================================================================
--- head/sys/dev/dpaa/if_dtsec.c        Wed Nov 16 03:54:41 2016        
(r308717)
+++ head/sys/dev/dpaa/if_dtsec.c        Wed Nov 16 05:24:42 2016        
(r308718)
@@ -582,8 +582,6 @@ dtsec_attach(device_t dev)
        if (XX_MallocSmartInit() != E_OK)
                return (ENXIO);
 
-       XX_TrackInit();
-
        /* Init locks */
        mtx_init(&sc->sc_lock, device_get_nameunit(dev),
            "DTSEC Global Lock", MTX_DEF);

Modified: head/sys/dev/dpaa/if_dtsec_rm.c
==============================================================================
--- head/sys/dev/dpaa/if_dtsec_rm.c     Wed Nov 16 03:54:41 2016        
(r308717)
+++ head/sys/dev/dpaa/if_dtsec_rm.c     Wed Nov 16 05:24:42 2016        
(r308718)
@@ -136,7 +136,6 @@ static void
 dtsec_rm_fi_free(struct dtsec_softc *sc, struct dtsec_rm_frame_info *fi)
 {
 
-       XX_UntrackAddress(fi);
        uma_zfree(sc->sc_fi_zone, fi);
 }
 /** @} */

Modified: head/sys/powerpc/booke/pmap.c
==============================================================================
--- head/sys/powerpc/booke/pmap.c       Wed Nov 16 03:54:41 2016        
(r308717)
+++ head/sys/powerpc/booke/pmap.c       Wed Nov 16 05:24:42 2016        
(r308718)
@@ -872,10 +872,11 @@ pte_remove(mmu_t mmu, pmap_t pmap, vm_of
        if (PTE_ISWIRED(pte))
                pmap->pm_stats.wired_count--;
 
+       /* Get vm_page_t for mapped pte. */
+       m = PHYS_TO_VM_PAGE(PTE_PA(pte));
+
        /* Handle managed entry. */
        if (PTE_ISMANAGED(pte)) {
-               /* Get vm_page_t for mapped pte. */
-               m = PHYS_TO_VM_PAGE(PTE_PA(pte));
 
                if (PTE_ISMODIFIED(pte))
                        vm_page_dirty(m);
@@ -884,6 +885,15 @@ pte_remove(mmu_t mmu, pmap_t pmap, vm_of
                        vm_page_aflag_set(m, PGA_REFERENCED);
 
                pv_remove(pmap, va, m);
+       } else if (m->md.pv_tracked) {
+               /*
+                * Always pv_insert()/pv_remove() on MPC85XX, in case DPAA is
+                * used.  This is needed by the NCSW support code for fast
+                * VA<->PA translation.
+                */
+               pv_remove(pmap, va, m);
+               if (TAILQ_EMPTY(&m->md.pv_list))
+                       m->md.pv_tracked = false;
        }
 
        mtx_lock_spin(&tlbivax_mutex);
@@ -3466,6 +3476,33 @@ pmap_early_io_map(vm_paddr_t pa, vm_size
        return (va);
 }
 
+void
+pmap_track_page(pmap_t pmap, vm_offset_t va)
+{
+       vm_paddr_t pa;
+       vm_page_t page;
+       struct pv_entry *pve;
+
+       va &= ~PAGE_MASK;
+       pa = pmap_kextract(va);
+
+       rw_wlock(&pvh_global_lock);
+       PMAP_LOCK(pmap);
+       page = PHYS_TO_VM_PAGE(pa);
+
+       TAILQ_FOREACH(pve, &page->md.pv_list, pv_link) {
+               if ((pmap == pve->pv_pmap) && (va == pve->pv_va)) {
+                       goto out;
+               }
+       }
+       page->md.pv_tracked = true;
+       pv_insert(pmap, va, page);
+out:
+       PMAP_UNLOCK(pmap);
+       rw_wunlock(&pvh_global_lock);
+}
+
+
 /*
  * Setup MAS4 defaults.
  * These values are loaded to MAS0-2 on a TLB miss.

Modified: head/sys/powerpc/include/pmap.h
==============================================================================
--- head/sys/powerpc/include/pmap.h     Wed Nov 16 03:54:41 2016        
(r308717)
+++ head/sys/powerpc/include/pmap.h     Wed Nov 16 05:24:42 2016        
(r308718)
@@ -204,6 +204,7 @@ typedef struct pv_entry *pv_entry_t;
 
 struct md_page {
        TAILQ_HEAD(, pv_entry) pv_list;
+       bool    pv_tracked;
 };
 
 #define        pmap_page_get_memattr(m)        VM_MEMATTR_DEFAULT
@@ -261,6 +262,7 @@ extern      int pmap_bootstrapped;
 
 vm_offset_t pmap_early_io_map(vm_paddr_t pa, vm_size_t size);
 void pmap_early_io_unmap(vm_offset_t va, vm_size_t size);
+void pmap_track_page(pmap_t pmap, vm_offset_t va);
 
 #endif
 

Modified: head/sys/powerpc/mpc85xx/mpc85xx.h
==============================================================================
--- head/sys/powerpc/mpc85xx/mpc85xx.h  Wed Nov 16 03:54:41 2016        
(r308717)
+++ head/sys/powerpc/mpc85xx/mpc85xx.h  Wed Nov 16 05:24:42 2016        
(r308718)
@@ -36,6 +36,8 @@
  * Configuration control and status registers
  */
 extern vm_offset_t             ccsrbar_va;
+extern vm_paddr_t              ccsrbar_pa;
+extern vm_size_t               ccsrbar_size;
 #define CCSRBAR_VA             ccsrbar_va
 #define        OCP85XX_CCSRBAR         (CCSRBAR_VA + 0x0)
 #define        OCP85XX_BPTR            (CCSRBAR_VA + 0x20)

Modified: head/sys/powerpc/mpc85xx/platform_mpc85xx.c
==============================================================================
--- head/sys/powerpc/mpc85xx/platform_mpc85xx.c Wed Nov 16 03:54:41 2016        
(r308717)
+++ head/sys/powerpc/mpc85xx/platform_mpc85xx.c Wed Nov 16 05:24:42 2016        
(r308718)
@@ -78,7 +78,9 @@ struct cpu_release {
 #endif
 
 extern uint32_t *bootinfo;
+vm_paddr_t ccsrbar_pa;
 vm_offset_t ccsrbar_va;
+vm_size_t ccsrbar_size;
 
 static int cpu, maxcpu;
 
@@ -194,6 +196,8 @@ mpc85xx_attach(platform_t plat)
                ccsrsize |= ranges[i];
        }
        ccsrbar_va = pmap_early_io_map(ccsrbar, ccsrsize);
+       ccsrbar_pa = ccsrbar;
+       ccsrbar_size = ccsrsize;
 
 #if 0
        mpc85xx_fix_errata(ccsrbar_va);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to