Add a new option -c to dump cumulative data. For example: shell> dp -c ==[ Cumulative ]======== (Times in microsec.) Cumulative Average Shortest Longest Name Count Duration Duration Duration Duration LoadImage: 200 1000000 7000 0 100000 StartImage: 200 20000000 90000 0 7000000 DB:Start: 200 20000000 100000 0 9000000 DB:Support: 200000 100000 0 0 7000
shell> dp -c DXE ==[ Cumulative ]======== (Times in microsec.) Cumulative Average Shortest Longest Name Count Duration Duration Duration Duration LoadImage: 200 1000000 7000 0 100000 StartImage: 200 20000000 90000 0 7000000 DB:Start: 200 20000000 100000 0 9000000 DB:Support: 200000 100000 0 0 7000 DXE 1 30000000 30000000 0 30000000 Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Cinnamon Shia <cinnamon.s...@hpe.com> --- PerformancePkg/Dp_App/Dp.c | 62 +++++++++++++++++++++++++++++++++--- PerformancePkg/Dp_App/DpInternal.h | 10 ++++-- PerformancePkg/Dp_App/DpStrings.uni | Bin 36606 -> 38432 bytes PerformancePkg/Dp_App/DpTrace.c | 56 +++++++++++++++++++++++++++++--- 4 files changed, 117 insertions(+), 11 deletions(-) diff --git a/PerformancePkg/Dp_App/Dp.c b/PerformancePkg/Dp_App/Dp.c index 57144a8..0f61b9d 100644 --- a/PerformancePkg/Dp_App/Dp.c +++ b/PerformancePkg/Dp_App/Dp.c @@ -14,6 +14,7 @@ timer information to calculate elapsed time for each measurement. Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR> + (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -81,6 +82,7 @@ PARAM_ITEM_LIST ParamList[] = { #endif {STRING_TOKEN (STR_DP_OPTION_LX), TypeFlag}, // -x eXclude Cumulative Items {STRING_TOKEN (STR_DP_OPTION_LI), TypeFlag}, // -i Display Identifier + {STRING_TOKEN (STR_DP_OPTION_LC), TypeValue}, // -c Display cumulative data. {STRING_TOKEN (STR_DP_OPTION_LN), TypeValue}, // -n # Number of records to display for A and R {STRING_TOKEN (STR_DP_OPTION_LT), TypeValue} // -t # Threshold of interest }; @@ -138,6 +140,7 @@ ShowHelp( void ) PrintToken (STRING_TOKEN (STR_DP_HELP_THRESHOLD)); PrintToken (STRING_TOKEN (STR_DP_HELP_COUNT)); PrintToken (STRING_TOKEN (STR_DP_HELP_ID)); + PrintToken (STRING_TOKEN (STR_DP_HELP_CUM_DATA)); PrintToken (STRING_TOKEN (STR_DP_HELP_HELP)); Print(L"\n"); } @@ -168,7 +171,26 @@ DumpStatistics( void ) FreePool (StringPtrUnknown); } -/** +/** + Initialize the cumulative data. + +**/ +VOID +InitCumulativeData ( + VOID + ) +{ + UINTN Index; + + for (Index = 0; Index < NumCum; ++Index) { + CumData[Index].Count = 0; + CumData[Index].MinDur = PERF_MAXDUR; + CumData[Index].MaxDur = 0; + CumData[Index].Duration = 0; + } +} + +/** Dump performance data. @param[in] ImageHandle The image handle. @@ -203,6 +225,9 @@ InitializeDp ( BOOLEAN TraceMode; BOOLEAN ProfileMode; BOOLEAN ExcludeMode; + BOOLEAN CumulativeMode; + CONST CHAR16 *CustomCumulativeToken; + PERF_CUM_DATA *CustomCumulativeData; EFI_STRING StringDpOptionQh; EFI_STRING StringDpOptionLh; @@ -218,6 +243,7 @@ InitializeDp ( EFI_STRING StringDpOptionLn; EFI_STRING StringDpOptionLt; EFI_STRING StringDpOptionLi; + EFI_STRING StringDpOptionLc; SummaryMode = FALSE; VerboseMode = FALSE; @@ -226,6 +252,8 @@ InitializeDp ( TraceMode = FALSE; ProfileMode = FALSE; ExcludeMode = FALSE; + CumulativeMode = FALSE; + CustomCumulativeData = NULL; StringDpOptionQh = NULL; StringDpOptionLh = NULL; @@ -241,6 +269,7 @@ InitializeDp ( StringDpOptionLn = NULL; StringDpOptionLt = NULL; StringDpOptionLi = NULL; + StringDpOptionLc = NULL; StringPtr = NULL; // Get DP's entry time as soon as possible. @@ -289,6 +318,7 @@ InitializeDp ( StringDpOptionLn = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LN), NULL); StringDpOptionLt = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LT), NULL); StringDpOptionLi = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LI), NULL); + StringDpOptionLc = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LC), NULL); // Boolean Options // @@ -303,6 +333,7 @@ InitializeDp ( #endif // PROFILING_IMPLEMENTED ExcludeMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLx); mShowId = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLi); + CumulativeMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLc); // Options with Values CmdLineArg = ShellCommandLineGetValue (ParamPackage, StringDpOptionLn); @@ -331,6 +362,20 @@ InitializeDp ( #endif // PROFILING_IMPLEMENTED } + // + // Init the custom cumulative data. + // + CustomCumulativeToken = ShellCommandLineGetValue (ParamPackage, StringDpOptionLc); + if (CustomCumulativeToken != NULL) { + CustomCumulativeData = AllocateZeroPool (sizeof (PERF_CUM_DATA)); + CustomCumulativeData->MinDur = 0; + CustomCumulativeData->MaxDur = 0; + CustomCumulativeData->Count = 0; + CustomCumulativeData->Duration = 0; + CustomCumulativeData->Name = AllocateZeroPool (StrLen (CustomCumulativeToken) + 1); + UnicodeStrToAsciiStr (CustomCumulativeToken, CustomCumulativeData->Name); + } + /**************************************************************************** **** Timer specific processing **** ****************************************************************************/ @@ -392,8 +437,10 @@ InitializeDp ( **** !T && P := (2) Only Profile records are displayed **** T && P := (3) Same as Default, both are displayed ****************************************************************************/ - GatherStatistics(); - if (AllMode) { + GatherStatistics (CustomCumulativeData); + if (CumulativeMode) { + ProcessCumulative (CustomCumulativeData); + } else if (AllMode) { if (TraceMode) { DumpAllTrace( Number2Display, ExcludeMode); } @@ -418,7 +465,7 @@ InitializeDp ( if ( ! EFI_ERROR( Status)) { ProcessPeims ( ); ProcessGlobal ( ); - ProcessCumulative (); + ProcessCumulative (NULL); } } } @@ -432,6 +479,7 @@ InitializeDp ( } } + // // Free the memory allocate from HiiGetString // ListIndex = 0; @@ -455,9 +503,15 @@ InitializeDp ( SafeFreePool (StringDpOptionLn); SafeFreePool (StringDpOptionLt); SafeFreePool (StringDpOptionLi); + SafeFreePool (StringDpOptionLc); SafeFreePool (StringPtr); SafeFreePool (mPrintTokenBuffer); + if (CustomCumulativeData != NULL) { + SafeFreePool (CustomCumulativeData->Name); + } + SafeFreePool (CustomCumulativeData); + HiiRemovePackages (gHiiHandle); return Status; } diff --git a/PerformancePkg/Dp_App/DpInternal.h b/PerformancePkg/Dp_App/DpInternal.h index fff2995..0e97e1e 100644 --- a/PerformancePkg/Dp_App/DpInternal.h +++ b/PerformancePkg/Dp_App/DpInternal.h @@ -7,6 +7,7 @@ DpUtilities.c, DpTrace.c, and DpProfile.c are included here. Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR> + (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -188,10 +189,13 @@ GetCumulativeItem( @post The SummaryData and CumData structures contain statistics for the current performance logs. + + @param[in, out] CustomCumulativeData The pointer to the custom cumulative data. + **/ VOID GatherStatistics( - VOID + IN OUT PERF_CUM_DATA *CustomCumulativeData OPTIONAL ); /** @@ -299,11 +303,13 @@ ProcessGlobal( For each record with a Token listed in the CumData array:<BR> - Update the instance count and the total, minimum, and maximum durations. Finally, print the gathered cumulative statistics. + + @param[in] CustomCumulativeData The pointer to the custom cumulative data. **/ VOID ProcessCumulative( - VOID + IN PERF_CUM_DATA *CustomCumulativeData OPTIONAL ); /** diff --git a/PerformancePkg/Dp_App/DpStrings.uni b/PerformancePkg/Dp_App/DpStrings.uni index eddc02c2b8536c63718b82040f9c0238e21d23ce..c4c146f6b152c5bd11c68b67c0aab22a17b90b44 100644 GIT binary patch delta 675 zcmaJ-T`PlO7{1;KuZ<Ytz-DigB2Bh&LOYmkMZP8+$d=yTjbz_8+6fLgTMN&zQah6q zz2(T?@B{cEay>&!Lr?ejb>H`OKkv7ey9dkFQ|lN)7{7K7?)WeTFJ_=&0ZE)7MP206 z5QPo{htvfm7)Ov{KFKIYIlvKp4PokIN(x!#)AS@t!!n|ewOYH~pufXRmXl;HZU)p5 zr8zAE>V&A;#>9Qcb92><Tf6^gGOM<Wp6(E~u!3FE31SmLVQ-te=~U0;_D!r|iR@SD zdnn;L_Z%7PC^MGVBw0yN@3EGlmG|oOq%~0Dt@48OSCnQ(b{C13w`;`7NJosbV(fD> z*9EJ1>0cA)s#|f3yy}cZ|JWoqG|z1OndBll&dT{BZ{Kdrbb2w#UCU&rlf@$E=-B@q z>+;pH8+E1y>VMHg{yI90dG2lW{KCOC{R3IzkLJinZumxDDu!4e@SD93Yfe;7dz6rP V?F+SdU<h3;f7;<u(@}Y|d;q2Cjr9Nk delta 53 zcmZ3mhUwp2rU~0NJ1|aQ-~5V0igEHQ4yDNsTu*@Xt;shybwK>h4LmIZn{AZ13O3tK He#8U-a8edg diff --git a/PerformancePkg/Dp_App/DpTrace.c b/PerformancePkg/Dp_App/DpTrace.c index 1ba2b72..d3df30f 100644 --- a/PerformancePkg/Dp_App/DpTrace.c +++ b/PerformancePkg/Dp_App/DpTrace.c @@ -2,6 +2,7 @@ Trace reporting for the Dp utility. Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR> + (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -42,11 +43,14 @@ @post The SummaryData and CumData structures contain statistics for the current performance logs. + + @param[in, out] CustomCumulativeData A pointer to the cumtom cumulative data. + **/ VOID GatherStatistics( - VOID -) + IN OUT PERF_CUM_DATA *CustomCumulativeData OPTIONAL + ) { MEASUREMENT_RECORD Measurement; UINT64 Duration; @@ -98,6 +102,20 @@ GatherStatistics( CumData[TIndex].MaxDur = Duration; } } + + // + // Collect the data for custom cumulative data. + // + if ((CustomCumulativeData != NULL) && (AsciiStrCmp (Measurement.Token, CustomCumulativeData->Name) == 0)) { + CustomCumulativeData->Duration += Duration; + CustomCumulativeData->Count++; + if (Duration < CustomCumulativeData->MinDur) { + CustomCumulativeData->MinDur = Duration; + } + if (Duration > CustomCumulativeData->MaxDur) { + CustomCumulativeData->MaxDur = Duration; + } + } } } @@ -785,12 +803,14 @@ ProcessGlobal( For each record with a Token listed in the CumData array:<BR> - Update the instance count and the total, minimum, and maximum durations. Finally, print the gathered cumulative statistics. - + + @param[in] CustomCumulativeData A pointer to the cumtom cumulative data. + **/ VOID ProcessCumulative( - VOID -) + IN PERF_CUM_DATA *CustomCumulativeData OPTIONAL + ) { UINT64 AvgDur; // the computed average duration UINT64 Dur; @@ -829,4 +849,30 @@ ProcessCumulative( ); } } + + // + // Print the custom cumulative data. + // + if (CustomCumulativeData != NULL) { + if (CustomCumulativeData->Count != 0) { + AvgDur = DivU64x32 (CustomCumulativeData->Duration, CustomCumulativeData->Count); + AvgDur = DurationInMicroSeconds (AvgDur); + Dur = DurationInMicroSeconds (CustomCumulativeData->Duration); + MaxDur = DurationInMicroSeconds (CustomCumulativeData->MaxDur); + MinDur = DurationInMicroSeconds (CustomCumulativeData->MinDur); + } else { + AvgDur = 0; + Dur = 0; + MaxDur = 0; + MinDur = 0; + } + PrintToken (STRING_TOKEN (STR_DP_CUMULATIVE_STATS), + CustomCumulativeData->Name, + CustomCumulativeData->Count, + Dur, + AvgDur, + MinDur, + MaxDur + ); + } } -- 1.9.5.msysgit.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel