I wasn't sure who I should email about this, but I recently got krping to work between an Opteron and a PPC G5. However, in order for krping to work I had to make the following changes to krping.c to ensure the address, key, and length were being sent across the network as big endian, otherwise they were in machine dependent byte order.<br><br><br>static void krping_format_send(struct krping_cb *cb, u64 buf, <br> struct ib_mr *mr)<br>{<br> struct krping_rdma_info *info = &cb->send_buf;<br><br>- info->buf = buf;<br> - info->rkey = mr->rkey;<br> - info->size = cb->size;<br>+ info->buf = cpu_to_be64(buf);<br>+ info->rkey = cpu_to_be32(mr->rkey);<br>+ info->size = cpu_to_be32(cb->size);<br><br> DEBUG_LOG("RDMA
addr %llx rkey %x len %d\n",<br> info->buf, info->rkey, info->size);<br>}<br><br><br>static int server_recv(struct krping_cb *cb, struct ib_wc *wc)<br>{<br> if (wc->byte_len != sizeof(cb->recv_buf)) {<br> printk(KERN_ERR PFX "Received bogus data, size %d\n", <br> wc->byte_len);<br> return -1;<br> }<br>- cb->remote_rkey = cb->recv_buf.rkey;<br>- cb->remote_addr = cb->recv_buf.buf;<br>- cb->remote_len = cb->recv_buf.size;<br>+ cb->remote_rkey = be32_to_cpu(cb->recv_buf.rkey);<br>+ cb->remote_addr = be64_to_cpu(cb->recv_buf.buf);<br>+ cb->remote_len =
be32_to_cpu(cb->recv_buf.size);<br> DEBUG_LOG("Received rkey %x addr %llx len %d from peer\n",<br> cb->remote_rkey, cb->remote_addr, cb->remote_len);<br><br> if (cb->state <= CONNECTED || cb->state == RDMA_WRITE_COMPLETE)<br> cb->state = RDMA_READ_ADV;<br> else<br> cb->state = RDMA_WRITE_ADV;<br><br> return 0;<br>}<br><br>Brett McMillian<br>