RK3368 GPU version: Rogue M 1.31
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / rogue_m / services / server / common / process_stats.c
index 80f5ad9d3a9b4fd7ed922fb28a4cbbe429abde4d..a8c55149636108795fe20028da1edf89db6145e7 100644 (file)
@@ -160,10 +160,14 @@ static IMG_CHAR*  pszProcessStatFmt[PVRSRV_PROCESS_STAT_TYPE_COUNT] = {
     "FreeListGrowRequestsByFirmware    %10d\n", /* PVRSRV_PROCESS_STAT_TYPE_FREELIST_GROW_REQS_BY_FW */
     "FreeListInitialPages              %10d\n", /* PVRSRV_PROCESS_STAT_TYPE_FREELIST_PAGES_INIT */
     "FreeListMaxPages                  %10d\n", /* PVRSRV_PROCESS_STAT_TYPE_FREELIST_MAX_PAGES */
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
     "MemoryUsageKMalloc                %10d\n", /* PVRSRV_STAT_TYPE_KMALLOC */
     "MemoryUsageKMallocMax             %10d\n", /* PVRSRV_STAT_TYPE_MAX_KMALLOC */
     "MemoryUsageVMalloc                %10d\n", /* PVRSRV_STAT_TYPE_VMALLOC */
     "MemoryUsageVMallocMax             %10d\n", /* PVRSRV_STAT_TYPE_MAX_VMALLOC */
+#else
+       "","","","",                                /* Empty strings if these stats are not logged */
+#endif
     "MemoryUsageAllocPTMemoryUMA       %10d\n", /* PVRSRV_STAT_TYPE_ALLOC_PAGES_PT_UMA */
     "MemoryUsageAllocPTMemoryUMAMax    %10d\n", /* PVRSRV_STAT_TYPE_MAX_ALLOC_PAGES_PT_UMA */
     "MemoryUsageVMapPTUMA              %10d\n", /* PVRSRV_STAT_TYPE_VMAP_PT_UMA */
@@ -186,6 +190,14 @@ static IMG_CHAR*  pszProcessStatFmt[PVRSRV_PROCESS_STAT_TYPE_COUNT] = {
     "MemoryUsageTotalMapMax            %10d\n", /* PVRSRV_PROCESS_STAT_TYPE_MAX_TOTAL_MAP */
 };
 
+/* structure used in hash table to track vmalloc statistic entries */
+typedef struct{
+       IMG_SIZE_T uiSizeInBytes;
+       IMG_PID    uiPid;
+}_PVR_STATS_VMALLOC_HASH_ENTRY;
+
+/* Function used internally to decrement per-process vmalloc statistic entries */
+static IMG_VOID _StatsDecrMemVAllocStat(_PVR_STATS_VMALLOC_HASH_ENTRY *psVmallocHashEntry);
 
 /*
  *  Functions for printing the information stored...
@@ -1093,6 +1105,7 @@ static void _decrease_global_stat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
 {
        switch (eAllocType)
        {
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
                case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
                        DECREASE_GLOBAL_STAT_VALUE(gsGlobalStats.ui32MemoryUsageKMalloc, uiBytes);
                        break;
@@ -1100,7 +1113,11 @@ static void _decrease_global_stat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
                case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
                        DECREASE_GLOBAL_STAT_VALUE(gsGlobalStats.ui32MemoryUsageVMalloc, uiBytes);
                        break;
-
+#else
+               case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
+               case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
+                       break;
+#endif
                case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA:
                        DECREASE_GLOBAL_STAT_VALUE(gsGlobalStats.ui32MemoryUsageAllocPTMemoryUMA, uiBytes);
                        break;
@@ -1144,6 +1161,7 @@ static void _increase_global_stat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
 {
        switch (eAllocType)
        {
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
                case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
                        INCREASE_GLOBAL_STAT_VALUE(gsGlobalStats.ui32MemoryUsageKMalloc, uiBytes);
                        break;
@@ -1151,7 +1169,11 @@ static void _increase_global_stat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
                case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
                        INCREASE_GLOBAL_STAT_VALUE(gsGlobalStats.ui32MemoryUsageVMalloc, uiBytes);
                        break;
-
+#else
+               case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
+               case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
+                       break;
+#endif
                case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA:
                        INCREASE_GLOBAL_STAT_VALUE(gsGlobalStats.ui32MemoryUsageAllocPTMemoryUMA, uiBytes);
                        break;
@@ -1395,7 +1417,11 @@ PVRSRVStatsAddMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE eAllocType,
         */
 
     /* Allocate the memory record... */
+#if defined(__linux__)
        psRecord = OSAllocMemstatMem(sizeof(PVRSRV_MEM_ALLOC_REC));
+#else
+       psRecord = OSAllocMem(sizeof(PVRSRV_MEM_ALLOC_REC));
+#endif
        if (psRecord == IMG_NULL)
        {
                return;
@@ -1434,7 +1460,11 @@ PVRSRVStatsAddMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE eAllocType,
                OSLockRelease(psLinkedListLock);
                if (psRecord != IMG_NULL)
                {
+#if defined(__linux__)
                        OSFreeMemstatMem(psRecord);
+#else
+                       OSFreeMem(psRecord);
+#endif
                }
                return;
        }
@@ -1449,6 +1479,7 @@ PVRSRVStatsAddMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE eAllocType,
        /* Update the memory watermarks... */
        switch (eAllocType)
        {
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
                case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
                {
                        if (psRecord != IMG_NULL)
@@ -1476,7 +1507,11 @@ PVRSRVStatsAddMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE eAllocType,
                        INCREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_VMALLOC, uiBytes);
                }
                break;
-
+#else
+               case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
+               case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
+                       break;
+#endif
                case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA:
                {
                        if (psRecord != IMG_NULL)
@@ -1720,6 +1755,7 @@ PVRSRVStatsRemoveMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE eAllocType,
        
                switch (eAllocType)
                {
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
                        case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
                        {
                                DECREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_KMALLOC, psRecord->uiBytes);
@@ -1731,7 +1767,11 @@ PVRSRVStatsRemoveMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE eAllocType,
                                DECREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_VMALLOC, psRecord->uiBytes);
                        }
                        break;
-
+#else
+               case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
+               case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
+                       break;
+#endif
                        case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA:
                        {
                                DECREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_ALLOC_PAGES_PT_UMA, psRecord->uiBytes);
@@ -1800,7 +1840,11 @@ psProcessStats->i32StatValue[PVRSRV_PROCESS_STAT_TYPE_TOTAL_MAP] = psProcessStat
         */
        if (psRecord != IMG_NULL)
        {
+#if defined(__linux__)
                OSFreeMemstatMem(psRecord);
+#else
+               OSFreeMem(psRecord);
+#endif
        }
 #else
 PVR_UNREFERENCED_PARAMETER(eAllocType);
@@ -1813,7 +1857,8 @@ PVRSRVStatsIncrMemAllocStatAndTrack(PVRSRV_MEM_ALLOC_TYPE eAllocType,
                                                                IMG_SIZE_T uiBytes,
                                                                IMG_UINT64 uiCpuVAddr)
 {
-       IMG_BOOL bRes;
+       IMG_BOOL bRes = IMG_FALSE;
+       _PVR_STATS_VMALLOC_HASH_ENTRY *psNewVmallocHashEntry = NULL;
 
        if (!bProcessStatsInitialised || (gpsVmallocSizeHashTable == NULL) )
        {
@@ -1821,15 +1866,35 @@ PVRSRVStatsIncrMemAllocStatAndTrack(PVRSRV_MEM_ALLOC_TYPE eAllocType,
        }
 
        OSLockAcquire(gpsVmallocSizeHashTableLock);
-       bRes = HASH_Insert(gpsVmallocSizeHashTable, uiCpuVAddr, uiBytes);
+       /* Alloc untracked memory for the new hash table entry */
+#if defined(__linux__)
+       psNewVmallocHashEntry = OSAllocMemstatMem(sizeof(*psNewVmallocHashEntry));
+#else
+       psNewVmallocHashEntry = OSAllocMem(sizeof(*psNewVmallocHashEntry));
+#endif
+       if (psNewVmallocHashEntry)
+       {
+               /* Fill-in the size of the vmalloc and PID of the allocating process */
+               psNewVmallocHashEntry->uiSizeInBytes = uiBytes;
+               psNewVmallocHashEntry->uiPid = OSGetCurrentProcessID();
+               /* Insert address of the new struct into the hash table */
+               bRes = HASH_Insert(gpsVmallocSizeHashTable, uiCpuVAddr, (uintptr_t)psNewVmallocHashEntry);
+       }
        OSLockRelease(gpsVmallocSizeHashTableLock);
-       if (bRes)
+       if (psNewVmallocHashEntry)
        {
-               PVRSRVStatsIncrMemAllocStat(eAllocType, uiBytes);
+               if (bRes)
+               {
+                       PVRSRVStatsIncrMemAllocStat(eAllocType, uiBytes);
+               }
+               else
+               {
+                       PVR_DPF((PVR_DBG_ERROR, "*** %s : @ line %d HASH_Insert() failed!!", __FUNCTION__, __LINE__));
+               }
        }
        else
        {
-               PVR_DPF((PVR_DBG_ERROR, "*** %s : @ line %d HASH_Insert() failed!!", __FUNCTION__, __LINE__));
+               PVR_DPF((PVR_DBG_ERROR, "*** %s : @ line %d Failed to alloc memory for psNewVmallocHashEntry!!", __FUNCTION__, __LINE__));
        }
 }
 
@@ -1874,6 +1939,7 @@ PVRSRVStatsIncrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
                /* Update the memory watermarks... */
                switch (eAllocType)
                {
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
                        case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
                        {
                                INCREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_KMALLOC, uiBytes);
@@ -1885,7 +1951,11 @@ PVRSRVStatsIncrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
                                INCREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_VMALLOC, uiBytes);
                        }
                        break;
-
+#else
+                       case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
+                       case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
+                       break;
+#endif
                        case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA:
                        {
                                INCREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_ALLOC_PAGES_PT_UMA, uiBytes);
@@ -1951,11 +2021,68 @@ PVRSRVStatsIncrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
        OSLockRelease(psLinkedListLock);
 }
 
