Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 16 Nov 2016 05:24:43 +0000 (UTC)
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r308718 - in head/sys: contrib/ncsw/inc contrib/ncsw/user/env dev/dpaa powerpc/booke powerpc/include powerpc/mpc85xx
Message-ID:  <201611160524.uAG5OhHj061990@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201611160524.uAG5OhHj061990>