diff mbox

virtio: Fix wrong type cast from pointer to long

Message ID 1411536002-14088-1-git-send-email-sw@weilnetz.de
State Accepted
Headers show

Commit Message

Stefan Weil Sept. 24, 2014, 5:20 a.m. UTC
Compiler warning (w32, w64):

include/hw/virtio/virtio_ring.h:142:26: warning:
 cast from pointer to integer of different size [-Wpointer-to-int-cast]

When sizeof(long) < sizeof(void *), this is not only a warning but a
real program error.

Add also missing blanks in the same statement.

Signed-off-by: Stefan Weil <sw@weilnetz.de>
---

Peter, could you please apply this bug fix directly without pull request?

Thanks
Stefan

 include/hw/virtio/virtio_ring.h |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Markus Armbruster Sept. 24, 2014, 7:24 a.m. UTC | #1
Stefan Weil <sw@weilnetz.de> writes:

> Compiler warning (w32, w64):
>
> include/hw/virtio/virtio_ring.h:142:26: warning:
>  cast from pointer to integer of different size [-Wpointer-to-int-cast]
>
> When sizeof(long) < sizeof(void *), this is not only a warning but a
> real program error.
>
> Add also missing blanks in the same statement.
>
> Signed-off-by: Stefan Weil <sw@weilnetz.de>

Reviewed-by: Markus Armbruster <armbru@redhat.com>
Fam Zheng Sept. 24, 2014, 8:46 a.m. UTC | #2
On Wed, 09/24 07:20, Stefan Weil wrote:
> Compiler warning (w32, w64):
> 
> include/hw/virtio/virtio_ring.h:142:26: warning:
>  cast from pointer to integer of different size [-Wpointer-to-int-cast]
> 
> When sizeof(long) < sizeof(void *), this is not only a warning but a
> real program error.
> 
> Add also missing blanks in the same statement.
> 
> Signed-off-by: Stefan Weil <sw@weilnetz.de>
> ---
> 
> Peter, could you please apply this bug fix directly without pull request?
> 
> Thanks
> Stefan
> 
>  include/hw/virtio/virtio_ring.h |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/include/hw/virtio/virtio_ring.h b/include/hw/virtio/virtio_ring.h
> index 8f58bc9..0b42e6e 100644
> --- a/include/hw/virtio/virtio_ring.h
> +++ b/include/hw/virtio/virtio_ring.h
> @@ -139,8 +139,8 @@ static inline void vring_init(struct vring *vr, unsigned int num, void *p,
>      vr->num = num;
>      vr->desc = p;
>      vr->avail = p + num*sizeof(struct vring_desc);
> -    vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + sizeof(uint16_t)
> -        + align-1) & ~(align - 1));
> +    vr->used = (void *)(((uintptr_t)&vr->avail->ring[num] + sizeof(uint16_t)
> +        + align - 1) & ~(align - 1));
>  }
>  
>  static inline unsigned vring_size(unsigned int num, unsigned long align)
> -- 
> 1.7.10.4
> 

That was from copy&paste /usr/include/linux/virtio_ring.h. The patch looks good
to me, should linux also need this fix?

Reviewed-by: Fam Zheng <famz@redhat.com>

Fam
Stefan Hajnoczi Sept. 24, 2014, 9:53 a.m. UTC | #3
On Wed, Sep 24, 2014 at 07:20:02AM +0200, Stefan Weil wrote:
> Compiler warning (w32, w64):
> 
> include/hw/virtio/virtio_ring.h:142:26: warning:
>  cast from pointer to integer of different size [-Wpointer-to-int-cast]
> 
> When sizeof(long) < sizeof(void *), this is not only a warning but a
> real program error.
> 
> Add also missing blanks in the same statement.
> 
> Signed-off-by: Stefan Weil <sw@weilnetz.de>
> ---
> 
> Peter, could you please apply this bug fix directly without pull request?
> 
> Thanks
> Stefan
> 
>  include/hw/virtio/virtio_ring.h |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Peter Maydell Sept. 24, 2014, 12:44 p.m. UTC | #4
On 24 September 2014 01:46, Fam Zheng <famz@redhat.com> wrote:
> On Wed, 09/24 07:20, Stefan Weil wrote:
>> Compiler warning (w32, w64):
>>
>> include/hw/virtio/virtio_ring.h:142:26: warning:
>>  cast from pointer to integer of different size [-Wpointer-to-int-cast]
>>
>> When sizeof(long) < sizeof(void *), this is not only a warning but a
>> real program error.
>>
>> Add also missing blanks in the same statement.
>>
>> Signed-off-by: Stefan Weil <sw@weilnetz.de>
>> ---
>>
>> Peter, could you please apply this bug fix directly without pull request?

