[openib-general] libmthca: make fence work
Roland Dreier
rdreier at cisco.com
Thu Aug 10 10:44:12 PDT 2006
I fixed this in a slightly different way that seemed cleaner to me
(see below). Please verify that my fix works for you.
Thanks,
Roland
Index: libmthca/src/qp.c
===================================================================
--- libmthca/src/qp.c (revision 8875)
+++ libmthca/src/qp.c (working copy)
@@ -46,6 +46,10 @@
#include "doorbell.h"
#include "wqe.h"
+enum {
+ MTHCA_SEND_DOORBELL_FENCE = 1 << 5
+};
+
static const uint8_t mthca_opcode[] = {
[IBV_WR_SEND] = MTHCA_OPCODE_SEND,
[IBV_WR_SEND_WITH_IMM] = MTHCA_OPCODE_SEND_IMM,
@@ -104,9 +108,18 @@ int mthca_tavor_post_send(struct ibv_qp
int ind;
int nreq;
int ret = 0;
- int size, size0 = 0;
+ int size;
+ int size0 = 0;
int i;
- uint32_t f0 = 0, op0 = 0;
+ /*
+ * f0 and op0 cannot be used unless nreq > 0, which means this
+ * function makes it through the loop at least once. So the
+ * code inside the if (!size0) will be executed, and f0 and
+ * op0 will be initialized. So any gcc warning about "may be
+ * used unitialized" is bogus.
+ */
+ uint32_t f0;
+ uint32_t op0;
pthread_spin_lock(&qp->sq.lock);
@@ -290,6 +303,8 @@ int mthca_tavor_post_send(struct ibv_qp
if (!size0) {
size0 = size;
op0 = mthca_opcode[wr->opcode];
+ f0 = wr->send_flags & IBV_SEND_FENCE ?
+ MTHCA_SEND_DOORBELL_FENCE : 0;
}
++ind;
@@ -434,9 +449,18 @@ int mthca_arbel_post_send(struct ibv_qp
int ind;
int nreq;
int ret = 0;
- int size, size0 = 0;
+ int size;
+ int size0 = 0;
int i;
- uint32_t f0 = 0, op0 = 0;
+ /*
+ * f0 and op0 cannot be used unless nreq > 0, which means this
+ * function makes it through the loop at least once. So the
+ * code inside the if (!size0) will be executed, and f0 and
+ * op0 will be initialized. So any gcc warning about "may be
+ * used unitialized" is bogus.
+ */
+ uint32_t f0;
+ uint32_t op0;
pthread_spin_lock(&qp->sq.lock);
@@ -644,6 +668,8 @@ int mthca_arbel_post_send(struct ibv_qp
if (!size0) {
size0 = size;
op0 = mthca_opcode[wr->opcode];
+ f0 = wr->send_flags & IBV_SEND_FENCE ?
+ MTHCA_SEND_DOORBELL_FENCE : 0;
}
++ind;
Index: libmthca/ChangeLog
===================================================================
--- libmthca/ChangeLog (revision 8875)
+++ libmthca/ChangeLog (working copy)
@@ -1,3 +1,8 @@
+2006-08-09 Michael S. Tsirkin <mst at mellanox.co.il>
+
+ * src/qp.c (mthca_tavor_post_send, mthca_arbel_post_send): Fence
+ bit must be set in both doorbell and WQE.
+
2006-08-03 Jack Morgenstein <jackm at mellanox.co.il>
* src/mthca.h: Include <stddef.h> to get definition of offsetof().
More information about the general
mailing list