Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 780a4c16 authored by Sebastian Sanchez's avatar Sebastian Sanchez Committed by Doug Ledford
Browse files

IB/hfi1: Remove atomic operations for SDMA_REQ_HAVE_AHG bit



The AHG index is only accessed in the request call
from user space, so there's no need for atomic semantics.
Replace atomic operations for SDMA_REQ_HAVE_AHG bit
with a test of the AHG index.

Reviewed-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: default avatarSebastian Sanchez <sebastian.sanchez@intel.com>
Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 5042cddf
Loading
Loading
Loading
Loading
+8 −14
Original line number Original line Diff line number Diff line
@@ -155,9 +155,8 @@ MODULE_PARM_DESC(sdma_comp_size, "Size of User SDMA completion ring. Default: 12
/* SDMA request flag bits */
/* SDMA request flag bits */
#define SDMA_REQ_FOR_THREAD 1
#define SDMA_REQ_FOR_THREAD 1
#define SDMA_REQ_SEND_DONE  2
#define SDMA_REQ_SEND_DONE  2
#define SDMA_REQ_HAVE_AHG   3
#define SDMA_REQ_HAS_ERROR  3
#define SDMA_REQ_HAS_ERROR  4
#define SDMA_REQ_DONE_ERROR 4
#define SDMA_REQ_DONE_ERROR 5


#define SDMA_PKT_Q_INACTIVE BIT(0)
#define SDMA_PKT_Q_INACTIVE BIT(0)
#define SDMA_PKT_Q_ACTIVE   BIT(1)
#define SDMA_PKT_Q_ACTIVE   BIT(1)
@@ -216,7 +215,7 @@ struct user_sdma_request {
	 * each request will need it's own engine pointer.
	 * each request will need it's own engine pointer.
	 */
	 */
	struct sdma_engine *sde;
	struct sdma_engine *sde;
	u8 ahg_idx;
	s8 ahg_idx;
	u32 ahg[9];
	u32 ahg[9];
	/*
	/*
	 * KDETH.Offset (Eager) field
	 * KDETH.Offset (Eager) field
@@ -614,6 +613,7 @@ int hfi1_user_sdma_process_request(struct hfi1_filedata *fd,
	req->pq = pq;
	req->pq = pq;
	req->cq = cq;
	req->cq = cq;
	req->status = -1;
	req->status = -1;
	req->ahg_idx = -1;
	INIT_LIST_HEAD(&req->txps);
	INIT_LIST_HEAD(&req->txps);


	memcpy(&req->info, &info, sizeof(info));
	memcpy(&req->info, &info, sizeof(info));
@@ -764,14 +764,8 @@ int hfi1_user_sdma_process_request(struct hfi1_filedata *fd,
	}
	}


	/* We don't need an AHG entry if the request contains only one packet */
	/* We don't need an AHG entry if the request contains only one packet */
	if (req->info.npkts > 1 && HFI1_CAP_IS_USET(SDMA_AHG)) {
	if (req->info.npkts > 1 && HFI1_CAP_IS_USET(SDMA_AHG))
		int ahg = sdma_ahg_alloc(req->sde);
		req->ahg_idx = sdma_ahg_alloc(req->sde);

		if (likely(ahg >= 0)) {
			req->ahg_idx = (u8)ahg;
			set_bit(SDMA_REQ_HAVE_AHG, &req->flags);
		}
	}


	set_comp_state(pq, cq, info.comp_idx, QUEUED, 0);
	set_comp_state(pq, cq, info.comp_idx, QUEUED, 0);
	atomic_inc(&pq->n_reqs);
	atomic_inc(&pq->n_reqs);
@@ -989,7 +983,7 @@ static int user_sdma_send_pkts(struct user_sdma_request *req, unsigned maxpkts)
			}
			}
		}
		}


		if (test_bit(SDMA_REQ_HAVE_AHG, &req->flags)) {
		if (req->ahg_idx >= 0) {
			if (!req->seqnum) {
			if (!req->seqnum) {
				u16 pbclen = le16_to_cpu(req->hdr.pbc[0]);
				u16 pbclen = le16_to_cpu(req->hdr.pbc[0]);
				u32 lrhlen = get_lrh_len(req->hdr,
				u32 lrhlen = get_lrh_len(req->hdr,
@@ -1119,7 +1113,7 @@ static int user_sdma_send_pkts(struct user_sdma_request *req, unsigned maxpkts)
		 * happen due to the sequential manner in which
		 * happen due to the sequential manner in which
		 * descriptors are processed.
		 * descriptors are processed.
		 */
		 */
		if (test_bit(SDMA_REQ_HAVE_AHG, &req->flags))
		if (req->ahg_idx >= 0)
			sdma_ahg_free(req->sde, req->ahg_idx);
			sdma_ahg_free(req->sde, req->ahg_idx);
	}
	}
	return ret;
	return ret;