Applied to master, thanks.

>> diff --git a/include/hw/virtio/virtio_ring.h b/include/hw/virtio/virtio_ring.h
>> index 8f58bc9..0b42e6e 100644
>> --- a/include/hw/virtio/virtio_ring.h
>> +++ b/include/hw/virtio/virtio_ring.h
>> @@ -139,8 +139,8 @@ static inline void vring_init(struct vring *vr, unsigned int num, void *p,
>>      vr->num = num;
>>      vr->desc = p;
>>      vr->avail = p + num*sizeof(struct vring_desc);
>> -    vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + sizeof(uint16_t)
>> -        + align-1) & ~(align - 1));
>> +    vr->used = (void *)(((uintptr_t)&vr->avail->ring[num] + sizeof(uint16_t)
>> +        + align - 1) & ~(align - 1));
>>  }
>>
>>  static inline unsigned vring_size(unsigned int num, unsigned long align)
>> --
>> 1.7.10.4
>>
>
> That was from copy&paste /usr/include/linux/virtio_ring.h. The patch looks good
> to me, should linux also need this fix?

In Linux the "long" type is always the same as the size of a pointer;
it's only Windows that went for the LLP64 model rather than LP64.

thanks
-- PMM
Fam Zheng Sept. 25, 2014, 1:12 a.m. UTC | #5
On Wed, 09/24 05:44, Peter Maydell wrote:
> On 24 September 2014 01:46, Fam Zheng <famz@redhat.com> wrote:
> > On Wed, 09/24 07:20, Stefan Weil wrote:
> >> Compiler warning (w32, w64):
> >>
> >> include/hw/virtio/virtio_ring.h:142:26: warning:
> >>  cast from pointer to integer of different size [-Wpointer-to-int-cast]
> >>
> >> When sizeof(long) < sizeof(void *), this is not only a warning but a
> >> real program error.
> >>
> >> Add also missing blanks in the same statement.
> >>
> >> Signed-off-by: Stefan Weil <sw@weilnetz.de>
> >> ---
> >>
> >> Peter, could you please apply this bug fix directly without pull request?
> 
> Applied to master, thanks.
> 
> >> diff --git a/include/hw/virtio/virtio_ring.h b/include/hw/virtio/virtio_ring.h
> >> index 8f58bc9..0b42e6e 100644
> >> --- a/include/hw/virtio/virtio_ring.h
> >> +++ b/include/hw/virtio/virtio_ring.h
> >> @@ -139,8 +139,8 @@ static inline void vring_init(struct vring *vr, unsigned int num, void *p,
> >>      vr->num = num;
> >>      vr->desc = p;
> >>      vr->avail = p + num*sizeof(struct vring_desc);
> >> -    vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + sizeof(uint16_t)
> >> -        + align-1) & ~(align - 1));
> >> +    vr->used = (void *)(((uintptr_t)&vr->avail->ring[num] + sizeof(uint16_t)
> >> +        + align - 1) & ~(align - 1));
> >>  }
> >>
> >>  static inline unsigned vring_size(unsigned int num, unsigned long align)
> >> --
> >> 1.7.10.4
> >>
> >
> > That was from copy&paste /usr/include/linux/virtio_ring.h. The patch looks good
> > to me, should linux also need this fix?
> 
> In Linux the "long" type is always the same as the size of a pointer;
> it's only Windows that went for the LLP64 model rather than LP64.
> 

Okay, Thanks for explaining!

Fam
diff mbox

Patch

diff --git a/include/hw/virtio/virtio_ring.h b/include/hw/virtio/virtio_ring.h
index 8f58bc9..0b42e6e 100644
--- a/include/hw/virtio/virtio_ring.h
+++ b/include/hw/virtio/virtio_ring.h
@@ -139,8 +139,8 @@  static inline void vring_init(struct vring *vr, unsigned int num, void *p,
     vr->num = num;
     vr->desc = p;
     vr->avail = p + num*sizeof(struct vring_desc);
-    vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + sizeof(uint16_t)
-        + align-1) & ~(align - 1));
+    vr->used = (void *)(((uintptr_t)&vr->avail->ring[num] + sizeof(uint16_t)
+        + align - 1) & ~(align - 1));
 }
 
 static inline unsigned vring_size(unsigned int num, unsigned long align)