]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Universal/StatusCode/Dxe/DataHubStatusCodeWorker.c
Fix EDKT497. In the patch:
[mirror_edk2.git] / EdkModulePkg / Universal / StatusCode / Dxe / DataHubStatusCodeWorker.c
index c5da3220ce4f34c4bc05ceca8c61bad3e4496aa5..28714365a67b11a36a997bc719378fdf5fd97c2c 100644 (file)
 //\r
 // Initialize FIFO to cache records.\r
 //\r
-STATIC \r
-EFI_LOCK                  mFifoLock        = EFI_INITIALIZE_LOCK_VARIABLE  (EFI_TPL_HIGH_LEVEL);\r
 STATIC\r
-LIST_ENTRY                mRecordsFifo     = INITIALIZE_LIST_HEAD_VARIABLE (mRecordsFifo);\r
+LIST_ENTRY                mRecordsFifo          = INITIALIZE_LIST_HEAD_VARIABLE (mRecordsFifo);\r
 STATIC\r
-UINTN                     mNumberOfRecords = 0;\r
+LIST_ENTRY                mRecordsBuffer        = INITIALIZE_LIST_HEAD_VARIABLE (mRecordsBuffer);\r
 STATIC\r
 EFI_EVENT                 mLogDataHubEvent;\r
 //\r
@@ -34,7 +32,9 @@ EFI_DATA_HUB_PROTOCOL     *mDataHubProtocol;
 \r
 \r
 /**\r
-  Return buffer of length DATAHUB_STATUSCODE_RECORD\r
+  Return one DATAHUB_STATUSCODE_RECORD space.\r
+  The size of free record pool would be extend, if the pool is empty. \r
+\r
  \r
   @retval  NULL   Can not allocate free memeory for record.\r
   @retval  !NULL  Point to buffer of record.\r
@@ -46,17 +46,39 @@ AcquireRecordBuffer (
   )\r
 {\r
   DATAHUB_STATUSCODE_RECORD *Record;\r
+  EFI_TPL                   CurrentTpl;\r
+  LIST_ENTRY                *Node;\r
+  UINT32                    Index;\r
+\r
+  CurrentTpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
+\r
+  if (!IsListEmpty (&mRecordsBuffer)) {\r
+    Node = GetFirstNode (&mRecordsBuffer);\r
+    RemoveEntryList (Node);\r
 \r
-  Record   = (DATAHUB_STATUSCODE_RECORD *) AllocateZeroPool (sizeof (DATAHUB_STATUSCODE_RECORD));\r
-  if (NULL == Record) {\r
-    return NULL;\r
+    Record = CR (Node, DATAHUB_STATUSCODE_RECORD, Node, DATAHUB_STATUS_CODE_SIGNATURE);\r
+  } else {\r
+    if (CurrentTpl > EFI_TPL_NOTIFY) {\r
+      gBS->RestoreTPL (CurrentTpl);\r
+      return NULL;\r
+    }\r
+\r
+    gBS->RestoreTPL (CurrentTpl);\r
+    Record   = (DATAHUB_STATUSCODE_RECORD *) AllocateZeroPool (sizeof (DATAHUB_STATUSCODE_RECORD) * 16);\r
+    if (NULL == Record) {\r
+      return NULL;\r
+    }\r
+\r
+    CurrentTpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
+    for (Index = 1; Index < 16; Index++) {\r
+      InsertTailList (&mRecordsBuffer, &Record[Index].Node);\r
+    }\r
   }\r
-  Record->Signature = DATAHUB_STATUS_CODE_SIGNATURE;\r
 \r
-  EfiAcquireLock (&mFifoLock);\r
+  Record->Signature = DATAHUB_STATUS_CODE_SIGNATURE;\r
   InsertTailList (&mRecordsFifo, &Record->Node);\r
-  mNumberOfRecords++;\r
-  EfiReleaseLock (&mFifoLock);\r
+\r
+  gBS->RestoreTPL (CurrentTpl);\r
 \r
   return Record;\r
 }\r
@@ -73,15 +95,16 @@ FreeRecordBuffer (
   IN  DATAHUB_STATUSCODE_RECORD  *Record\r
   )\r
 {\r
+  EFI_TPL  CurrentTpl;\r
+\r
   ASSERT (Record != NULL);\r
-  ASSERT (mNumberOfRecords != 0);\r
 \r
-  EfiAcquireLock (&mFifoLock);\r
+  CurrentTpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
+\r
   RemoveEntryList (&Record->Node);\r
-  mNumberOfRecords--;\r
-  EfiReleaseLock (&mFifoLock);\r
+  InsertTailList (&mRecordsBuffer, &Record->Node);\r
 \r
-  FreePool (Record);\r
+  gBS->RestoreTPL (CurrentTpl);\r
 }\r
 \r
 \r
@@ -207,12 +230,15 @@ LogDataHubEventCallBack (
   UINT32                            Size;\r
   UINT64                            DataRecordClass;\r
   LIST_ENTRY                        *Node;\r
+  EFI_TPL                           CurrentTpl;\r
 \r
   //\r
   // Log DataRecord in Data Hub.\r
   // Journal records fifo to find all record entry.\r
   //\r
   //\r
+  CurrentTpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
+\r
   for (Node = mRecordsFifo.ForwardLink; Node != &mRecordsFifo;) {\r
     Record = CR (Node, DATAHUB_STATUSCODE_RECORD, Node, DATAHUB_STATUS_CODE_SIGNATURE);\r
     Node   = Node->ForwardLink;\r
@@ -251,8 +277,12 @@ LogDataHubEventCallBack (
                         Size\r
                         );\r
 \r
+\r
+\r
     FreeRecordBuffer (Record);\r
   }\r
+\r
+  gBS->RestoreTPL (CurrentTpl);\r
 }\r
 \r
 \r