--- ./source/private_module/ramcache/cacheobject/cache_obj.c	2018-04-26 09:14:15.000000000 +0000
+++ ./source/private_module/ramcache/cacheobject/cache_obj.c.hotpatch	2018-08-31 09:26:08.000000000 +0000
@@ -1805,3 +1805,14 @@
 
     return FALSE;
 }
+
+bool isAllowCreateCacheObj(void)
+{
+    return g_allowCreateCacheObjFlag;
+}
+
+SPIN_LOCK_LIST_HEAD_S *getGlobalListByHashId(uint32_t hashId)
+{
+    return &g_cacheObjGlobalList[hashId];
+}
+
--- ./source/private_module/ramcache/debug/diagnose/diagnose_cache.c	2018-03-23 03:50:15.000000000 +0000
+++ ./source/private_module/ramcache/debug/diagnose/diagnose_cache.c.hotpatch	2018-08-31 09:26:08.000000000 +0000
@@ -69,16 +69,17 @@
 #ifdef _ARM_
 #include "../../recover/coffer/cbu_balance.h"
 #endif
-
-
 #define MAX_LENGTH_INPUT_CMD 256  /* ַ */
-
+#define PUSH_PRINT_BUF_TO_SCREEN(printBufCnt) do{if(*(printBufCnt) >= 100){ DBG_Print(""); *(printBufCnt) = 0; }}while(0);
+#define GET_NEXT_CACHE_OBJ_START(cacheObj) do{ uint32_t hashId = 0; uint32_t iterNum = 0; uint32_t objSum = 0; uint32_t cycleCount = 0; for(hashId = 0; hashId < 127; hashId++) { SPIN_LOCK_LIST_HEAD_S *objList = NULL; struct list_head * curNode = NULL; iterNum = 0; objList = getGlobalListByHashId(hashId); objSum = spinLockListCount(objList); while(iterNum < objSum) { iterNum++; cacheObj = NULL; lockCacheObjGlobalList();  \
+    if(isAllowCreateCacheObj()) { curNode = spinLockListCutFirstNodeNoLock(objList); if(NULL != curNode) { spinLockListAddTailNoLock(curNode, objList); cacheObj = list_entry(curNode, CACHE_OBJ_S, objNode);
+#define GET_NEXT_CACHE_OBJ_END(conditition) } } unlockCacheObjGlobalList(); if(conditition){ break; } SWITCH_THREADS_BY_NUM(cycleCount, 100); } if(conditition){ break; } } }while(0);
+#define GET_NEXT_CACHE_OBJ_FOR_DIAG_END(conditition, printBufCnt) } } unlockCacheObjGlobalList(); PUSH_PRINT_BUF_TO_SCREEN(&printBufCnt); if(conditition){ break; } if(cycleCount++ >100){cycleCount = 0;LVOS_usleep(10);} } if(conditition){ break; } } }while(0);
 #define STRING_EQ(a, b) (0 == strcmp((a), (b)))
-
+bool g_getNextCacheObjNoCondition = FALSE;
+#define NO_CONDITITION g_getNextCacheObjNoCondition
 atomic_t g_cacheIOTraceSetting[CACHE_IO_TRACE_POINT_BUT];    /*صӡ*/
-
 volumeid_t g_cacheIOTraceVolId = INVALID_VOLUME_ID;
-
 extern CACHE_CTRL_WORK_MODE_E g_volumeCacheWorkMode;
 extern CACHE_CTRL_WORK_MODE_E g_stripeCacheWorkMode;
 extern int32_t g_asyncMaxPrefetchReqConcurrent;
@@ -98,7 +99,6 @@
                                         void(*callback)(void*arg,int32_t result),
                                         void* arg);
 extern void showDiskPoolConcur(poolid_t poolId);
-
 extern uint64_t g_hangReqMaxTimeByS;
 extern uint32_t g_possWaitAllocRetryCounter;
 extern uint32_t g_defaultCountAverageNum;
@@ -108,7 +108,7 @@
 extern GLB_CONCUR_OBJ_S g_glbConcurObj;
 extern char *g_cacheTimeOutType[CACHE_IO_TIMEOUT_TYPE_BUTT];
 extern CACHE_IO_TIMEOUT_RECORD_S g_cacheIoTimeoutRec[CACHE_IO_TIMEOUT_TYPE_BUTT];
-
+extern bool isAllowCreateCacheObj(void);extern SPIN_LOCK_LIST_HEAD_S *getGlobalListByHashId(uint32_t hashId);
 /* ׶Σioȶbypass */
 bool g_bypassVolumeCache = FALSE;
 bool g_bypassStripeCache = FALSE;
@@ -361,42 +361,42 @@
               "--------", "--", "------",
               "-----", "-----", "------",
               "------", "------", "----", "-----","-----","-----", "-----","-----","-------","-------","---------","---");
-    setAllowCreateCacheObjFlag(FALSE);
-    while (NULL != (cacheObj = getNextCacheObj(cacheObj)))
-    {
+    GET_NEXT_CACHE_OBJ_START(cacheObj)
+
+
         baseObj = cacheObj->volumeCache;
-        if (NULL == baseObj)
+        if(NULL != baseObj)
         {
-            continue;
-        }
 
-        chunkDestagingCnt = 0;
-        for(dsgType = DESTAGE_TYPE_WRITEBACK; dsgType < DESTAGE_TYPE_DEFAULT;dsgType++)
-        {
-            chunkDestagingCnt += atomic_read(&baseObj->chunkDestagingNum[dsgType]);
-        }
-        DBG_LogInfo(CACHE_LOG_ID_150B, "  0x%-19llx%-7d%-8d%-7d%-8d%-8d%-8d%-9d%-7d%-7d%-7d%-7d%-7d%-9d%-9d%-9d%-10d%-7s",
-                  baseObj->volumeId,
-                  atomic_read(&baseObj->ioCount),
-                  atomic_read(&baseObj->mirrorIoCnt),
-                  atomic_read(&baseObj->cleanPage),
-                  atomic_read(&baseObj->dirtyData),
-                  atomic_read(&baseObj->dirtyParity),
-                  atomic_read(&baseObj->readPageUnitNum),
-                  atomic_read(&baseObj->writePageUnitNum),
-                  atomic_read(&baseObj->readChunkNum),
-                  atomic_read(&baseObj->writeChunkNum),
-                  atomic_read(&baseObj->faultChunkNum),
-                  chunkDestagingCnt,
-                  atomic_read(&baseObj->dirtyQuota),
-                  baseObj->state,
-                  baseObj->possWaitAllocList.sum,
-                  baseObj->writeMirConflictList.sum,
-                  atomic_read(&baseObj->writeConflictCnt),
-                  g_destageTypeStr[baseObj->isNormalDsgOpen]);
 
-    }
-    setAllowCreateCacheObjFlag(TRUE);
+
+            chunkDestagingCnt = 0;
+            for(dsgType = DESTAGE_TYPE_WRITEBACK; dsgType < DESTAGE_TYPE_DEFAULT;dsgType++)
+            {
+                chunkDestagingCnt += atomic_read(&baseObj->chunkDestagingNum[dsgType]);
+            }
+            DBG_LogInfo(CACHE_LOG_ID_150B, "  0x%-19llx%-7d%-8d%-7d%-8d%-8d%-8d%-9d%-7d%-7d%-7d%-7d%-7d%-9d%-9d%-9d%-10d%-7s",
+                      baseObj->volumeId,
+                      atomic_read(&baseObj->ioCount),
+                      atomic_read(&baseObj->mirrorIoCnt),
+                      atomic_read(&baseObj->cleanPage),
+                      atomic_read(&baseObj->dirtyData),
+                      atomic_read(&baseObj->dirtyParity),
+                      atomic_read(&baseObj->readPageUnitNum),
+                      atomic_read(&baseObj->writePageUnitNum),
+                      atomic_read(&baseObj->readChunkNum),
+                      atomic_read(&baseObj->writeChunkNum),
+                      atomic_read(&baseObj->faultChunkNum),
+                      chunkDestagingCnt,
+                      atomic_read(&baseObj->dirtyQuota),
+                      baseObj->state,
+                      baseObj->possWaitAllocList.sum,
+                      baseObj->writeMirConflictList.sum,
+                      atomic_read(&baseObj->writeConflictCnt),
+                      g_destageTypeStr[baseObj->isNormalDsgOpen]);
+
+        }
+    GET_NEXT_CACHE_OBJ_END(NO_CONDITITION)
 }
 
 void healPrintStripeBaseIOCount(void)
@@ -417,46 +417,46 @@
               "--------", "--", "------",
               "-----", "-----", "------",
               "------", "------", "----", "-----","-----","-----", "-----","-----","-------","---------","---");
-    setAllowCreateCacheObjFlag(FALSE);
-    while (NULL != (cacheObj = getNextCacheObj(cacheObj)))
-    {
+    GET_NEXT_CACHE_OBJ_START(cacheObj)
+
+
         cacheBase = cacheObj->stripeCache;
-        if (NULL == cacheBase)
+        if (NULL != cacheBase)
         {
-            continue;
-        }
 
-        if ((atomic_read(&cacheBase->ioCount) <= 0) && (atomic_read(&cacheBase->writeChunkNum) <= 0))
-        {
-            continue;
-        }
 
-        chunkDestagingCnt = 0;
-        for(dsgType = DESTAGE_TYPE_WRITEBACK; dsgType < DESTAGE_TYPE_DEFAULT;dsgType++)
-        {
-            chunkDestagingCnt += atomic_read(&cacheBase->chunkDestagingNum[dsgType]);
-        }
-        DBG_LogInfo(CACHE_LOG_ID_150B, "  0x%-19llx%-7d%-8d%-7d%-8d%-8d%-8d%-9d%-7d%-7d%-7d%-7d%-7d%-9d%-9d%-10d%-7s",
-                  cacheBase->volumeId,
-                  atomic_read(&cacheBase->ioCount),
-                  atomic_read(&cacheBase->mirrorIoCnt),
-                  atomic_read(&cacheBase->cleanPage),
-                  atomic_read(&cacheBase->dirtyData),
-                  atomic_read(&cacheBase->dirtyParity),
-                  atomic_read(&cacheBase->readPageUnitNum),
-                  atomic_read(&cacheBase->writePageUnitNum),
-                  atomic_read(&cacheBase->readChunkNum),
-                  atomic_read(&cacheBase->writeChunkNum),
-                  atomic_read(&cacheBase->faultChunkNum),
-                  chunkDestagingCnt,
-                  atomic_read(&cacheBase->dirtyQuota),
-                  cacheBase->state,
-                  cacheBase->writeMirConflictList.sum,
-                  atomic_read(&cacheBase->writeConflictCnt),
-                  g_destageTypeStr[cacheBase->isNormalDsgOpen]);
 
-    }
-    setAllowCreateCacheObjFlag(TRUE);
+            if ((atomic_read(&cacheBase->ioCount) > 0) || (atomic_read(&cacheBase->writeChunkNum) > 0))
+            {
+
+
+
+                chunkDestagingCnt = 0;
+                for(dsgType = DESTAGE_TYPE_WRITEBACK; dsgType < DESTAGE_TYPE_DEFAULT;dsgType++)
+                {
+                    chunkDestagingCnt += atomic_read(&cacheBase->chunkDestagingNum[dsgType]);
+                }
+                DBG_LogInfo(CACHE_LOG_ID_150B, "  0x%-19llx%-7d%-8d%-7d%-8d%-8d%-8d%-9d%-7d%-7d%-7d%-7d%-7d%-9d%-9d%-10d%-7s",
+                          cacheBase->volumeId,
+                          atomic_read(&cacheBase->ioCount),
+                          atomic_read(&cacheBase->mirrorIoCnt),
+                          atomic_read(&cacheBase->cleanPage),
+                          atomic_read(&cacheBase->dirtyData),
+                          atomic_read(&cacheBase->dirtyParity),
+                          atomic_read(&cacheBase->readPageUnitNum),
+                          atomic_read(&cacheBase->writePageUnitNum),
+                          atomic_read(&cacheBase->readChunkNum),
+                          atomic_read(&cacheBase->writeChunkNum),
+                          atomic_read(&cacheBase->faultChunkNum),
+                          chunkDestagingCnt,
+                          atomic_read(&cacheBase->dirtyQuota),
+                          cacheBase->state,
+                          cacheBase->writeMirConflictList.sum,
+                          atomic_read(&cacheBase->writeConflictCnt),
+                          g_destageTypeStr[cacheBase->isNormalDsgOpen]);
+            }
+        }
+    GET_NEXT_CACHE_OBJ_END(NO_CONDITITION)
 }
 
 void healPrintL1IO()
@@ -1286,8 +1286,8 @@
 
     DBG_LogInfo(CACHE_LOG_ID_15A2,"force mirror hang:");
     DBG_LogInfo(CACHE_LOG_ID_15A3,"------------------------------");
