svn commit: r308718 - in head/sys: contrib/ncsw/inc contrib/ncsw/user/env dev/dpaa powerpc/booke powerpc/include powerpc/mpc85xx
Justin Hibbits
jhibbits at FreeBSD.org
Wed Nov 16 05:24:45 UTC 2016
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);
More information about the svn-src-all
mailing list