Unverified Commit b4480f1e authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!11554 Some patches of RDMA from Linux to openEuler-6.6

Merge Pull Request from: @cxh269 
 
Chengchang Tang (2):
RDMA/hns: Fix spin_unlock_irqrestore() called with IRQs enabled
RDMA/hns: Fix 1bit-ECC recovery address in non-4K OS

Junxian Huang (3):
RDMA/hns: Fix VF triggering PF reset in abnormal interrupt handler
RDMA/hns: Optimize hem allocation performance
RDMA/hns: Fix restricted __le16 degrades to integer issue

https://gitee.com/openeuler/kernel/issues/IAR316 
 
Link:https://gitee.com/openeuler/kernel/pulls/11554

 

Reviewed-by: default avatarChengchang Tang <tangchengchang@huawei.com>
Reviewed-by: default avatarZhang Peng <zhangpeng362@huawei.com>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents 688d9c48 982e092d
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -1135,11 +1135,13 @@ static int hem_list_alloc_mid_bt(struct hns_roce_dev *hr_dev,

	/* config L1 bt to last bt and link them to corresponding parent */
	for (level = 1; level < hopnum; level++) {
		if (!hem_list_is_bottom_bt(hopnum, level)) {
			cur = hem_list_search_item(&mid_bt[level], offset);
			if (cur) {
				hem_ptrs[level] = cur;
				continue;
			}
		}

		step = hem_list_calc_ba_range(hopnum, level, unit);
		if (step < 1) {
+8 −5
Original line number Diff line number Diff line
@@ -1845,8 +1845,8 @@ static int hns_roce_hw_v2_query_counter(struct hns_roce_dev *hr_dev,

	for (i = 0; i < HNS_ROCE_HW_CNT_TOTAL && i < *num_counters; i++) {
		bd_idx = i / CNT_PER_DESC;
		if (!(desc[bd_idx].flag & HNS_ROCE_CMD_FLAG_NEXT) &&
		    bd_idx != HNS_ROCE_HW_CNT_TOTAL / CNT_PER_DESC)
		if (bd_idx != HNS_ROCE_HW_CNT_TOTAL / CNT_PER_DESC &&
		    !(desc[bd_idx].flag & cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT)))
			break;

		cnt_data = (__le64 *)&desc[bd_idx].data[0];
@@ -6623,6 +6623,7 @@ static irqreturn_t abnormal_interrupt_basic(struct hns_roce_dev *hr_dev,
	struct pci_dev *pdev = hr_dev->pci_dev;
	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev);
	const struct hnae3_ae_ops *ops = ae_dev->ops;
	enum hnae3_reset_type reset_type;
	irqreturn_t int_work = IRQ_NONE;
	u32 int_en;

@@ -6634,10 +6635,12 @@ static irqreturn_t abnormal_interrupt_basic(struct hns_roce_dev *hr_dev,
		roce_write(hr_dev, ROCEE_VF_ABN_INT_ST_REG,
			   1 << HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S);

		reset_type = hr_dev->is_vf ?
			     HNAE3_VF_FUNC_RESET : HNAE3_FUNC_RESET;

		/* Set reset level for reset_event() */
		if (ops->set_default_reset_request)
			ops->set_default_reset_request(ae_dev,
						       HNAE3_FUNC_RESET);
			ops->set_default_reset_request(ae_dev, reset_type);
		if (ops->reset_event)
			ops->reset_event(pdev, NULL);

@@ -6707,7 +6710,7 @@ static u64 fmea_get_ram_res_addr(u32 res_type, __le64 *data)
	    res_type == ECC_RESOURCE_SCCC)
		return le64_to_cpu(*data);

	return le64_to_cpu(*data) << PAGE_SHIFT;
	return le64_to_cpu(*data) << HNS_HW_PAGE_SHIFT;
}

static int fmea_recover_others(struct hns_roce_dev *hr_dev, u32 res_type,
+8 −8
Original line number Diff line number Diff line
@@ -1579,19 +1579,19 @@ void hns_roce_lock_cqs(struct hns_roce_cq *send_cq, struct hns_roce_cq *recv_cq)
		__acquire(&send_cq->lock);
		__acquire(&recv_cq->lock);
	} else if (unlikely(send_cq != NULL && recv_cq == NULL)) {
		spin_lock_irq(&send_cq->lock);
		spin_lock(&send_cq->lock);
		__acquire(&recv_cq->lock);
	} else if (unlikely(send_cq == NULL && recv_cq != NULL)) {
		spin_lock_irq(&recv_cq->lock);
		spin_lock(&recv_cq->lock);
		__acquire(&send_cq->lock);
	} else if (send_cq == recv_cq) {
		spin_lock_irq(&send_cq->lock);
		spin_lock(&send_cq->lock);
		__acquire(&recv_cq->lock);
	} else if (send_cq->cqn < recv_cq->cqn) {
		spin_lock_irq(&send_cq->lock);
		spin_lock(&send_cq->lock);
		spin_lock_nested(&recv_cq->lock, SINGLE_DEPTH_NESTING);
	} else {
		spin_lock_irq(&recv_cq->lock);
		spin_lock(&recv_cq->lock);
		spin_lock_nested(&send_cq->lock, SINGLE_DEPTH_NESTING);
	}
}
@@ -1611,13 +1611,13 @@ void hns_roce_unlock_cqs(struct hns_roce_cq *send_cq,
		spin_unlock(&recv_cq->lock);
	} else if (send_cq == recv_cq) {
		__release(&recv_cq->lock);
		spin_unlock_irq(&send_cq->lock);
		spin_unlock(&send_cq->lock);
	} else if (send_cq->cqn < recv_cq->cqn) {
		spin_unlock(&recv_cq->lock);
		spin_unlock_irq(&send_cq->lock);
		spin_unlock(&send_cq->lock);
	} else {
		spin_unlock(&send_cq->lock);
		spin_unlock_irq(&recv_cq->lock);
		spin_unlock(&recv_cq->lock);
	}
}