--- ./source/private_module/drm/feature/slow_disk_detect/drm_slow_disk_detect.c	2018-03-21 09:07:29.000000000 +0000
+++ ./source/private_module/drm/feature/slow_disk_detect/drm_slow_disk_detect.c.hotpatch	2018-12-27 11:21:54.000000000 +0000
@@ -1057,7 +1057,7 @@
     
     return avgValue;
 }
-
+bool drmJudgeIsDiskInLowLoad(DISK_TYPE_E type, uint32_t logicId);
 /*DTS2018010606484 modify by m90005436 20180130 begin*/
 /**
 * @brief    жƽʱǷȫ0
@@ -1085,7 +1085,7 @@
     }
     return ret;
 }
-/*DTS2018010606484 modify by m90005436 20180130 end*/
+int32_t drmSlowDiskGetZoneAbnormalAvgTime(DISK_TYPE_E type, uint32_t *time);
 /**************************************************************************
 :drmZoneFindSlowCycleOfDisk
 :  ƽʱ̵ƽʱ
@@ -1102,44 +1102,45 @@
     struct list_head *n = NULL;
     uint8_t currentIndex = zoneInfo->zoneCycleIndex;
     int32_t ret = RETURN_OK;
+    uint32_t zoneAbnoramlAvgTime = INVALID_VALUE32;
     
-    /*ͨƽʱж*/
     spin_lock(&zoneInfo->zoneLock);
+    if (RETURN_OK != drmSlowDiskGetZoneAbnormalAvgTime((DISK_TYPE_E)zoneInfo->zoneDiskType, &zoneAbnoramlAvgTime))
+    {
+        BDM_PRINT_LIMIT_PERIOD(60*60*HZ, 1, DBG_LOG_INFO, DBG_LOG_BUTT, "Get Zone abnormal avg time for disk type(%d) fail.", zoneInfo->zoneDiskType); 
+    }
+    
     list_for_each_safe(pos, n, &zoneInfo->zoneHead) 
     {
         diskInfo = list_entry(pos, DISK_LOGIC_ID_S, node);
-
-        if (RETURN_OK != getFeatureLocPrivateData(diskInfo->logicId, FEATURE_SLOW_DISK_ID, (void**)&diskData)
-            || NULL == diskData)
+        if (RETURN_OK != getFeatureLocPrivateData(diskInfo->logicId, FEATURE_SLOW_DISK_ID, (void**)&diskData)|| NULL == diskData)
         {
             continue;
         }
          
         SMART_TP_CALL(DRM_SLOW_DISK_NOT_UPDATE_SLOW_CYCLE,&ret);
-        /*˴жΪģTP㣬òıڱ*/
-        if (RETURN_ERROR == ret)
+        if (RETURN_ERROR == ret)/*˴жΪģTP㣬òıڱ*/
         {
             continue;
         }
-
-        /*DTS2018010606484 modify by m90005436 20180130 begin*/
         diskData->isZeroStatistics = drmZoneDiskDataIsAllZero(diskData);
-        /*DTS2018010606484 modify by m90005436 20180130 end*/
-        /*ƽֵΪ0ֵ򲻼ͳ*/
-        if (0 == zoneAvgTime)
+        if (0 == zoneAvgTime || zoneAvgTime >= zoneAbnoramlAvgTime)/*ƽֵΪ0ֵƽֵܴʱ򲻼ͳ*/
+        {
+            diskData->isSlowCycle[currentIndex] = 0; 
+            continue;
+        }
+        /*͸ж*/
+        if (TRUE == drmJudgeIsDiskInLowLoad((DISK_TYPE_E)zoneInfo->zoneDiskType,diskInfo->logicId))
         {
             diskData->isSlowCycle[currentIndex] = 0; 
             continue;
         }
-        
         /*Ϊ*/
-        if (((diskData->avgServTime[currentIndex] >= zoneAvgTime * g_drmSlowDiskFeatureConfig.drmThresholdMultip * g_drmConfigWeight[zoneInfo->zoneDiskType].drmThresholdMultipWeight)
+        if ((diskData->avgServTime[currentIndex] >= zoneAvgTime * g_drmSlowDiskFeatureConfig.drmThresholdMultip * g_drmConfigWeight[zoneInfo->zoneDiskType].drmThresholdMultipWeight)
             &&(diskData->avgServTime[currentIndex] > (g_drmSlowDiskFeatureConfig.drmMinThresholdValue * DRM_MILLISEC_TO_USEC * g_drmConfigWeight[zoneInfo->zoneDiskType].drmMinThresholdValueWeight)))
-            ||(diskData->avgServTime[currentIndex] > (g_drmSlowDiskFeatureConfig.drmMaxThresholdValue * DRM_MILLISEC_TO_USEC * g_drmConfigWeight[zoneInfo->zoneDiskType].drmMaxThresholdValueWeight)))
         {
             /**/
             diskData->isSlowCycle[currentIndex] = 1; 
-            
             #ifdef _DEBUG
             DBG_LogInfo(DBG_LOG_BUTT, "Have one slow cycle,disk(%u),diskAvg(%u)us,zoneAvg(%u)us.", diskInfo->logicId, diskData->avgServTime[currentIndex], zoneAvgTime);
             #else
@@ -1153,7 +1154,6 @@
         
     }
     spin_unlock(&zoneInfo->zoneLock);
-
     return;
 }
 
@@ -1965,4 +1965,114 @@
     return RETURN_OK;
 }
 
+/******************͸¿ܻ***********************/
+#define COMM_ZONE_ABORMAL_AVG_TIME_HDD (30 * DRM_MILLISEC_TO_USEC) /*ms*/ 
+#define COMM_ZONE_ABORMAL_AVG_TIME_SSD (1 * DRM_MILLISEC_TO_USEC) /*ms*/ 
+#define DRM_GET_DISK_IOPS_INTERVAL (5) /*ȡӲƽʱ*/
+#define DRM_HDD_LOW_LOAD_THRESHOLD (10) /*HDDIOPS=10жΪ͸*/
+#define DRM_SSD_LOW_LOAD_THRESHOLD (50) /*SSDIOPS=50жΪ͸*/
+
+/*͸жֵ*/
+uint32_t g_drmDiskLowLoadThreshold[] = 
+{
+    DRM_HDD_LOW_LOAD_THRESHOLD, /*DISK_TYPE_FC*/
+    DRM_HDD_LOW_LOAD_THRESHOLD, /*DISK_TYPE_SAS*/
+    DRM_HDD_LOW_LOAD_THRESHOLD, /*DISK_TYPE_SATA*/
+    DRM_SSD_LOW_LOAD_THRESHOLD, /*DISK_TYPE_SSD*/
+    DRM_HDD_LOW_LOAD_THRESHOLD, /*DISK_TYPE_NL_SAS*/
+    DRM_SSD_LOW_LOAD_THRESHOLD, /*DISK_TYPE_SLC_SSD*/
+    DRM_SSD_LOW_LOAD_THRESHOLD, /*DISK_TYPE_MLC_SSD*/
+    DRM_HDD_LOW_LOAD_THRESHOLD, /*DISK_TYPE_FC_SED*/
+    DRM_HDD_LOW_LOAD_THRESHOLD, /*DISK_TYPE_SAS_SED*/
+    DRM_HDD_LOW_LOAD_THRESHOLD, /*DISK_TYPE_SATA_SED*/
+    DRM_SSD_LOW_LOAD_THRESHOLD, /*DISK_TYPE_SSD_SED*/
+    DRM_HDD_LOW_LOAD_THRESHOLD, /*DISK_TYPE_NL_SAS_SED*/
+    DRM_SSD_LOW_LOAD_THRESHOLD, /*DISK_TYPE_SLC_SSD_SED*/
+    DRM_SSD_LOW_LOAD_THRESHOLD, /*DISK_TYPE_MLC_SSD_SED*/
+    DRM_SSD_LOW_LOAD_THRESHOLD  /*DISK_TYPE_NVME_SSD*/
+};
+
+/*ƽʱ쳣ֵ*/
+uint32_t g_drmZoneAbnormalAvgTimeLimit[] = 
+{
+    COMM_ZONE_ABORMAL_AVG_TIME_HDD, /*DISK_TYPE_FC*/
+    COMM_ZONE_ABORMAL_AVG_TIME_HDD, /*DISK_TYPE_SAS*/
+    COMM_ZONE_ABORMAL_AVG_TIME_HDD, /*DISK_TYPE_SATA*/
+    COMM_ZONE_ABORMAL_AVG_TIME_SSD, /*DISK_TYPE_SSD*/
+    COMM_ZONE_ABORMAL_AVG_TIME_HDD, /*DISK_TYPE_NL_SAS*/
+    COMM_ZONE_ABORMAL_AVG_TIME_SSD, /*DISK_TYPE_SLC_SSD*/
+    COMM_ZONE_ABORMAL_AVG_TIME_SSD, /*DISK_TYPE_MLC_SSD*/
+    COMM_ZONE_ABORMAL_AVG_TIME_HDD, /*DISK_TYPE_FC_SED*/
+    COMM_ZONE_ABORMAL_AVG_TIME_HDD, /*DISK_TYPE_SAS_SED*/
+    COMM_ZONE_ABORMAL_AVG_TIME_HDD, /*DISK_TYPE_SATA_SED*/
+    COMM_ZONE_ABORMAL_AVG_TIME_SSD, /*DISK_TYPE_SSD_SED*/
+    COMM_ZONE_ABORMAL_AVG_TIME_HDD, /*DISK_TYPE_NL_SAS_SED*/
+    COMM_ZONE_ABORMAL_AVG_TIME_SSD, /*DISK_TYPE_SLC_SSD_SED*/
+    COMM_ZONE_ABORMAL_AVG_TIME_SSD, /*DISK_TYPE_MLC_SSD_SED*/
+    COMM_ZONE_ABORMAL_AVG_TIME_SSD  /*DISK_TYPE_NVME_SSD*/
+};
+
+/*ȡ쳣жƽʱ*/
+int32_t drmSlowDiskGetZoneAbnormalAvgTime(DISK_TYPE_E type, uint32_t *time)
+{
+    if (NULL == time || type >= DISK_TYPE_BUTT) 
+    {
+        DBG_LogError(DBG_LOG_BUTT, "Input type(%d), time(%p) invalid.", type, time);
+        return RETURN_ERROR;
+    }
+
+    *time = g_drmZoneAbnormalAvgTimeLimit[type];
+
+    return RETURN_OK;
+}
+
+/*ȡ豸IOPS*/
+int32_t drmGetDevIops(uint32_t logicId, uint32_t *iops)
+{
+    uint32_t sdId = INVALID_VALUE32;
+    SD_SCSI_DEVICE_S *dev = NULL;
+    SIO_QUEUE_S *queue = NULL;
+    int32_t ret = RETURN_ERROR;
+
+    *iops = 0;
+    
+    sdId = drmGetDiskScsiDeviceId(logicId); 
+    if(INVALID_VALUE32 == sdId)
+    {
+        return RETURN_ERROR;
+    }
+
+    dev = SD_DEVICE_LOOK_UP(sdId);
+    if (NULL == dev)
+    {
+        return RETURN_ERROR; 
+    }
+
+    queue = SIO_DEV_TO_QUEUE(dev);
+
+    ret = sioGetDevIops((void*)queue, DRM_GET_DISK_IOPS_INTERVAL, iops);
+
+    SD_PUT_DEVICE(dev);
+
+    return ret;
+}
+
+/*ȡ̵͸жֵ*/
+bool drmJudgeIsDiskInLowLoad(DISK_TYPE_E type, uint32_t logicId)
+{
+    uint32_t iops = 0;
+    
+    if ( type >= DISK_TYPE_BUTT) 
+    {
+        return TRUE;
+    }
+
+    if (RETURN_OK != drmGetDevIops(logicId, &iops))
+    {
+        return TRUE;
+    }
+
+    return g_drmDiskLowLoadThreshold[type] >= iops ? TRUE: FALSE;
+}
+
 
