]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - net/rds/send.c
RDS: Implement silent atomics
[net-next-2.6.git] / net / rds / send.c
index 5bc35d2f40ea1950956a8f82328f3cd5dc0b7356..42fb934293be108d0e151256c5afa0e480030d45 100644 (file)
@@ -266,7 +266,7 @@ int rds_send_xmit(struct rds_connection *conn)
 
 
                if (rm->atomic.op_active && !conn->c_xmit_atomic_sent) {
-                       ret = conn->c_trans->xmit_atomic(conn, &rm->atomic);
+                       ret = conn->c_trans->xmit_atomic(conn, rm);
                        if (ret)
                                break;
                        conn->c_xmit_atomic_sent = 1;
@@ -285,13 +285,18 @@ int rds_send_xmit(struct rds_connection *conn)
                        if (ret)
                                break;
                        conn->c_xmit_rdma_sent = 1;
+
+                       /* rdmas need data sent, even if just the header */
+                       rm->data.op_active = 1;
+
                        /* The transport owns the mapped memory for now.
                         * You can't unmap it while it's on the send queue */
                        set_bit(RDS_MSG_MAPPED, &rm->m_flags);
                }
 
-               if (conn->c_xmit_hdr_off < sizeof(struct rds_header) ||
-                   conn->c_xmit_sg < rm->data.m_nents) {
+               if (rm->data.op_active
+                   && (conn->c_xmit_hdr_off < sizeof(struct rds_header) ||
+                       conn->c_xmit_sg < rm->data.m_nents)) {
                        ret = conn->c_trans->xmit(conn, rm,
                                                  conn->c_xmit_hdr_off,
                                                  conn->c_xmit_sg,