+void
+PVRSRVStatsDecrMemKAllocStat(IMG_SIZE_T uiBytes,
+                             IMG_PID decrPID)
+{
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
+       PVRSRV_PROCESS_STATS*  psProcessStats;
+
+       /* Don't do anything if we are not initialised or we are shutting down! */
+       if (!bProcessStatsInitialised)
+       {
+               return;
+       }
+
+       _decrease_global_stat(PVRSRV_MEM_ALLOC_TYPE_KMALLOC, uiBytes);
+
+       OSLockAcquire(psLinkedListLock);
+
+       psProcessStats = _FindProcessStats(decrPID);
+
+       if (psProcessStats != NULL)
+       {
+               /* Decrement the kmalloc memory stat... */
+               DECREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_KMALLOC, uiBytes);
+       }
+
+       OSLockRelease(psLinkedListLock);
+#endif
+}
+
+static void
+_StatsDecrMemVAllocStat(_PVR_STATS_VMALLOC_HASH_ENTRY *psVmallocHashEntry)
+{
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
+       PVRSRV_PROCESS_STATS*  psProcessStats;
+
+       /* Don't do anything if we are not initialised or we are shutting down! */
+       if (!bProcessStatsInitialised)
+       {
+               return;
+       }
+
+       _decrease_global_stat(PVRSRV_MEM_ALLOC_TYPE_VMALLOC, psVmallocHashEntry->uiSizeInBytes);
+
+       OSLockAcquire(psLinkedListLock);
+
+       psProcessStats = _FindProcessStats(psVmallocHashEntry->uiPid);
+
+       if (psProcessStats != NULL)
+       {
+               /* Decrement the kmalloc memory stat... */
+               DECREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_VMALLOC, psVmallocHashEntry->uiSizeInBytes);
+       }
+
+       OSLockRelease(psLinkedListLock);
+#endif
+}
+
 IMG_VOID
 PVRSRVStatsDecrMemAllocStatAndUntrack(PVRSRV_MEM_ALLOC_TYPE eAllocType,
                                       IMG_UINT64 uiCpuVAddr)
 {
-       IMG_SIZE_T uiBytes;
+       _PVR_STATS_VMALLOC_HASH_ENTRY *psVmallocHashEntry = NULL;
 
        if (!bProcessStatsInitialised || (gpsVmallocSizeHashTable == NULL) )
        {
@@ -1963,10 +2090,17 @@ PVRSRVStatsDecrMemAllocStatAndUntrack(PVRSRV_MEM_ALLOC_TYPE eAllocType,
        }
 
        OSLockAcquire(gpsVmallocSizeHashTableLock);
-       uiBytes = HASH_Remove(gpsVmallocSizeHashTable, uiCpuVAddr);
+       psVmallocHashEntry = (_PVR_STATS_VMALLOC_HASH_ENTRY *)HASH_Remove(gpsVmallocSizeHashTable, uiCpuVAddr);
+       if (psVmallocHashEntry)
+       {
+               _StatsDecrMemVAllocStat(psVmallocHashEntry);
+#if defined(__linux__)
+               OSFreeMemstatMem(psVmallocHashEntry);
+#else
+               OSFreeMem(psVmallocHashEntry);
+#endif
+       }
        OSLockRelease(gpsVmallocSizeHashTableLock);
-
-       PVRSRVStatsDecrMemAllocStat(eAllocType, uiBytes);
 }
 
 IMG_VOID
@@ -2009,6 +2143,7 @@ PVRSRVStatsDecrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
                /* Update the memory watermarks... */
                switch (eAllocType)
                {
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
                        case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
                        {
                                DECREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_KMALLOC, uiBytes);
@@ -2020,7 +2155,11 @@ PVRSRVStatsDecrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
                                DECREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_VMALLOC, uiBytes);
                        }
                        break;