-    while (NULL != (obj = getNextCacheObj(obj)))
-    {
+    GET_NEXT_CACHE_OBJ_START(obj)
+
         cacheBase = obj->volumeCache;
         if (NULL != cacheBase)
         {
@@ -1299,11 +1299,11 @@
             healPrintForcemirrorHangInfo(cacheBase);
         }
         /* 200 */
-        if (++num > 200)
-        {
-            break;
-        }
-    }
+        ++num;
+    GET_NEXT_CACHE_OBJ_END(num > 200)
+
+
+
     DBG_LogInfo(CACHE_LOG_ID_15A4,"------------------------------");
     return;
 }
@@ -2466,22 +2466,22 @@
 {
     CACHE_OBJ_S *obj = NULL;
     CACHE_BASE_S *cacheBase = NULL;
-
+    uint32_t printBufCnt = 0;
     DBG_Print("force mirror hang:\n");
     DBG_Print("------------------------------\n");
-    while (NULL != (obj = getNextCacheObj(obj)))
-    {
+    GET_NEXT_CACHE_OBJ_START(obj)
         cacheBase = obj->volumeCache;
         if (NULL != cacheBase)
         {
             printForcemirrorHangInfo(cacheBase);
+			printBufCnt+=50;
         }
         cacheBase = obj->stripeCache;
-        if (NULL != cacheBase)
-        {
+        if (NULL != cacheBase){
             printForcemirrorHangInfo(cacheBase);
+			printBufCnt+=50;
         }
-    }
+    GET_NEXT_CACHE_OBJ_FOR_DIAG_END(NO_CONDITITION, printBufCnt)
     DBG_Print("------------------------------\n\n");
     return;
 }
--- ./source/private_module/ramcache/debug/diagnose/diagnose_cache_chunk.c	2018-02-09 13:47:03.000000000 +0000
+++ ./source/private_module/ramcache/debug/diagnose/diagnose_cache_chunk.c.hotpatch	2018-08-31 09:26:08.000000000 +0000
@@ -505,7 +505,7 @@
             DBG_PrintBuf("  All write parity pageunit is null :\n");
         }
     }
-
+    DBG_Print("");
     return RETURN_OK;
 }
 
--- ./source/private_module/ramcache/debug/diagnose/diagnose_cache_obj.c	2018-02-09 13:47:03.000000000 +0000
+++ ./source/private_module/ramcache/debug/diagnose/diagnose_cache_obj.c.hotpatch	2018-08-31 09:26:08.000000000 +0000
@@ -43,15 +43,11 @@
 
 #include "../../algorithm/destage.h"
 #include "../../algorithm/destage/destage_mirror.h"
-
 #include "diagnose_cache_obj.h"
-
 #include "diagnose_frame.h"
 #include "cache_lun_intf.h"
-
 extern CACHE_PARTITION_OBJ_S g_cachePartitionObjArray[INNER_CACHE_PTT_NUM_IN_PAIR];
 extern bool g_isAllCacheDsgOpen;
-
 extern CACHE_CTRL_WORK_MODE_E g_volumeCacheWorkMode;
 extern CACHE_CTRL_WORK_MODE_E g_stripeCacheWorkMode;
 extern atomic64_t g_totalReadHitIoCount;
@@ -62,7 +58,8 @@
 extern atomic64_t g_totalFakeReadHitIoCount;
 extern atomic64_t g_totalVolumeFakeReadHitIoCount;
 extern atomic64_t g_totalStripeFakeReadHitIoCount;
-
+extern bool isAllowCreateCacheObj(void);
+extern SPIN_LOCK_LIST_HEAD_S *getGlobalListByHashId(uint32_t hashId);
 extern CACHE_LOCK_LIST_HEAD_S g_volumeMirrorWriteWaitList[MIRROR_WAIT_LIST_HASH_NUM];
 extern CACHE_LOCK_LIST_HEAD_S g_stripeMirrorWriteWaitList[MIRROR_WAIT_LIST_HASH_NUM];
 extern CACHE_LOCK_LIST_HEAD_S g_volumeMirrorReadWaitList;
@@ -83,13 +80,16 @@
 extern FORCE_MIRROR_TASK_S g_forceMirrorTask;
 extern CACHE_IO_TIMEOUT_RECORD_S g_cacheIoTimeoutRec[CACHE_IO_TIMEOUT_TYPE_BUTT];
 extern TIER_CACHE_QUOTA_OBJ_S g_tierQuotaObj;
-
 extern DISK_POOL_CACHE_OBJ_S g_diskPoolCacheObj[MAX_POOL_NUM_IN_CACHE];
 int32_t newRegisterIotrace(int32_t argc, char *argv[], CACHE_OBJ_S *obj);
 int32_t isStopObjBgrTask(int32_t argc, char *argv[], CACHE_OBJ_S *obj);
-
 #define CACHE_IO_TIMEOUT_PRINT_COUNT (10)
-
+bool g_getNextCacheObjNoCondition1 = FALSE;
+#define NO_CONDITITION g_getNextCacheObjNoCondition1
+#define PUSH_PRINT_BUF_TO_SCREEN(printBufCnt) do{if(*(printBufCnt) >= 100){ DBG_Print(""); *(printBufCnt) = 0; }}while(0);
+#define GET_NEXT_CACHE_OBJ_START(cacheObj) do{ uint32_t hashId = 0; uint32_t iterNum = 0; uint32_t objSum = 0; uint32_t cycleCount = 0; for(hashId = 0; hashId < 127; hashId++) { SPIN_LOCK_LIST_HEAD_S *objList = NULL; struct list_head * curNode = NULL; iterNum = 0; objList = getGlobalListByHashId(hashId); objSum = spinLockListCount(objList); while(iterNum < objSum) { iterNum++; cacheObj = NULL; lockCacheObjGlobalList();  \
+    if(isAllowCreateCacheObj()) { curNode = spinLockListCutFirstNodeNoLock(objList); if(NULL != curNode) { spinLockListAddTailNoLock(curNode, objList); cacheObj = list_entry(curNode, CACHE_OBJ_S, objNode);
+#define GET_NEXT_CACHE_OBJ_FOR_DIAG_END(conditition, printBufCnt) } } unlockCacheObjGlobalList(); PUSH_PRINT_BUF_TO_SCREEN(&printBufCnt); if(conditition){ break; } if(cycleCount++ >100){cycleCount = 0;LVOS_usleep(10);} } if(conditition){ break; } } }while(0);
 PROTECTED char *g_cacheType[CACHE_OBJECT_TYPE_BUTT] = {"unknown",
                                                       "lun",
                                                       "row lun",
@@ -2753,7 +2753,7 @@
         return RETURN_ERROR;
     }
 }
-
+int32_t showAllCacheBaseInHotpatch(BASE_TYPE_E baseType, uint32_t baseCnt, char *filterType, char *filterValue);
 /**************************************************************************
      :  cache show obj μ (һ)
  :  argc: argvԪظ
@@ -2765,7 +2765,7 @@
 int32_t checkShowObjParam(int32_t argc, char *argv[])
 {
     /*  1-4 */
-    if (RETURN_OK != checkDiagnoseParamNum(argc, 1, 6, "cache show obj"))
+    if (RETURN_OK != checkDiagnoseParamNum(argc, 1, 7, "cache show obj"))
     {
         return RETURN_ERROR;
     }
@@ -2788,7 +2788,7 @@
         return checkShowObjSecondParamVOLID(argc, argv);
     }
 }
