Commit b888429c authored by Sebastian Sanchez's avatar Sebastian Sanchez Committed by Doug Ledford

IB/hfi1: Remove atomic SDMA_REQ_SEND_DONE bit operation

The atomic SDMA_REQ_SEND_DONE bit is set by the
process-level code, and then the same process-level
code uses the bit to test that all packets have been
submitted incurring a costly atomic read.

Use a bool type with a READ_ONCE/WRITE_ONCE
pairing for this bit, and use the same condition that
is used to set the bit to test that all packets have
been submitted.
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 cb49366f
...@@ -154,10 +154,8 @@ MODULE_PARM_DESC(sdma_comp_size, "Size of User SDMA completion ring. Default: 12 ...@@ -154,10 +154,8 @@ MODULE_PARM_DESC(sdma_comp_size, "Size of User SDMA completion ring. Default: 12
#define TXREQ_FLAGS_REQ_DISABLE_SH BIT(1) /* Disable header suppression */ #define TXREQ_FLAGS_REQ_DISABLE_SH BIT(1) /* Disable header suppression */
/* SDMA request flag bits */ /* SDMA request flag bits */
#define SDMA_REQ_FOR_THREAD 1 #define SDMA_REQ_HAS_ERROR 1
#define SDMA_REQ_SEND_DONE 2 #define SDMA_REQ_DONE_ERROR 2
#define SDMA_REQ_HAS_ERROR 3
#define SDMA_REQ_DONE_ERROR 4
#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)
...@@ -258,6 +256,7 @@ struct user_sdma_request { ...@@ -258,6 +256,7 @@ struct user_sdma_request {
u16 tididx; u16 tididx;
/* progress index moving along the iovs array */ /* progress index moving along the iovs array */
u8 iov_idx; u8 iov_idx;
u8 done;
struct user_sdma_iovec iovs[MAX_VECTORS_PER_REQ]; struct user_sdma_iovec iovs[MAX_VECTORS_PER_REQ];
} ____cacheline_aligned_in_smp; } ____cacheline_aligned_in_smp;
...@@ -628,6 +627,7 @@ int hfi1_user_sdma_process_request(struct hfi1_filedata *fd, ...@@ -628,6 +627,7 @@ int hfi1_user_sdma_process_request(struct hfi1_filedata *fd,
req->seqsubmitted = 0; req->seqsubmitted = 0;
req->flags = 0; req->flags = 0;
req->tids = NULL; req->tids = NULL;
req->done = 0;
INIT_LIST_HEAD(&req->txps); INIT_LIST_HEAD(&req->txps);
memcpy(&req->info, &info, sizeof(info)); memcpy(&req->info, &info, sizeof(info));
...@@ -809,7 +809,7 @@ int hfi1_user_sdma_process_request(struct hfi1_filedata *fd, ...@@ -809,7 +809,7 @@ int hfi1_user_sdma_process_request(struct hfi1_filedata *fd,
* request have been submitted to the SDMA engine. However, it * request have been submitted to the SDMA engine. However, it
* will not wait for send completions. * will not wait for send completions.
*/ */
while (!test_bit(SDMA_REQ_SEND_DONE, &req->flags)) { while (req->seqsubmitted != req->info.npkts) {
ret = user_sdma_send_pkts(req, pcount); ret = user_sdma_send_pkts(req, pcount);
if (ret < 0) { if (ret < 0) {
if (ret != -EBUSY) { if (ret != -EBUSY) {
...@@ -1118,7 +1118,7 @@ static int user_sdma_send_pkts(struct user_sdma_request *req, unsigned maxpkts) ...@@ -1118,7 +1118,7 @@ static int user_sdma_send_pkts(struct user_sdma_request *req, unsigned maxpkts)
ret = sdma_send_txlist(req->sde, &pq->busy, &req->txps, &count); ret = sdma_send_txlist(req->sde, &pq->busy, &req->txps, &count);
req->seqsubmitted += count; req->seqsubmitted += count;
if (req->seqsubmitted == req->info.npkts) { if (req->seqsubmitted == req->info.npkts) {
set_bit(SDMA_REQ_SEND_DONE, &req->flags); WRITE_ONCE(req->done, 1);
/* /*
* The txreq has already been submitted to the HW queue * The txreq has already been submitted to the HW queue
* so we can free the AHG entry now. Corruption will not * so we can free the AHG entry now. Corruption will not
...@@ -1585,7 +1585,7 @@ static void user_sdma_txreq_cb(struct sdma_txreq *txreq, int status) ...@@ -1585,7 +1585,7 @@ static void user_sdma_txreq_cb(struct sdma_txreq *txreq, int status)
if (status != SDMA_TXREQ_S_OK) if (status != SDMA_TXREQ_S_OK)
req->status = status; req->status = status;
if (req->seqcomp == (ACCESS_ONCE(req->seqsubmitted) - 1) && if (req->seqcomp == (ACCESS_ONCE(req->seqsubmitted) - 1) &&
(test_bit(SDMA_REQ_SEND_DONE, &req->flags) || (READ_ONCE(req->done) ||
test_bit(SDMA_REQ_DONE_ERROR, &req->flags))) { test_bit(SDMA_REQ_DONE_ERROR, &req->flags))) {
user_sdma_free_request(req, false); user_sdma_free_request(req, false);
pq_update(pq); pq_update(pq);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment