--- ./source/private_module/epl/V3/epl_physic_dev.c	2018-03-10 06:52:19.000000000 +0000
+++ ./source/private_module/epl/V3/epl_physic_dev.c.hotpatch	2021-05-14 04:28:17.000000000 +0000
@@ -8891,6 +8891,10 @@
 * ֵ  : 
 *     : ״̬OKĸ·Ϊ Ҫ̽ⱨ
 **************************************************************************/
+bool isBDMPortPolicyOpen(uint32_t linkId);
+bool isBDMOpenFromConfig(void);
+uint32_t g_refreshCnt = 0;
+bool g_isBdmOpen = FALSE;
 void eplSendDetectForeachLink(EPL_LOGIC_ARRAY_S *ldev)
 {
     uint32_t linkId = INVALID_VALUE32;
@@ -8898,54 +8902,50 @@
     uint16_t ctrlId = eplGetLocalNid();
     int32_t isAllLinksDegrade = FALSE;
     EPL_LOGIC_LINK_S* logicLink = NULL;
-
-    isAllLinksDegrade = eplIsAllLinkDegradeInArray(ldev->arrayId);
-    
+    g_refreshCnt++;
+    if (g_refreshCnt % EPL_ALL_DEGRADE_DETECT_RATIO == 0) {  // 1SһBDMء
+        g_isBdmOpen = isBDMOpenFromConfig();
+        g_refreshCnt = 0;
+    }
+    isAllLinksDegrade = eplIsAllLinkDegradeInArray(ldev->arrayId);    
     for (linkIdx = 0; linkIdx < EPL_MAX_CLINK; linkIdx++)
     {
         linkId = EPL_GEN_LINK_ID(ldev->arrayId, ctrlId, linkIdx);
         logicLink = eplGetLogicLinkWithLdev(ldev, linkId);
-        if (NULL == logicLink)
-        {
+        if (NULL == logicLink) {
             continue;
         }
         
-        if (EPL_DEV_GET_READY != logicLink->status)
-        {
+        if (EPL_DEV_GET_READY != logicLink->status) {
             continue;
         } 
         
-        if (0 == eplGetVirtualLoadInfo(linkId))
-        {
+        if (0 == eplGetVirtualLoadInfo(linkId)) {
             continue;
         }
         else //·ڽ״̬40min͸澯
         {
             eplIncLinkDegradeTimeCnt(ldev, linkId);
-        }
-        
-        // ·̽ⱨ, δȫʱ,ǰ·н̽ⱨ
-        if (isAllLinksDegrade)            
-        {
+        }        
+        if (isAllLinksDegrade) {
             eplRecoverLinkLoadInfo(linkId);
-            if (0 == g_eplFlowctrl.times % EPL_ALL_DEGRADE_DETECT_RATIO)
-            {
+            if (0 == g_eplFlowctrl.times % EPL_ALL_DEGRADE_DETECT_RATIO) {
                 eplSendDetectRequest(linkId);
             }
         }       
-        else                              
-        {
-            //·̽EBC
-            eplSendDetectRequest(linkId);
-        }
-        
-        // ָErrIOʱIOý
-        if (eplGetLinkErrIOInRecoverPeriod(linkId))
-        {
+        else {
+            if (isBDMPortPolicyOpen(linkId)) {
+                if (0 == g_eplFlowctrl.times % EPL_ALL_DEGRADE_DETECT_RATIO) {
+                    eplSendDetectRequest(linkId);
+                }                
+            } else {
+                eplSendDetectRequest(linkId);
+            }
+        }        
+        if (eplGetLinkErrIOInRecoverPeriod(linkId)) {
             eplSetMaxVirtualLoad(linkId);
         }           
     }
-    
     return;
 }
 /**************************************************************************
@@ -9119,4 +9119,46 @@
     }
     return INVALID_VALUE32;
 }
+#include <customize.h>
+bool isBDMOpenFromConfig(void)
+{    
+    bool resetSwitch = FALSE;
+    CST_ITEM_T item;
+
+    memset(&item, 0, sizeof(item));
+    /* ĬΪأ0ʾ0ʾأĬֵ */
+    if (CST_GetItem("PERFORMANCE_DEFAULT", "DmpMaxSendToPeerSectorNum", &item)) {
+        resetSwitch = LVOS_StrToU64(item.acValue) > 0 ? FALSE : TRUE;        
+        DBG_LogDebug(DBG_LOGID_NEW, "The switch is %u.0:close, 1:open", resetSwitch);
+        return resetSwitch;
+    }
+    return FALSE;
+}
+
+bool isBDMPortPolicyOpen(uint32_t linkId)
+{
+    uint32_t linkType = EPL_TRANS_ISCSI;
+    int ret = RETURN_ERROR;
+    /* ˫·ʹøù */
+    if (eplIsNeedPrioQueue(linkId)) {        
+        DBG_LogDebug(DBG_LOGID_NEW, "The link(%u) is hyperMetro.", linkId);
+        return FALSE;
+    }
+    ret = eplGetLinkTypeById(linkId, &linkType);
+    if (ret != RETURN_OK) {
+        return FALSE;
+    }
+    if (linkType != EPL_TRANS_FC) {
+        return FALSE;
+    }    
+    return g_isBdmOpen;
+}
+
+bool isBDMPortPolicyOpenForInValid(uint32_t linkId)
+{
+    if (linkId == INVALID_VALUE32) {        
+        return g_isBdmOpen;
+    }
+    return isBDMPortPolicyOpen(linkId);
+}
 
--- ./source/private_module/epl/V3/epl_pio.c	2018-04-19 08:34:02.000000000 +0000
+++ ./source/private_module/epl/V3/epl_pio.c.hotpatch	2021-05-14 04:28:17.000000000 +0000
@@ -1801,6 +1801,7 @@
 *           : ʧ
 *     : 
 **************************************************************************/
+bool eplIsNeedContinue(REQ_S *req, uint32_t linkId);
 static int32_t eplSelectLogicLink(EPL_LOGIC_ARRAY_S *ldev,
                                REQ_S *req, 
                                uint32_t *sdev,
@@ -1821,7 +1822,7 @@
     uint32_t minLink[EPL_LOGIC_LINK_PER_CTRL] = {0};
     uint32_t minCount = 0;
     int32_t isAllDegraded = FALSE;
-    
+    bool isLinkNeedCtrl = FALSE;    
     *sdev = INVALID_VALUE32;
     *linkId = INVALID_VALUE32;
     pio = EPL_GET_PIO(req);
@@ -1830,7 +1831,6 @@
     localNid = eplGetLocalNid();
     isAllDegraded = eplIsLocalAllLinkDegraded(ldev->arrayId, localNid);
     logicCtrl = &ldev->ctrl[localNid];
-
     for (index = 0; index < (EPL_LOGIC_LINK_PER_CTRL); index++)
     {
         linkIdx = index % EPL_LOGIC_LINK_PER_CTRL;
@@ -1870,10 +1870,10 @@
                 (((logicLink->maxLoad/EPL_LOAD_UPDATE_TIMES_PER_SEC) * degradeRatio)/EPL_MAX_QUALITY_RATIO);
         }*/
         linkVirLoad = eplGetVirtualLoadInfo(logicLink->linkId);
+        isLinkNeedCtrl = (!eplIsFlowCtrlIo(req) || eplIsNeedContinue(req, logicLink->linkId));
         if ((FALSE == isAllDegraded) 
             && (linkVirLoad > 0)
-            && (!eplIsFlowCtrlIo(req)))
-        {
+            && (isLinkNeedCtrl)){
             continue;
         }        
 
@@ -2168,6 +2168,7 @@
 * ֵ  : Ƿɹ
 *     : 
 **************************************************************************/
+extern bool isBDMPortPolicyOpenForInValid(uint32_t linkId);
 void eplSetBdmPrivateInfo(REQ_S *req, REQ_S *childReq)
 {
     uint64_t lunId = INVALID_VALUE64;
@@ -2175,9 +2176,9 @@
     EPL_PRIVATE_IO_S *pio = NULL;
     EPL_RSS_PARAM_S rssInfo;
     memset(&rssInfo,0,sizeof(rssInfo));
+    uint32_t bdmFlagTmp = 59;
 
-    pio = EPL_GET_PIO(req);
-    
+    pio = EPL_GET_PIO(req);    
     sdSetPrivateIoCtrlFlag(childReq, pio->childReqIoCtrlFlag);
     
     // BDM Deadlineʱ
@@ -2185,8 +2186,7 @@
 
     // BDMdeadlineʱ, λjiffies.
     ret = sdFillDeadLine2Req(childReq, (uint64_t)pio->childReqDeadTime);
-    if (RETURN_OK != ret)
-    {
+    if (RETURN_OK != ret) {
         EPL_SUBSYS_PRINT_LIMIT_PERIOD(EPL_PRINT_INTERVAL,
                                       EPL_PRINT_BURST, 
                                       DBG_LOG_ERROR, 
@@ -2197,19 +2197,17 @@
     }
     
     lunId = GET_DEVLUN_ID_BY_PRIVATE_LUNID(req->objectId);
-    if (OP_OBJSET_REP_WRITE == req->opCode)
-    {
+    if (OP_OBJSET_REP_WRITE == req->opCode) {
         lunId = EPL_LSD(req->objectId);
     }
-
     if (EPL_REQ_RSS_EBC == pio->reqType)
     {
         // EBCBDMŶӷʽ
-        if (pio->extension.ebcMsgInfo.msgAddrs.ebcPriority <= EBC_PRIO_MID)
+        if (pio->extension.ebcMsgInfo.msgAddrs.ebcPriority <= EBC_PRIO_MID) 
         {
             eplSetReqFlag(childReq, BDM_REQ_FLAG_BG_RSS_IO);
         }
-        else
+        else 
         {
             eplSetReqFlag(childReq, BDM_REQ_FLAG_FG_RSS_IO);
         }
@@ -2219,11 +2217,16 @@
         lunId = (uint64_t)EPL_LUNID_FOR_RSS;
     }
 
-    if (EPL_REQ_INNER_EBC == pio->reqType)
-    {
+    if (EPL_REQ_INNER_EBC == pio->reqType) {
         eplSetReqFlag(childReq, BDM_REQ_FLAG_FG_RSS_IO);
         eplSetReqFlag(childReq, BDM_REQ_CTRL_FLAG_LONG_BLOCK);
         eplSetReqFlag(childReq, BDM_REQ_CTRL_FLAG_NO_DIF_PROTECT);    
+        if (isBDMPortPolicyOpenForInValid(pio->linkId)) {                
+            DBG_LogDebug(EPL_LOG_ID_0494, "Set Link(%u) inner EBC new flag(%u) to BDM.", 
+                         pio->linkId, bdmFlagTmp);
+            eplSetReqFlag(childReq, bdmFlagTmp);                                    
+        }
+    
         lunId = (uint64_t)EPL_LUNID_FOR_RSS;
     }
 
@@ -2243,16 +2246,13 @@
     else
     {
         /* ʾIODIFԣתΪBDMı. */
-        if (TEST_REQ_CTRL_FLAG(req, REQ_CTRL_FLAG_LONG_BLOCK))
-        {
+        if (TEST_REQ_CTRL_FLAG(req, REQ_CTRL_FLAG_LONG_BLOCK)) {
             eplSetReqFlag(childReq, BDM_REQ_CTRL_FLAG_LONG_BLOCK);
         }
-        if (TEST_REQ_CTRL_FLAG(req, REQ_CTRL_FLAG_NO_DIF_PROTECT))
-        {
+        if (TEST_REQ_CTRL_FLAG(req, REQ_CTRL_FLAG_NO_DIF_PROTECT)) {
             eplSetReqFlag(childReq, BDM_REQ_CTRL_FLAG_NO_DIF_PROTECT);
         }
-        if (TEST_REQ_CTRL_FLAG(req, REQ_CTRL_FLAG_NO_DIF_VERIFY))
-        {
+        if (TEST_REQ_CTRL_FLAG(req, REQ_CTRL_FLAG_NO_DIF_VERIFY)) {
             eplSetReqFlag(childReq, BDM_REQ_CTRL_FLAG_NO_DIF_VERIFY);
         }
         
@@ -2263,7 +2263,7 @@
     BUILD_BUG_ON(sizeof(EPL_RSS_PARAM_S) > EPL_MAX_BYTE_FILL_BDM_REQ_PRI);
     
     ret = sdFillReqWithPrivateDevInfo(childReq,(void*)(&rssInfo),sizeof(EPL_RSS_PARAM_S));
-    if(RETURN_OK != ret)
+    if(RETURN_OK != ret) 
     {
         EPL_SUBSYS_PRINT_LIMIT_PERIOD(EPL_PRINT_INTERVAL,
                           EPL_PRINT_BURST, 
@@ -6506,4 +6506,19 @@
     spin_unlock(&g_eplEbcQuotaLock);    
     return RETURN_OK;
 }
+bool eplIsNeedContinue(REQ_S *req, uint32_t linkId)
+{
+    EPL_PRIVATE_IO_S *pio = NULL;    
+    pio = EPL_GET_PIO(req);
+    /* ǰ̨IOҪѡ· */
+    if (EPL_REQ_TYPE_IO == pio->reqType)
+    {
+        if (isBDMPortPolicyOpenForInValid(linkId)){
+            DBG_LogDebug(EPL_LOG_ID_048D, "the link(%d) reset fuction is open, all IO select health link,flag(0x%llx).",
+                         linkId, req->ctrlFlag);
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
 
--- ./source/private_module/epl/epl_logic_dev.c	2018-03-27 07:11:50.000000000 +0000
+++ ./source/private_module/epl/epl_logic_dev.c.hotpatch	2021-05-14 04:28:17.000000000 +0000
@@ -5118,6 +5118,7 @@
 * ֵ  : 
 *     : 
 **************************************************************************/
+extern bool eplIsNeedContinue(REQ_S *req, uint32_t linkId);
 int32_t eplIsAllLinkDegradeInCtrl(REQ_S *req, uint32_t arrayId, uint32_t ctrlId)
 {
     uint32_t idxLink = 0;
@@ -5129,9 +5130,8 @@
     {
         return FALSE;
     }
-
-    /*̨IOԿ״̬*/
-    if (eplIsFlowCtrlIo(req))
+    /* ̨IOԿ״̬,̨IO SPH033ҪҲܺԽĿ */
+    if (eplIsFlowCtrlIo(req) && (!eplIsNeedContinue(req, INVALID_VALUE32)))
     {
         return FALSE;
     }
@@ -5508,6 +5508,7 @@
 * ֵ  : 
 *     : 
 **************************************************************************/
+extern bool isBDMPortPolicyOpen(uint32_t linkId);
 void eplRecoverLinkLoadInfo(uint32_t linkId)
 {
     uint32_t loadValue = 0;
@@ -5515,31 +5516,30 @@
     EPL_LOGIC_LINK_S* logicLink = NULL;
     EPL_LOGIC_LINK_EXTERNAL_S* linkExtInfo = NULL;
     uint32_t linkPhase = 0;
-
-    if (INVALID_VALUE32 == linkId)
-    {
+    bool isAllDegrade = TRUE;
+    if (INVALID_VALUE32 == linkId) {
         EPL_SUBSYS_PRINT_LIMIT_PERIOD(EPL_PRINT_INTERVAL, EPL_PRINT_BURST, DBG_LOG_ERROR, EPL_LOG_ID_TEMP, 
                 "Param is invalid, linkId(%u)", linkId);
         return ;
     }
-
     ldev = eplGetLogicDevNoLock(EPL_GET_ARRAY_ID(linkId));
-    if (NULL == ldev)
-    {
+    if (NULL == ldev) {
         DBG_LogError(DBG_LOGID_NEW, "Ldev is NULL.");
         return;
-    }
-        
+    }        
     logicLink = eplGetLogicLinkWithLdev(ldev, linkId);
-    if (NULL == logicLink)
-    {
+    if (NULL == logicLink) {
         DBG_LogError(DBG_LOGID_NEW, "Logic link is NULL.");
         return;        
-    }
-   
+    }   
     linkExtInfo = &logicLink->extInfo; 
     /*ָ⸺*/
-    loadValue = linkExtInfo->maxLoad / (linkExtInfo->recoverPeriod * EPL_SEND_DETECTS_PER_SECOND);
+    isAllDegrade = eplIsAllLinkDegradeInArray(EPL_GET_ARRAY_ID(linkId));
+    if (isBDMPortPolicyOpen(linkId) && (!isAllDegrade)) {        
+        loadValue = linkExtInfo->maxLoad / (linkExtInfo->recoverPeriod);
+    } else {
+        loadValue = linkExtInfo->maxLoad / (linkExtInfo->recoverPeriod * EPL_SEND_DETECTS_PER_SECOND);
+    }
     linkPhase = (uint32_t)GET_POWER_OF_TWO(linkExtInfo->degradeTimes - 1);
     loadValue = (linkPhase > 0)? loadValue / linkPhase : loadValue;
     loadValue = (loadValue > 1) ? loadValue : (uint32_t)1;