-
+int32_t showAllCacheObjInHotpatch(void);
 int32_t getShowObjNum(int32_t argc, char *argv[], uint32_t *cacheObjSum, uint32_t *maxBaseCnt)
 {
     /* ȡǰcacheobjĿ */
@@ -2871,15 +2871,15 @@
     /* һ{a| v| s| volumeid} */
     if (0 == strnicmp(argv[0], "a", 1))
     {
-        return showAllCacheObj();
+        return showAllCacheObjInHotpatch();
     }
     else if (0 == strnicmp(argv[0], "v", 1))
     {
-        return showAllCacheBase(BASE_TYPE_VOLUME_CACHE, maxBaseCnt, argv[1], argv[2]);
+        return showAllCacheBaseInHotpatch(BASE_TYPE_VOLUME_CACHE, maxBaseCnt, argv[1], argv[2]);
     }
     else if (0 == strnicmp(argv[0], "s", 1))
     {
-        return showAllCacheBase(BASE_TYPE_STRIPE_CACHE, maxBaseCnt, argv[1], argv[2]);
+        return showAllCacheBaseInHotpatch(BASE_TYPE_STRIPE_CACHE, maxBaseCnt, argv[1], argv[2]);
     }
     else if (0 == strnicmp(argv[0], "posswaitlist", 1))
     {
@@ -5608,7 +5608,7 @@
     *pullData = time * 60;
     return RETURN_OK;
 }
-
+int32_t checkAndGetCpuThres(const OSP_CHAR *param, uint64_t *pullData);
 static int32_t checkAndGetSwitch(const OSP_CHAR *param, bool* isOpen)
 {
     if (0 == strcmp(param, "1"))
@@ -5626,7 +5626,7 @@
 
     return RETURN_OK;
 }
-
+extern uint8_t g_traceCpuThreshold;
 /**************************************************************************
      :  עtraceԿ
  :  
@@ -5641,9 +5641,9 @@
     bool doVolumeCache = FALSE;
     bool doStripeCache = FALSE;
     uint64_t time = 0;
+    uint64_t cpuThres = 0;
     bool traceSwitch = g_isOpenAllTraceSwitch;
-
-    if (argc < 2 || argc > 4)
+    if (argc < 2 || argc > 5)
     {
         DBG_Print("please input at least two numbers\n");
         return RETURN_ERROR ;
@@ -5676,7 +5676,6 @@
             return RETURN_ERROR ;
         }
     }
-
     if (argc >= 3)
     {
         if (RETURN_OK != checkAndGetSwitch(argv[2], &isOpenAllSwitch))
@@ -5687,7 +5686,6 @@
 
         g_isOpenAllTraceSwitch = isOpenAllSwitch;
     }
-
     if (4 == argc)
     {
         if (RETURN_OK != checkAndGetTime(argv[3], &time))
@@ -5695,11 +5693,13 @@
             g_isOpenAllTraceSwitch = traceSwitch;
             return RETURN_ERROR;
         }
-
         g_openIotraceMaxMinutes = (uint32_t)time;
     }
+    if (5 == argc){
+        if (RETURN_OK == checkAndGetCpuThres(argv[4], &cpuThres)){g_traceCpuThreshold = (uint8_t)cpuThres;}
+    }
     (void)diagRegisterOneIotrace(obj, doVolumeCache, doStripeCache, isOpen);
-    DBG_Print("iotrace isOpenAllTraceSwitch:%d, openIotraceMaxMinutes:%u.\n", g_isOpenAllTraceSwitch, g_openIotraceMaxMinutes);
+    DBG_Print("iotrace isOpenAllTraceSwitch:%d, openIotraceMaxMinutes:%u, autoclosecputhres(%u).\n", g_isOpenAllTraceSwitch, g_openIotraceMaxMinutes, g_traceCpuThreshold);
     return RETURN_OK;
 }
 int32_t isStopObjBgrTask(int32_t argc, char *argv[], CACHE_OBJ_S *obj)
@@ -5749,3 +5749,509 @@
 
     return RETURN_OK;
 }
+
+int32_t checkAndGetCpuThres(const OSP_CHAR *param, uint64_t *pullData)
+{
+    uint64_t cpuThres = 0;
+
+    if (RETURN_OK != cacheGetParamU64(param, &cpuThres))
+    {
+        return RETURN_ERROR;
+    }
+
+    if(cpuThres < 20 || cpuThres > 100)
+    {
+        return RETURN_ERROR;
+    }
+
+    *pullData = cpuThres;
+    return RETURN_OK;
+}
+
+uint32_t showCacheBaseSimpleInfoInHotpatch(CACHE_BASE_S *baseObj, bool *printTitile, char *filterValue, uint32_t *findObjNum)
+{
+    uint32_t printBufCnt = 0;
+    UNREFERENCE_PARAM(filterValue);
+    if (TRUE == *printTitile)
+    {
+        DBG_PrintBuf("  %-20s%-20s%-12s%-12s%-12s%-12s%-12s%-12s\n",
+            "cacheObj", "volumeid", "partition", "readPolicy", "writePolicy", "writeThrough", "local", "readBoth");
+        DBG_PrintBuf("  %-20s%-20s%-12s%-12s%-12s%-12s%-12s%-12s\n",
+            "--------", "--------", "---------", "----------", "-----------", "------------", "-----", "--------");
+        printBufCnt += 2;
+        *printTitile = FALSE;
+    }
+
+    ++(*findObjNum);
+
+    DBG_PrintBuf("  %-16p0x%-18llx%-12u%-12x%-12x%-12s%-12s%-12s\n",
+              baseObj,
+              baseObj->volumeId,
+              baseObj->partition,
+              GET_BASE_READ_CACHE_POLICY(baseObj),
+              GET_BASE_WRITE_CACHE_POLICY(baseObj),
+              (baseObj->writeThrough) ? "yes" : "no",
+              ((TRUE == baseObj->localCtrl) ? "yes" : "no"),
+              ((TRUE == baseObj->readMirror) ? "yes" : "no"));
+    printBufCnt++;
+    return printBufCnt;
+}
+
+uint32_t showCacheBaseCntInHotpatch(CACHE_BASE_S *baseObj, bool *printTitile, char *filterValue, uint32_t *findObjNum)
+{
+    /*  */
+    int32_t chunkDestagingCnt = 0;
+    uint8_t dsgType;
+    CACHE_TP_TABLE_S *tpTable = NULL;
+    CACHE_OBJ_S *cacheObj = NULL;
+    uint32_t tpCnt = 0;
+    uint32_t printBufCnt = 0;
+
+    cacheObj = (CACHE_OBJ_S *)baseObj->cacheObj;
+    for(dsgType = DESTAGE_TYPE_WRITEBACK; dsgType < DESTAGE_TYPE_DEFAULT;dsgType++)
+    {
+        chunkDestagingCnt += atomic_read(&baseObj->chunkDestagingNum[dsgType]);
+    }
+    if (FALSE == filterShowCacheBaseCnt(baseObj, filterValue))
+    {
+        return printBufCnt;
+    }
+
+    if ((BASE_TYPE_VOLUME_CACHE == baseObj->baseType) && (IS_DATA_VOLUME(baseObj->volumeId)))
+    {
+        tpTable = baseObj->volumeTpTable;
+        tpCnt = spinLockListCount(&tpTable->tpList);
+    }
+
+    if (TRUE == *printTitile)
+    {
+        DBG_PrintBuf(" %-30s----io cnt----  -------------page cnt----------------"
+            "   ---pageunit cnt---  ------chunk cnt------------------  --quota cnt-- --timepoint cnt--\n", " ");
+
+        DBG_PrintBuf(" %-19s %-9s %-4s %-10s %-8s %-8s %-9s %-11s %-8s %-10s %-8s %-9s %-8s %-9s %-13s %-12s\n",
+            "volumeid", "volType", "io", "mirrorCnt",
+            "clean", "dirty", "parity","faultdirty",
+            "readpu", "writepu", "read", "write","fault","dsging","dirty", "cnt");
+
+        DBG_PrintBuf(" %-19s %-9s %-4s %-10s %-8s %-8s %-9s %-11s %-8s %-10s %-8s %-9s %-8s %-9s %-13s %-12s\n",
+            "--------","-------", "--", "---------",
+            "-----", "-----", "------", "----------",
+            "------", "------", "----", "-----","-----","-----", "-----", "---");
+        printBufCnt += 3;
+        *printTitile = FALSE;
+    }
+
+    ++(*findObjNum);
+
+    DBG_PrintBuf(" 0x%-18llx%-10s%-5d%-11d%-9d%-9d%-10d%-12d%-9d%-11d%-9d%-10d%-9d%-10d%-14d%-5d\n",
+                  baseObj->volumeId,
+                  g_volumeCacheTypeStr[cacheObj->volumeType],
+                  atomic_read(&baseObj->ioCount),
+                  atomic_read(&baseObj->mirrorIoCnt),
+                  atomic_read(&baseObj->cleanPage),
+                  atomic_read(&baseObj->dirtyData),
+                  atomic_read(&baseObj->dirtyParity),
+                  atomic_read(&baseObj->faultDirtyPageNum),
+
+                  atomic_read(&baseObj->readPageUnitNum),
+                  atomic_read(&baseObj->writePageUnitNum),
+                  atomic_read(&baseObj->readChunkNum),
+                  atomic_read(&baseObj->writeChunkNum),
+                  atomic_read(&baseObj->faultChunkNum),
+                  chunkDestagingCnt,
+                  atomic_read(&baseObj->dirtyQuota),
+                  tpCnt);
+    printBufCnt++;
+    return printBufCnt;
+}
+
+uint32_t showCacheBaseReadInfoInHotpatch(CACHE_BASE_S *baseObj, bool *printTitile, char *filterValue, uint32_t *findObjNum)
+{
+    uint32_t printBufCnt = 0;
+    UNREFERENCE_PARAM(filterValue);
+    if (TRUE == *printTitile)
+    {
+        DBG_PrintBuf("  %-20s%-20s%-34s%-28s\n",
+            "volumeid", "prefetchFactor", "asyncPrefetchThresholdInSector", "asyncPrefetchThresholdPercent");
+
+        DBG_PrintBuf("  %-20s%-20s%-34s%-28s\n",
+            "--------", "--------------","-------------","-------------");
+        printBufCnt += 2;
+        *printTitile = FALSE;
+    }
+
+    ++(*findObjNum);
+
+    DBG_PrintBuf("  0x%-20llx%-20d%-34d%-28d\n",
+                  baseObj->volumeId,
+                  baseObj->prefetchFactor,
+                  baseObj->asyncPrefetchThresholdInSector,
+                  baseObj->asyncPrefetchThresholdPercent);
+    printBufCnt++;
+    return printBufCnt;
+}
+
+uint32_t showIoStepTimeInHotpatch(CACHE_BASE_S *baseObj, bool *printTitile, char *filterValue, uint32_t *findObjNum)
+{
+    CACHE_BASE_RECORD_S * cacheBaseRecord = NULL;
+    IO_STEP_TIME_S * ioStepTime = NULL;
+    uint64_t ioCount;
+    uint64_t timeSum;
+    uint64_t timeAvg;
+    uint32_t i;
+    uint32_t printBufCnt = 0;
+    UNREFERENCE_PARAM(filterValue);
+
+    if (TRUE == *printTitile)
+    {
+        DBG_PrintBuf("  %-40s%-20s%-20s%-20s%-20s\n",
+            "volumeid", "ioCount", "timeAvg", "timeMax", "timeMin");
+
+        DBG_PrintBuf("  %-40s%-20s%-20s%-20s%-20s\n",
+            "--------", "--------","--------","--------","--------");
+        printBufCnt += 2;
+        *printTitile = FALSE;
+    }
+
+    cacheBaseRecord = (CACHE_BASE_RECORD_S *)baseObj->cacheBaseRecord;
+    DBG_PrintBuf("  0x%-20llx\n", baseObj->volumeId);
+    if (NULL == cacheBaseRecord)
+    {
+        DBG_PrintBuf("  have no iosteptime statistics.\n");
+        printBufCnt++;
+        return printBufCnt;
+    }
+
+    for(i = 0; i < IO_STEP_BUTT; i++)
+    {
+        ioStepTime = &(cacheBaseRecord->ioStepTime[i]);
+        ioCount = (uint64_t)atomic64_read(&ioStepTime->ioCount);
+        timeSum = (uint64_t)atomic64_read(&ioStepTime->timeSum);
+        timeAvg = (0 < ioCount) ? (timeSum / ioCount) : 0;
+
+        if (ioCount > 0)
+        {
+            DBG_PrintBuf("  %-40s%-20llu%-20llu%-20llu%-20llu\n",
+                        g_ioStepName[i],
+                        ioCount,
+                        timeAvg,
+                        ioStepTime->timeMax,
+                        ioStepTime->timeMin);
+            printBufCnt++;
+        }
+    }
+
+    DBG_PrintBuf("\n");
+    printBufCnt++;
+
+    ++(*findObjNum);
+    return printBufCnt;
+}
+
+uint32_t showEvictStateStatInHotpatch(CACHE_BASE_S *baseObj, bool *printTitile, char *filterValue, uint32_t *findObjNum)
+{
+    CACHE_BASE_RECORD_S * cacheBaseRecord = NULL;
+    uint32_t oldState;
+    uint32_t newState;
+    uint32_t readChunkEvent;
+    char * stateStr[ARC_CHUNK_STATE_BUTT + 1] = {"anon","mru","mfu","butt"};
+    char * chunkEvent[RCE_BUTT] = {"RCE_INIT", "RCE_RECOVER", "RCE_READ_HIT", "RCE_READ_PREFETCH_DONE", \
+                                    "RCE_READ_IO_FAIL", "RCE_WRITE_IO_FAIL", "RCE_WRITE_DIRTY", "RCE_DESTAGE_DONE", \
+                                    "RCE_PRE_EVICT", "RCE_EVICT_PAGE", "RCE_EVICT_CHUNK", "RCE_EVICT_CANCEL",   \
+                                    "RCE_PRE_DELETE", "RCE_DELETE_CHUNK", "RCE_DELETE_CANCEL", "RCE_TRANSFER_PRIORITY"};
+    uint32_t printBufCnt = 0;
+    UNREFERENCE_PARAM(filterValue);
+    if (TRUE == *printTitile)
+    {
+        /* ӡע, ÿ4ע */
+        DBG_PrintBuf("  %-30s\n", "read chunk event:");
+        printBufCnt++;
+        for (readChunkEvent = 0; readChunkEvent < RCE_BUTT; readChunkEvent++)
+        {
+            if (0 == readChunkEvent%4)
+            {
+                DBG_PrintBuf("\n  ");
+                printBufCnt++;
+            }
+            DBG_PrintBuf("%-4u%-30s", readChunkEvent, chunkEvent[readChunkEvent]);
+            printBufCnt++;
+        }
+        DBG_PrintBuf("\n");
+        DBG_PrintBuf("\n");
+        printBufCnt+=2;
+        /* ӡ */
+        DBG_PrintBuf("  %-30s", "evict state transfer");
+        printBufCnt++;
+        for (readChunkEvent = 0; readChunkEvent < RCE_BUTT; readChunkEvent++)
+        {
+            DBG_PrintBuf("%-10u", readChunkEvent);
+            printBufCnt++;
+        }
+        DBG_PrintBuf("\n");
+        printBufCnt++;
+
+        /* ӡָ */
+        DBG_PrintBuf("  %-30s", "--------------------");
+        printBufCnt++;
+        for (readChunkEvent = 0; readChunkEvent < RCE_BUTT; readChunkEvent++)
+        {
+            DBG_PrintBuf("%-10s", "--------");
+            printBufCnt++;
+        }
+        DBG_PrintBuf("\n");
+        printBufCnt++;
+        *printTitile = FALSE;
+    }
+
+    cacheBaseRecord = (CACHE_BASE_RECORD_S *)baseObj->cacheBaseRecord;
+    DBG_PrintBuf("  0x%-20llx\n", baseObj->volumeId);
+    printBufCnt++;
+    if (NULL == cacheBaseRecord)
+    {
+        DBG_PrintBuf("  have no evictstate statistics.\n");
+        printBufCnt++;
+        return printBufCnt;
+    }
+
+    /* ӡͳƼ */
+    for (oldState = 0; oldState < ARC_CHUNK_STATE_BUTT; oldState++)
+    {
+        for (newState = 0; newState < ARC_CHUNK_STATE_BUTT + 1; newState++)
+        {
+            DBG_PrintBuf("  %-5s%-5s%-20s", stateStr[oldState], "--->", stateStr[newState]);
+            printBufCnt++;
+            for (readChunkEvent = 0; readChunkEvent < RCE_BUTT; readChunkEvent++)
+            {
+                DBG_PrintBuf("%-10llu", atomic64_read(&cacheBaseRecord->arcStatInfo.arcStateTransfer[oldState][newState][readChunkEvent]));
+                printBufCnt++;
+            }
+            DBG_PrintBuf("\n");
+            printBufCnt++;
+        }
+    }
+    DBG_PrintBuf("\n");
+    printBufCnt++;
+
+    ++(*findObjNum);
+    return printBufCnt;
+}
+
+uint32_t showCacheBaseForceMirrorInfoInHotpatch(CACHE_BASE_S *baseObj, bool *printTitile, char *filterValue, uint32_t *findObjNum)
+{
+    int32_t forceMirrorChunkNum;
+    uint32_t printBufCnt = 0;
+    UNREFERENCE_PARAM(filterValue);
+
+    if (TRUE == *printTitile)
+    {
+        DBG_PrintBuf("  %-20s%-26s%-26s\n",
+            "volumeid", "forceMirrorChunkNum", "forceMirrorResult");
+
+		DBG_PrintBuf("  %-20s%-26s%-26s\n",
+            "--------", "-------------------", "-----------------");
+        printBufCnt += 2;
+        *printTitile = FALSE;
+    }
+
+    ++(*findObjNum);
+
+    forceMirrorChunkNum = atomic_read(&baseObj->forceMirrorChunkNum);
+    if (forceMirrorChunkNum > 0 || RETURN_OK != baseObj->forceMirrorResult)
+    {
+        DBG_PrintBuf("  0x%-20llx%-26d%-26d\n",
+                  baseObj->volumeId,
+                  forceMirrorChunkNum,
+                  baseObj->forceMirrorResult);
+        printBufCnt++;
+    }
+
+    return printBufCnt;
+}
+
+uint32_t showCacheBaseSwitchInHotpatch(CACHE_BASE_S *baseObj, bool *printTitile, char *filterValue, uint32_t *findObjNum)
+{
+    bool tmpFilter = (0 == strcmp(filterValue, "nomirrorlun") ||0 == strcmp(filterValue, "singlectrl"));
+    uint32_t printBufCnt = 0;
+    if (FALSE == filterShowCacheBaseSwitch(baseObj, filterValue))
+    {
+        return printBufCnt;
+    }
+
+    if (TRUE == *printTitile)
+    {
+       if ( tmpFilter )
+        {
+            DBG_PrintBuf("  %-8s%-22s%-14s%-14s%-14s\n",
+            "lunid", "volumeid", "writeMirror", "localCtrl",  "workmode");
+
+            DBG_PrintBuf("  %-8s%-22s%-14s%-14s%-14s\n",
+            "-----", "--------", "-----------", "---------", "----------");
+            printBufCnt += 2;
+        }
+       else
+        {
+            DBG_PrintBuf("  %-22s%-14s%-14s%-14s%-14s%-14s%-14s%-14s%-14s%-14s%-14s%-14s\n",
+                "volumeid", "writeThrough", "writeMirror", "localCtrl", "readMirror", "asyncPrefetch", "stopRcvIo", "inForceMirror","normalDsg","sysDsg", "hangWaitAlloc", "workmode");
+
+            DBG_PrintBuf("  %-22s%-14s%-14s%-14s%-14s%-14s%-14s%-14s%-14s%-14s%-14s%-14s\n",
+                "--------", "------------", "-----------", "---------", "----------", "-----------", "---------", "------------", "------------", "------------", "------------", "---------");
+            printBufCnt += 2;
+        }
+
+
+       *printTitile = FALSE;
+    }
+
+    ++(*findObjNum);
+
+    if (tmpFilter)
+    {
+        DBG_PrintBuf("  %-8u%-22llu%-14d%-14d%-14d\n",
+                      GET_VOL_LUN_ID(baseObj->volumeId),
+                      baseObj->volumeId,
+                      baseObj->writeMirror,
+                      baseObj->localCtrl,
+                      baseObj->workMode);
+        printBufCnt++;
+    }
+    else
+    {
+        DBG_PrintBuf("  0x%-20llx%-14d%-14d%-14d%-14d%-14d%-14d%-14d%-14d%-14d%-14d%-14d\n",
+                      baseObj->volumeId,
+                      baseObj->writeThrough,
+                      baseObj->writeMirror,
+                      baseObj->localCtrl,
+                      baseObj->readMirror,
+                      baseObj->isAsyncPrefetchOpen,
+                      baseObj->stopRcvIo,
+                      baseObj->isInForceMirror,
+                      baseObj->isNormalDsgOpen,
+                      baseObj->isSysDsgOpen,
+                      baseObj->isHangWaitAlloc,
+                      baseObj->workMode);
+        printBufCnt++;
+    }
+    return printBufCnt;
+}
+
+
+typedef uint32_t (*QueryBaseFunc)(CACHE_BASE_S *baseObj, bool *printTitile, char *filterValue, uint32_t *findObjNum);
+typedef struct{
+	char *type;
+	QueryBaseFunc filterFunc;
+}FILTER_OBJ_OPT;
+
+FILTER_OBJ_OPT g_queryCacheBaseFilter[] = 
+{
+	{"base", showCacheBaseSimpleInfoInHotpatch},
+	{"cnt", showCacheBaseCntInHotpatch},
+	{"destage", NULL}, 
+	{"read", showCacheBaseReadInfoInHotpatch}, 
+	{"forcemirror", showCacheBaseForceMirrorInfoInHotpatch},
+	{"switch", showCacheBaseSwitchInHotpatch},
+	{"iosteptime", showIoStepTimeInHotpatch},
+	{"arcstate", showEvictStateStatInHotpatch},
+};
+
+uint32_t checkFilterParameter(char *filterType, FILTER_OBJ_OPT *ops, uint32_t typeNum)
+{
+    uint32_t index = 0;
+    if(NULL == filterType || NULL == ops)
+    {
+        return INVALID_VALUE32;
+    }
+    for(index = 0; index < typeNum; index++)
+    {
+        if(0 == strcmp(filterType, ops[index].type))
+        {
+            if(ops[index].filterFunc != NULL)
+            {
+                return index;
+            }
+            else
+            {
+                return INVALID_VALUE32;
+            }
+        }
+    }
+    return INVALID_VALUE32;
+}
+
+uint32_t checkFilterParameter(char *filterType, FILTER_OBJ_OPT *ops, uint32_t typeNum);
+/**************************************************************************
+     :  ʾеCACHE
+ :  
+ :  
+ ֵ  :  
+     :  
+**************************************************************************/
+int32_t showAllCacheBaseInHotpatch(BASE_TYPE_E baseType, uint32_t baseCnt, char *filterType, char *filterValue)
+{
+    //CACHE_OBJ_S *cacheObj = NULL;
+    CACHE_BASE_S *baseObj = NULL;
+    bool printTitle = TRUE;         // Ƿӡ
+    uint32_t findObjNum = 0;
+    char *baseTypeChar = (BASE_TYPE_VOLUME_CACHE == baseType) ? "Volume cache base" : "Stripe cache base";
+    CACHE_OBJ_S *cacheObj = NULL;
+    uint32_t opsIndex = INVALID_VALUE32;
+    FILTER_OBJ_OPT *queryOps = g_queryCacheBaseFilter;
+    uint32_t printBufCnt = 0;
+    opsIndex = checkFilterParameter(filterType, queryOps, ARRAY_LEN(g_queryCacheBaseFilter));
+    if(INVALID_VALUE32 == opsIndex)
+    {
+        DBG_Print("ERROR: Invalid or nonsupport options input: [%s]\n", filterType);
+        return RETURN_ERROR;
+    }
+
+    GET_NEXT_CACHE_OBJ_START(cacheObj);
+        baseObj = (BASE_TYPE_VOLUME_CACHE == baseType) ? cacheObj->volumeCache : cacheObj->stripeCache;
+        if (NULL != baseObj && queryOps[opsIndex].filterFunc != NULL)
+        {
+            printBufCnt += queryOps[opsIndex].filterFunc(baseObj, &printTitle, filterValue, &findObjNum);
+        }
+    GET_NEXT_CACHE_OBJ_FOR_DIAG_END((findObjNum >= baseCnt), printBufCnt)
+    DBG_Print("Find %s num(%d): \n", baseTypeChar, findObjNum);
+
+    return RETURN_OK;
+}
+int32_t showAllCacheObjInHotpatch(void)
+{
+    CACHE_OBJ_S *cacheObj = NULL;
+    uint32_t printBufCnt = 0;
+    DBG_Print("--------------------------------------------------------Cache Obj List-------------------------------------------------\n");
+    DBG_Print("%-25s%-10s%-25s%-25s%-12s%-25s%-25s\n", "  cacheObj", "poolId", "volumeId", "volumeSize", "volumeType", "grainSize", "cowSize");
+    DBG_Print("%-25s%-10s%-25s%-25s%-12s%-25s%-25s\n", "  ------------------", "------", "------------------", "----------", "----------", "---------", "-------");
+
+    GET_NEXT_CACHE_OBJ_START(cacheObj);
+        DBG_PrintBuf("  0x%-21p", cacheObj);
+        DBG_PrintBuf("%-10u",     cacheObj->poolId);
+        DBG_PrintBuf("0x%-23llx", cacheObj->volumeId);
+        DBG_PrintBuf("%-25llu",   cacheObj->volumeSize);
+        DBG_PrintBuf("%-12s",     g_volumeCacheTypeStr[cacheObj->volumeType]);
+        printBufCnt += 5;
+        if (NULL != cacheObj->volumeCache)
+        {
+            DBG_PrintBuf("%-25d",     cacheObj->volumeCache->grainSize);
+            DBG_PrintBuf("%-25d",     cacheObj->volumeCache->cowSize);
+            printBufCnt += 2;
+        }
+        else if (NULL != cacheObj->stripeCache)
+        {
+            DBG_PrintBuf("%-25d",     cacheObj->stripeCache->grainSize);
+            DBG_PrintBuf("%-25d",     cacheObj->stripeCache->cowSize);
+            printBufCnt += 2;
+        }
+        else
+        {
+            DBG_PrintBuf("%-25d",     0);
+            DBG_PrintBuf("%-25d",     0);
+            printBufCnt += 2;
+        }
+
+        DBG_PrintBuf("\n");
+        printBufCnt += 1;
+    GET_NEXT_CACHE_OBJ_FOR_DIAG_END(NO_CONDITITION, printBufCnt)
+
+    return RETURN_OK;
+}
+
--- ./source/private_module/ramcache/public/fmea/cache_fmea.c	2018-02-09 13:47:03.000000000 +0000
+++ ./source/private_module/ramcache/public/fmea/cache_fmea.c.hotpatch	2018-08-31 09:26:08.000000000 +0000
@@ -31,16 +31,16 @@
 #ifdef __cplusplus
 extern "C" {
 #endif /* #ifdef __cplusplus */
-
-//int32_t g_CacheFmeaInitFlg = CACHE_FMEA_INIT_STAT_INVALID;
 CACHE_IO_COUNTER_S g_forceMirrorIocBefore;
 CACHE_IO_COUNTER_S g_forceMirrorIocBeforeRev;
 extern atomic_t g_isSysDoForceDsg[BASE_TYPE_BUTT];
 extern atomic_t g_curVolCacheForceMirrorIoNum;
 extern atomic_t g_curStpCacheForceMirrorIoNum;
-
 bool g_openCacheFMEA = FALSE;
-
+#define GET_NEXT_CACHE_OBJ_START(cacheObj) do{ uint32_t hashId = 0; uint32_t iterNum = 0; uint32_t objSum = 0; uint32_t cycleCount = 0; for(hashId = 0; hashId < 127; hashId++) { SPIN_LOCK_LIST_HEAD_S *objList = NULL; struct list_head * curNode = NULL; iterNum = 0; objList = getGlobalListByHashId(hashId); objSum = spinLockListCount(objList); while(iterNum < objSum) { iterNum++; cacheObj = NULL; lockCacheObjGlobalList();  \
+    if(isAllowCreateCacheObj()) { curNode = spinLockListCutFirstNodeNoLock(objList); if(NULL != curNode) { spinLockListAddTailNoLock(curNode, objList); cacheObj = list_entry(curNode, CACHE_OBJ_S, objNode);
+#define GET_NEXT_CACHE_OBJ_END(conditition) } } unlockCacheObjGlobalList(); if(conditition){ break; } if(cycleCount++ >100){cycleCount = 0;LVOS_usleep(10);} } if(conditition){ break; } } }while(0);
+extern bool isAllowCreateCacheObj(void);extern SPIN_LOCK_LIST_HEAD_S *getGlobalListByHashId(uint32_t hashId);
 /**************************************************************************
      : üʧܽ
  : HEAL_CBRETURN_S *healParam  
@@ -174,22 +174,22 @@
 {
     CACHE_OBJ_S *cacheObj = NULL;
     bool ret = NEQUAL;
-
-    if(FALSE == g_openCacheFMEA 
+    bool breakCondi = FALSE;
+    if(FALSE == g_openCacheFMEA
         ||((0 == atomic_read(&g_isSysDoForceDsg[BASE_TYPE_VOLUME_CACHE]))
         && (0 == atomic_read(&g_isSysDoForceDsg[BASE_TYPE_STRIPE_CACHE]))))
     {
         return ret;
     }
 
-    while (NULL != (cacheObj = getNextCacheObj(cacheObj)))
-    {
+    GET_NEXT_CACHE_OBJ_START(cacheObj);
+
         if(NULL != cacheObj->volumeCache)
         {
             ret = checkLastAndCurCnt(cacheObj->volumeCache);
             if(NEQUAL == ret)
             {
-                return ret;
+                breakCondi = TRUE;
             }
         }
         if(NULL != cacheObj->stripeCache)
@@ -197,10 +197,10 @@
             ret = checkLastAndCurCnt(cacheObj->stripeCache);
             if(NEQUAL == ret)
             {
-                return ret;
+                breakCondi = TRUE;
             }
         }
-    }
+    GET_NEXT_CACHE_OBJ_END(breakCondi)
     return ret;
 }
 
--- ./source/private_module/ramcache/public/statistics/cache_statistics.c	2018-04-19 08:39:02.000000000 +0000
+++ ./source/private_module/ramcache/public/statistics/cache_statistics.c.hotpatch	2018-08-31 09:26:08.000000000 +0000
@@ -3344,11 +3344,11 @@
     (void)FTDS_REG_IO_REC_FMT(CACHE_FTDS_RECORD_SPACE_CACHE_WRITE, g_cacheIORecordFormat);
     return;
 }
-
 extern void unRegisterTimeoutTrace(bool isCpuHigh, bool isDelFile);
 uint8_t g_traceCpuUsageInfo[3] = {0};
 uint8_t g_traceCpuCount = 0;
 uint64_t g_traceCpuIocount = 0;
+uint8_t g_traceCpuThreshold = 80;
 /*****************************************************************************
      : CACHE_InitStat
    : ʼͳģ
@@ -3387,9 +3387,9 @@
         }
 
         g_traceCpuCount = traceCpuCount;
-        if (total/3 >= 60)
+        if (total/3 >= g_traceCpuThreshold)
         {
-            CACHE_LOGINFO_LIMIT(CACHE_LOG_ID_4118, "Cpu is %u big than 60, stop iotrace!", total/3);
+            CACHE_LOGINFO_LIMIT(CACHE_LOG_ID_4118, "Cpu is %u big than %u, stop iotrace!",total/3, g_traceCpuThreshold );
             unRegisterTimeoutTrace(B_TRUE, B_FALSE);
             return;
         }
