Reviewed-by: Jaben Carsey <jaben.car...@intel.com>

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of
> Cinnamon Shia
> Sent: Monday, November 09, 2015 6:54 AM
> To: edk2-devel@lists.01.org
> Subject: [edk2] [PATCH] PerformancePkg/Dp_App: Support dumping
> cumulative data
> Importance: High
> 
> 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..c4c146f6b152c5bd11c68
> b67c0aab22a17b90b44 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)7MP20
> 6
> 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`;`7NJos
> bV(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;7dz6
> rP
> 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
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to