* Stefan Weil (s...@weilnetz.de) wrote:
> Please see my comments below.
> 
> Am 04.03.2015 um 14:31 schrieb Dr. David Alan Gilbert:
> >* Stefan Weil (s...@weilnetz.de) wrote:
> >>Fix type casts between pointers and 64 bit integers.
> >>Now 32 bit builds are possible again.
> >>
> >>Signed-off-by: Stefan Weil <s...@weilnetz.de>
> >>---
> >>  migration/rdma.c |   57 
> >> +++++++++++++++++++++++++++++-------------------------
> >>  1 file changed, 31 insertions(+), 26 deletions(-)
> >>
> >>diff --git a/migration/rdma.c b/migration/rdma.c
> >>index 1512460..a68f1f1 100644
> >>--- a/migration/rdma.c
> >>+++ b/migration/rdma.c
> >>@@ -493,8 +493,8 @@ static inline uint64_t ram_chunk_index(const uint8_t 
> >>*start,
> >>  static inline uint8_t *ram_chunk_start(const RDMALocalBlock 
> >> *rdma_ram_block,
> >>                                         uint64_t i)
> >>  {
> >>-    return (uint8_t *) (((uintptr_t) rdma_ram_block->local_host_addr)
> >>-                                    + (i << RDMA_REG_CHUNK_SHIFT));
> >>+    return (uint8_t *)(uintptr_t)(rdma_ram_block->local_host_addr +
> >>+                                  (i << RDMA_REG_CHUNK_SHIFT));
> >>  }
> >>  static inline uint8_t *ram_chunk_end(const RDMALocalBlock *rdma_ram_block,
> >>@@ -515,7 +515,7 @@ static int __qemu_rdma_add_block(RDMAContext *rdma, 
> >>void *host_addr,
> >>  {
> >This will clash with my 'unbreak dtrace tracing due to double _ in rdma 
> >names' that's
> >going through Stefan's tree.
> 
> Then this part will have to wait until Stefan's tree was applied.
> 
> >
> >>      RDMALocalBlocks *local = &rdma->local_ram_blocks;
> >>      RDMALocalBlock *block = g_hash_table_lookup(rdma->blockmap,
> >>-        (void *) block_offset);
> >>+        (void *)(uintptr_t)block_offset);
> >>      RDMALocalBlock *old = local->block;
> >
> >>      assert(block == NULL);
> >>@@ -526,9 +526,11 @@ static int __qemu_rdma_add_block(RDMAContext *rdma, 
> >>void *host_addr,
> >>          int x;
> >>          for (x = 0; x < local->nb_blocks; x++) {
> >>-            g_hash_table_remove(rdma->blockmap, (void *)old[x].offset);
> >>-            g_hash_table_insert(rdma->blockmap, (void *)old[x].offset,
> >>-                                                &local->block[x]);
> >>+            g_hash_table_remove(rdma->blockmap,
> >>+                                (void *)(uintptr_t)old[x].offset);
> >>+            g_hash_table_insert(rdma->blockmap,
> >>+                                (void *)(uintptr_t)old[x].offset,
> >>+                                &local->block[x]);
> >>          }
> >>          memcpy(local->block, old, sizeof(RDMALocalBlock) * 
> >> local->nb_blocks);
> >>          g_free(old);
> >>@@ -549,12 +551,12 @@ static int __qemu_rdma_add_block(RDMAContext *rdma, 
> >>void *host_addr,
> >>      block->is_ram_block = local->init ? false : true;
> >>-    g_hash_table_insert(rdma->blockmap, (void *) block_offset, block);
> >>+    g_hash_table_insert(rdma->blockmap, (void *)(uintptr_t)block_offset, 
> >>block);
> >>      trace___qemu_rdma_add_block(local->nb_blocks,
> >>-                           (uint64_t) block->local_host_addr, 
> >>block->offset,
> >>+                           (uintptr_t)block->local_host_addr, 
> >>block->offset,
> >>                             block->length,
> >>-                           (uint64_t) (block->local_host_addr + 
> >>block->length),
> >>+                           (uintptr_t)(block->local_host_addr + 
> >>block->length),
> >>                             BITS_TO_LONGS(block->nb_chunks) *
> >>                                 sizeof(unsigned long) * 8,
> >>                             block->nb_chunks);
> >>@@ -595,7 +597,7 @@ static int qemu_rdma_init_ram_blocks(RDMAContext *rdma)
> >>      return 0;
> >>  }
> >>-static int __qemu_rdma_delete_block(RDMAContext *rdma, ram_addr_t 
> >>block_offset)
> >>+static int __qemu_rdma_delete_block(RDMAContext *rdma, uintptr_t 
> >>block_offset)
> >>  {
> >>      RDMALocalBlocks *local = &rdma->local_ram_blocks;
> >>      RDMALocalBlock *block = g_hash_table_lookup(rdma->blockmap,
> >>@@ -635,7 +637,7 @@ static int __qemu_rdma_delete_block(RDMAContext *rdma, 
> >>ram_addr_t block_offset)
> >>      block->remote_keys = NULL;
> >>      for (x = 0; x < local->nb_blocks; x++) {
> >>-        g_hash_table_remove(rdma->blockmap, (void *)old[x].offset);
> >>+        g_hash_table_remove(rdma->blockmap, (void 
> >>*)(uintptr_t)old[x].offset);
> >>      }
> >>      if (local->nb_blocks > 1) {
> >>@@ -658,9 +660,9 @@ static int __qemu_rdma_delete_block(RDMAContext *rdma, 
> >>ram_addr_t block_offset)
> >>      }
> >>      trace___qemu_rdma_delete_block(local->nb_blocks,
> >>-                           (uint64_t)block->local_host_addr,
> >>+                           (uintptr_t)block->local_host_addr,
> >>                             block->offset, block->length,
> >>-                           (uint64_t)(block->local_host_addr + 
> >>block->length),
> >>+                           (uintptr_t)(block->local_host_addr + 
> >>block->length),
> >>                             BITS_TO_LONGS(block->nb_chunks) *
> >>                                 sizeof(unsigned long) * 8, 
> >> block->nb_chunks);
> >>@@ -670,8 +672,9 @@ static int __qemu_rdma_delete_block(RDMAContext *rdma, 
> >>ram_addr_t block_offset)
> >>      if (local->nb_blocks) {
> >>          for (x = 0; x < local->nb_blocks; x++) {
> >>-            g_hash_table_insert(rdma->blockmap, (void 
> >>*)local->block[x].offset,
> >>-                                                &local->block[x]);
> >>+            g_hash_table_insert(rdma->blockmap,
> >>+                                (void *)(uintptr_t)local->block[x].offset,
> >>+                                &local->block[x]);
> >>          }
> >>      }
> >>@@ -1076,7 +1079,7 @@ static int qemu_rdma_reg_whole_ram_blocks(RDMAContext 
> >>*rdma)
> >>   * This search cannot fail or the migration will fail.
> >>   */
> >>  static int qemu_rdma_search_ram_block(RDMAContext *rdma,
> >>-                                      uint64_t block_offset,
> >>+                                      uintptr_t block_offset,
> >>                                        uint64_t offset,
> >>                                        uint64_t length,
> >>                                        uint64_t *block_index,
> >>@@ -1380,8 +1383,8 @@ static uint64_t qemu_rdma_poll(RDMAContext *rdma, 
> >>uint64_t *wr_id_out,
> >>          RDMALocalBlock *block = &(rdma->local_ram_blocks.block[index]);
> >>          trace_qemu_rdma_poll_write(print_wrid(wr_id), wr_id, 
> >> rdma->nb_sent,
> >>-                 index, chunk,
> >>-                 block->local_host_addr, (void *)block->remote_host_addr);
> >>+                                   index, chunk, block->local_host_addr,
> >>+                                   (void 
> >>*)(uintptr_t)block->remote_host_addr);
> >I think that's the wrong fix there; remote_host_addr is actually 64bit 
> >because
> >even if this host is 32bit the other end might be 64bit; I think the right
> >fix is to change the trace to use a uint64_t for the remote_host_addr.
> 
> That depends on the kind of output which is wanted.
> 
> We can either use %p for pointers, then the output will depend on the host's
> pointer size.
> Or we can use %16 PRIu64, then the output will always show 16 digits (with
> at least 8
> leading zeros on 32 bit hosts).

Since it's trying to print the remote_host_addr and that really can be 64bit
it doesn't seem right to use a %p since that's dependent on the local pointer
size.  I'd use a % PRIx64.

> >>          clear_bit(chunk, block->transit_bitmap);
> >>@@ -1524,7 +1527,7 @@ static int qemu_rdma_post_send_control(RDMAContext 
> >>*rdma, uint8_t *buf,
> >>      RDMAWorkRequestData *wr = &rdma->wr_data[RDMA_WRID_CONTROL];
> >>      struct ibv_send_wr *bad_wr;
> >>      struct ibv_sge sge = {
> >>-                           .addr = (uint64_t)(wr->control),
> >>+                           .addr = (uintptr_t)(wr->control),
> >No, as before, my belief is that the .addr is a uint64_t.
> 
> Yes, because wr->control is a pointer which you want to convert to an
> integer value.
> C allows assignments from 32 bit integers to 64 bit integers - the compiler
> will add the
> necessary 0 bits.

Yes, fair enough.

Dave

> >(Although curiously I did a test and found that gcc lets me pass a uint64_t
> >to a function that has a uintptr_t parameter on a 32bit machine, but I don't
> >understand why.)
> >
> >Dave
> >
> >>                             .length = head->len + 
> >> sizeof(RDMAControlHeader),
> >>                             .lkey = wr->control_mr->lkey,
> >>                           };
> >>@@ -1578,7 +1581,7 @@ static int qemu_rdma_post_recv_control(RDMAContext 
> >>*rdma, int idx)
> >>  {
> >>      struct ibv_recv_wr *bad_wr;
> >>      struct ibv_sge sge = {
> >>-                            .addr = (uint64_t)(rdma->wr_data[idx].control),
> >>+                            .addr = 
> >>(uintptr_t)(rdma->wr_data[idx].control),
> >>                              .length = RDMA_CONTROL_MAX_BUFFER,
> >>                              .lkey = rdma->wr_data[idx].control_mr->lkey,
> >>                           };
> >>@@ -1825,11 +1828,12 @@ static int qemu_rdma_write_one(QEMUFile *f, 
> >>RDMAContext *rdma,
> >>                               };
> >>  retry:
> >>-    sge.addr = (uint64_t)(block->local_host_addr +
> >>+    sge.addr = (uintptr_t)(block->local_host_addr +
> >>                              (current_addr - block->offset));
> >>      sge.length = length;
> >>-    chunk = ram_chunk_index(block->local_host_addr, (uint8_t *) sge.addr);
> >>+    chunk = ram_chunk_index(block->local_host_addr,
> >>+                            (uint8_t *)(uintptr_t)sge.addr);
> >>      chunk_start = ram_chunk_start(block, chunk);
> >>      if (block->is_ram_block) {
> >>@@ -1882,8 +1886,9 @@ retry:
> >>               * memset() + madvise() the entire chunk without RDMA.
> >>               */
> >>-            if (can_use_buffer_find_nonzero_offset((void *)sge.addr, 
> >>length)
> >>-                   && buffer_find_nonzero_offset((void *)sge.addr,
> >>+            if (can_use_buffer_find_nonzero_offset((void 
> >>*)(uintptr_t)sge.addr,
> >>+                                                   length)
> >>+                   && buffer_find_nonzero_offset((void 
> >>*)(uintptr_t)sge.addr,
> >>                                                      length) == length) {
> >>                  RDMACompress comp = {
> >>                                          .offset = current_addr,
> >>@@ -2978,7 +2983,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f, 
> >>void *opaque,
> >>               */
> >>              for (i = 0; i < local->nb_blocks; i++) {
> >>                  rdma->block[i].remote_host_addr =
> >>-                    (uint64_t)(local->block[i].local_host_addr);
> >>+                    (uintptr_t)(local->block[i].local_host_addr);
> >>                  if (rdma->pin_all) {
> >>                      rdma->block[i].remote_rkey = local->block[i].mr->rkey;
> >>@@ -3042,7 +3047,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f, 
> >>void *opaque,
> >>                      goto out;
> >>                  }
> >>-                reg_result->host_addr = (uint64_t) block->local_host_addr;
> >>+                reg_result->host_addr = (uintptr_t)block->local_host_addr;
> >>                  trace_qemu_rdma_registration_handle_register_rkey(
> >>                                                             
> >> reg_result->rkey);
> >>-- 
> >>1.7.10.4
> >>
> >>
> >--
> >Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK
> 
--
Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK

Reply via email to