-
+#else
+                       case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
+                       case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
+                       break;
+#endif
                        case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA:
                        {
                                DECREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_ALLOC_PAGES_PT_UMA, uiBytes);
@@ -2315,11 +2454,19 @@ MemStatsPrintElements(IMG_PVOID pvFilePtr,
 
        while (psRecord != IMG_NULL)
        {
+               IMG_BOOL bPrintStat = IMG_TRUE;
+
                switch (psRecord->eAllocType)
                {
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
             case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:                pfnOSStatsPrintf(pvFilePtr, "KMALLOC             "); break;
             case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:                pfnOSStatsPrintf(pvFilePtr, "VMALLOC             "); break;
             case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_LMA:  pfnOSStatsPrintf(pvFilePtr, "ALLOC_PAGES_PT_LMA  "); break;
+#else
+               case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
+               case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
+                                                                                                                       bPrintStat = IMG_FALSE; break;
+#endif
             case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA:  pfnOSStatsPrintf(pvFilePtr, "ALLOC_PAGES_PT_UMA  "); break;
             case PVRSRV_MEM_ALLOC_TYPE_IOREMAP_PT_LMA:      pfnOSStatsPrintf(pvFilePtr, "IOREMAP_PT_LMA      "); break;
             case PVRSRV_MEM_ALLOC_TYPE_VMAP_PT_UMA:         pfnOSStatsPrintf(pvFilePtr, "VMAP_PT_UMA         "); break;
@@ -2329,19 +2476,21 @@ MemStatsPrintElements(IMG_PVOID pvFilePtr,
             default:                                           pfnOSStatsPrintf(pvFilePtr, "INVALID             "); break;
                }
 
-               for (ui32ItemNumber = 0;  ui32ItemNumber < ui32VAddrFields;  ui32ItemNumber++)
+               if (bPrintStat)
                {
-            pfnOSStatsPrintf(pvFilePtr, "%08x", *(((IMG_UINT32*) &psRecord->pvCpuVAddr) + ui32VAddrFields - ui32ItemNumber - 1));
-               }
-        pfnOSStatsPrintf(pvFilePtr, "  ");
-
-               for (ui32ItemNumber = 0;  ui32ItemNumber < ui32PAddrFields;  ui32ItemNumber++)
-               {
-            pfnOSStatsPrintf(pvFilePtr, "%08x", *(((IMG_UINT32*) &psRecord->sCpuPAddr.uiAddr) + ui32PAddrFields - ui32ItemNumber - 1));
-               }
+                       for (ui32ItemNumber = 0;  ui32ItemNumber < ui32VAddrFields;  ui32ItemNumber++)
+                       {
+                               pfnOSStatsPrintf(pvFilePtr, "%08x", *(((IMG_UINT32*) &psRecord->pvCpuVAddr) + ui32VAddrFields - ui32ItemNumber - 1));
+                       }
+                       pfnOSStatsPrintf(pvFilePtr, "  ");
 
-        pfnOSStatsPrintf(pvFilePtr, "  %u\n", psRecord->uiBytes);
+                       for (ui32ItemNumber = 0;  ui32ItemNumber < ui32PAddrFields;  ui32ItemNumber++)
+                       {
+                               pfnOSStatsPrintf(pvFilePtr, "%08x", *(((IMG_UINT32*) &psRecord->sCpuPAddr.uiAddr) + ui32PAddrFields - ui32ItemNumber - 1));
+                       }
 
+                       pfnOSStatsPrintf(pvFilePtr, "  %u\n", psRecord->uiBytes);
+               }
                /* Move to next record... */
                psRecord = psRecord->psNext;
        }
@@ -2485,10 +2634,12 @@ IMG_VOID GlobalStatsPrintElements(IMG_PVOID pvFilePtr,
 
        if (pfnOSGetStatsPrintf != IMG_NULL)
        {
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
         pfnOSGetStatsPrintf(pvFilePtr, "MemoryUsageKMalloc                %10d\n", gsGlobalStats.ui32MemoryUsageKMalloc);
         pfnOSGetStatsPrintf(pvFilePtr, "MemoryUsageKMallocMax             %10d\n", gsGlobalStats.ui32MemoryUsageKMallocMax);
         pfnOSGetStatsPrintf(pvFilePtr, "MemoryUsageVMalloc                %10d\n", gsGlobalStats.ui32MemoryUsageVMalloc);
         pfnOSGetStatsPrintf(pvFilePtr, "MemoryUsageVMallocMax             %10d\n", gsGlobalStats.ui32MemoryUsageVMallocMax);
+#endif
         pfnOSGetStatsPrintf(pvFilePtr, "MemoryUsageAllocPTMemoryUMA       %10d\n", gsGlobalStats.ui32MemoryUsageAllocPTMemoryUMA);
         pfnOSGetStatsPrintf(pvFilePtr, "MemoryUsageAllocPTMemoryUMAMax    %10d\n", gsGlobalStats.ui32MemoryUsageAllocPTMemoryUMAMax);
         pfnOSGetStatsPrintf(pvFilePtr, "MemoryUsageVMapPTUMA              %10d\n", gsGlobalStats.ui32MemoryUsageVMapPTUMA);