svn commit: r306839 - in head/sys/contrib/ncsw: inc user/env

Justin Hibbits jhibbits at FreeBSD.org
Sat Oct 8 05:26:46 UTC 2016


Author: jhibbits
Date: Sat Oct  8 05:26:45 2016
New Revision: 306839
URL: https://svnweb.freebsd.org/changeset/base/306839

Log:
  Minor optimizations to dTSEC glue code
  
  Don't call pmap_kextract() multiple times, it wastes CPU cycles, which in a high
  performance environment can be very expensive.
  
  Inline XX_FindTracker() to allow more optimizations as well.

Modified:
  head/sys/contrib/ncsw/inc/xx_ext.h
  head/sys/contrib/ncsw/user/env/xx.c

Modified: head/sys/contrib/ncsw/inc/xx_ext.h
==============================================================================
--- head/sys/contrib/ncsw/inc/xx_ext.h	Sat Oct  8 01:18:01 2016	(r306838)
+++ head/sys/contrib/ncsw/inc/xx_ext.h	Sat Oct  8 05:26:45 2016	(r306839)
@@ -932,7 +932,7 @@ t_Error XX_IpcSendMessage(t_Handle      
 
 /** FreeBSD Specific additions. */
 void XX_TrackInit(void);
-void XX_TrackAddress(void *addr);
+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	Sat Oct  8 01:18:01 2016	(r306838)
+++ head/sys/contrib/ncsw/user/env/xx.c	Sat Oct  8 05:26:45 2016	(r306839)
@@ -746,7 +746,6 @@ XX_IpcFreeSession(t_Handle h_Session)
 	return (E_OK);
 }
 
-extern void db_trace_self(void);
 physAddress_t
 XX_VirtToPhys(void *addr)
 {
@@ -785,12 +784,10 @@ 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 = pmap_kextract((vm_offset_t)addr);
-	if (!paddr)
+	paddr = XX_TrackAddress(addr);
+	if (paddr == -1)
 		printf("NetCommSW: "
 		    "Unable to translate virtual address 0x%08X!\n", addr);
-	else
-	    XX_TrackAddress(addr);
 
 	return (paddr);
 }
@@ -881,7 +878,7 @@ end:
 	free(dev_name, M_TEMP);
 }
 
-static XX_MallocTrackStruct *
+static inline XX_MallocTrackStruct *
 XX_FindTracker(physAddress_t pa)
 {
 	struct XX_MallocTrackerList *l;
@@ -906,7 +903,7 @@ XX_TrackInit(void)
 	}
 }
 
-void
+physAddress_t
 XX_TrackAddress(void *addr)
 {
 	physAddress_t pa;
@@ -915,18 +912,20 @@ XX_TrackAddress(void *addr)
 	
 	pa = pmap_kextract((vm_offset_t)addr);
 
-	ts = malloc(sizeof(*ts), M_NETCOMMSW_MT, M_NOWAIT);
-	ts->va = addr;
-	ts->pa = pa;
-
 	l = &XX_MallocTracker[(pa >> XX_MALLOC_TRACK_SHIFT) & XX_MallocHashMask];
 
 	mtx_lock(&XX_MallocTrackLock);
-	if (XX_FindTracker(pa) != NULL)
-		free(ts, M_NETCOMMSW_MT);
-	else
+	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


More information about the svn-src-all mailing list