diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
index 7e5e5847001766bf9781bb2301711cb904fd1908..41a12df725b3ba751ce605fab72ea10a271f3126 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
@@ -4046,7 +4046,12 @@ static void hclge_update_vport_alive(struct hclge_dev *hdev)
 		 * receive a vf's alive msg for 8s, regards the vf is offline
 		 */
 		if (time_after(jiffies, vport->last_active_jiffies + 8 * HZ))
-			clear_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state);
+			if (test_and_clear_bit(HCLGE_VPORT_STATE_ALIVE,
+					       &vport->state))
+				dev_info(&hdev->pdev->dev,
+					 "VF %u keep alive lost!",
+					 vport->vport_id -
+					 HCLGE_VF_VPORT_START_NUM);
 
 		/* If vf is not alive, set to default value */
 		if (!test_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state))
@@ -7090,8 +7095,8 @@ int hclge_vport_start(struct hclge_vport *vport)
 {
 	struct hclge_dev *hdev = vport->back;
 
-	set_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state);
 	vport->last_active_jiffies = jiffies;
+	set_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state);
 
 	if (test_bit(vport->vport_id, hdev->vport_config_block)) {
 		if (vport->vport_id) {
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
index b1b59c1f5cc6ae29b34075f9e0da3975d4be7fca..45f94cd33524b15c1f8518a703a18f4d0a9e73c5 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
@@ -639,7 +639,29 @@ static int hclge_reset_vf(struct hclge_vport *vport)
 
 static void hclge_vf_keep_alive(struct hclge_vport *vport)
 {
+	struct hclge_dev *hdev = vport->back;
+	int ret;
+
 	vport->last_active_jiffies = jiffies;
+
+	if (!test_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state)) {
+		set_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state);
+
+		dev_info(&hdev->pdev->dev, "VF %u keep alive resume!",
+			 vport->vport_id - HCLGE_VF_VPORT_START_NUM);
+
+		/* if vf support push link, need to push link status after keep
+		 * alive restore, because the vf will not fetch the link status
+		 * of it's own.
+		 */
+		ret = hclge_push_vf_link_status(vport);
+		if (ret) {
+			dev_err(&hdev->pdev->dev,
+				"failed to push link status to vf%u, ret=%d\n",
+				vport->vport_id - HCLGE_VF_VPORT_START_NUM,
+				ret);
+		}
+	}
 }
 
 static int hclge_set_vf_mtu(struct hclge_vport *vport,