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

!11798 CVE-2024-46784

Merge Pull Request from: @ci-robot 
 
PR sync from: Wang Liang <wangliang74@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/GZNNKASC6CLW3TVHBP7SK2SPWBXM7LKW/ 
Long Li (1):
  net: mana: Fix doorbell out of order violation and avoid unnecessary
    doorbell rings

Souradeep Chakrabarti (1):
  net: mana: Fix error handling in mana_create_txq/rxq's NAPI cleanup


-- 
2.34.1
 
https://gitee.com/src-openeuler/kernel/issues/IARYEO 
 
Link:https://gitee.com/openeuler/kernel/pulls/11798

 

Reviewed-by: default avatarYue Haibing <yuehaibing@huawei.com>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents 047636a2 b3e343cd
Loading
Loading
Loading
Loading
+28 −18
Original line number Diff line number Diff line
@@ -1774,7 +1774,6 @@ static void mana_poll_rx_cq(struct mana_cq *cq)
static int mana_cq_handler(void *context, struct gdma_queue *gdma_queue)
{
	struct mana_cq *cq = context;
	u8 arm_bit;
	int w;

	WARN_ON_ONCE(cq->gdma_cq != gdma_queue);
@@ -1785,16 +1784,23 @@ static int mana_cq_handler(void *context, struct gdma_queue *gdma_queue)
		mana_poll_tx_cq(cq);

	w = cq->work_done;

	if (w < cq->budget &&
	    napi_complete_done(&cq->napi, w)) {
		arm_bit = SET_ARM_BIT;
	} else {
		arm_bit = 0;
	cq->work_done_since_doorbell += w;

	if (w < cq->budget) {
		mana_gd_ring_cq(gdma_queue, SET_ARM_BIT);
		cq->work_done_since_doorbell = 0;
		napi_complete_done(&cq->napi, w);
	} else if (cq->work_done_since_doorbell >
		   cq->gdma_cq->queue_size / COMP_ENTRY_SIZE * 4) {
		/* MANA hardware requires at least one doorbell ring every 8
		 * wraparounds of CQ even if there is no need to arm the CQ.
		 * This driver rings the doorbell as soon as we have exceeded
		 * 4 wraparounds.
		 */
		mana_gd_ring_cq(gdma_queue, 0);
		cq->work_done_since_doorbell = 0;
	}

	mana_gd_ring_cq(gdma_queue, arm_bit);

	return w;
}

@@ -1848,10 +1854,12 @@ static void mana_destroy_txq(struct mana_port_context *apc)

	for (i = 0; i < apc->num_queues; i++) {
		napi = &apc->tx_qp[i].tx_cq.napi;
		if (apc->tx_qp[i].txq.napi_initialized) {
			napi_synchronize(napi);
			napi_disable(napi);
			netif_napi_del(napi);

			apc->tx_qp[i].txq.napi_initialized = false;
		}
		mana_destroy_wq_obj(apc, GDMA_SQ, apc->tx_qp[i].tx_object);

		mana_deinit_cq(apc, &apc->tx_qp[i].tx_cq);
@@ -1907,6 +1915,7 @@ static int mana_create_txq(struct mana_port_context *apc,
		txq->ndev = net;
		txq->net_txq = netdev_get_tx_queue(net, i);
		txq->vp_offset = apc->tx_vp_offset;
		txq->napi_initialized = false;
		skb_queue_head_init(&txq->pending_skbs);

		memset(&spec, 0, sizeof(spec));
@@ -1973,6 +1982,7 @@ static int mana_create_txq(struct mana_port_context *apc,

		netif_napi_add_tx(net, &cq->napi, mana_poll);
		napi_enable(&cq->napi);
		txq->napi_initialized = true;

		mana_gd_ring_cq(cq->gdma_cq, SET_ARM_BIT);
	}
@@ -1984,7 +1994,7 @@ static int mana_create_txq(struct mana_port_context *apc,
}

static void mana_destroy_rxq(struct mana_port_context *apc,
			     struct mana_rxq *rxq, bool validate_state)
			     struct mana_rxq *rxq, bool napi_initialized)

{
	struct gdma_context *gc = apc->ac->gdma_dev->gdma_context;
@@ -1999,14 +2009,14 @@ static void mana_destroy_rxq(struct mana_port_context *apc,

	napi = &rxq->rx_cq.napi;

	if (validate_state)
	if (napi_initialized) {
		napi_synchronize(napi);

		napi_disable(napi);

	xdp_rxq_info_unreg(&rxq->xdp_rxq);

		netif_napi_del(napi);
	}
	xdp_rxq_info_unreg(&rxq->xdp_rxq);

	mana_destroy_wq_obj(apc, GDMA_RQ, rxq->rxobj);

+3 −0
Original line number Diff line number Diff line
@@ -97,6 +97,8 @@ struct mana_txq {

	atomic_t pending_sends;

	bool napi_initialized;

	struct mana_stats_tx stats;
};

@@ -274,6 +276,7 @@ struct mana_cq {
	/* NAPI data */
	struct napi_struct napi;
	int work_done;
	int work_done_since_doorbell;
	int budget;
};