2009-10-27 15:23:49

by Alan

[permalink] [raw]
Subject: Zillions of warnings in -next

I was thinking "what a lot of new warnings". Then I dug a little deeper
and it seems that someone never bothered to try and build
drivers/net/vbus-enet.c on a 32bit system.

So would you mind fixing the 27 new warnings introduced ?

Alan


2009-10-27 15:57:40

by Gregory Haskins

[permalink] [raw]
Subject: Re: Zillions of warnings in -next

>>> On 10/27/2009 at 11:25 AM, in message
<[email protected]>, Alan Cox
<[email protected]> wrote:
> I was thinking "what a lot of new warnings". Then I dug a little deeper
> and it seems that someone never bothered to try and build
> drivers/net/vbus-enet.c on a 32bit system.
>
> So would you mind fixing the 27 new warnings introduced ?
>
> Alan

Im on it.

Thanks Alan,
-Greg

2009-10-27 20:53:34

by Gregory Haskins

[permalink] [raw]
Subject: Re: Zillions of warnings in -next

>>> On 10/27/2009 at 11:25 AM, in message
<[email protected]>, Alan Cox
<[email protected]> wrote:
> I was thinking "what a lot of new warnings". Then I dug a little deeper
> and it seems that someone never bothered to try and build
> drivers/net/vbus-enet.c on a 32bit system.
>
> So would you mind fixing the 27 new warnings introduced ?
>
> Alan

I just did a 32-bit build and indeed reproduced the warnings. However, the warnings
appear to be dubious as the code is properly (afaict) annotated with explicit casts, and
I believe they are doing what I intended.

Basically I have structures that are always 64 bit (so we can have a mixed-mode 32-bit
guest talk to a 64-bit hypervisor, for instance). Therefore I am casting between native
and u64, but the compiler doesn't like this. Does anyone have any suggestions on ways
to fix this so the compiler is happy?

For instance:

struct foo {
u64 bar;
}

xmit_foo(void *ptr)
{
struct foo f;

f->bar = (u64)ptr; /* generates warning */
}

Kind Regards,
-Greg


2009-10-27 22:19:29

by Alan

[permalink] [raw]
Subject: Re: Zillions of warnings in -next

> I just did a 32-bit build and indeed reproduced the warnings. However, the warnings
> appear to be dubious as the code is properly (afaict) annotated with explicit casts, and
> I believe they are doing what I intended.
>
> Basically I have structures that are always 64 bit (so we can have a mixed-mode 32-bit
> guest talk to a 64-bit hypervisor, for instance). Therefore I am casting between native
> and u64, but the compiler doesn't like this. Does anyone have any suggestions on ways
> to fix this so the compiler is happy?

foo = (void *)(unsigned long)x

works for the general case because Linux assumes ptr fits ulong

Similarly in the other direction.

Alan

2009-10-27 22:42:56

by Randy Dunlap

[permalink] [raw]
Subject: [patch] Re: Zillions of warnings in -next

On Tue, 27 Oct 2009 22:21:12 +0000 Alan Cox wrote:

> > I just did a 32-bit build and indeed reproduced the warnings. However, the warnings
> > appear to be dubious as the code is properly (afaict) annotated with explicit casts, and
> > I believe they are doing what I intended.
> >
> > Basically I have structures that are always 64 bit (so we can have a mixed-mode 32-bit
> > guest talk to a 64-bit hypervisor, for instance). Therefore I am casting between native
> > and u64, but the compiler doesn't like this. Does anyone have any suggestions on ways
> > to fix this so the compiler is happy?
>
> foo = (void *)(unsigned long)x
>
> works for the general case because Linux assumes ptr fits ulong
>
> Similarly in the other direction.

Yes, I already had this done for venet and pci-bridge. Patch below.

---
From: Randy Dunlap <[email protected]>

Eliminate all cast warnings in vbus-enet.c and pci-bridge.c.

Signed-off-by: Randy Dunlap <[email protected]>
---
drivers/net/vbus-enet.c | 52 ++++++++++++++++++------------------
drivers/vbus/pci-bridge.c | 13 ++++-----
2 files changed, 33 insertions(+), 32 deletions(-)

--- linux-next-20091027.orig/drivers/net/vbus-enet.c
+++ linux-next-20091027/drivers/net/vbus-enet.c
@@ -162,18 +162,18 @@ rxdesc_alloc(struct vbus_enet_priv *priv
* larger than MTU, the host will grab pages out of the
* page-queue and populate additional IOVs
*/
- struct venet_sg *vsg = (struct venet_sg *)desc->cookie;
+ struct venet_sg *vsg = (struct venet_sg *)(unsigned long)desc->cookie;
struct venet_iov *iov = &vsg->iov[0];

memset(vsg, 0, SG_DESC_SIZE);

- vsg->cookie = (u64)skb;
+ vsg->cookie = (u64)(unsigned long)skb;
vsg->count = 1;

iov->ptr = (u64)__pa(skb->data);
iov->len = len;
} else {
- desc->cookie = (u64)skb;
+ desc->cookie = (u64)(unsigned long)skb;
desc->ptr = (u64)__pa(skb->data);
desc->len = len; /* total length */
}
@@ -207,7 +207,7 @@ rx_pageq_refill(struct vbus_enet_priv *p
page = alloc_page(GFP_KERNEL);
BUG_ON(!page);

- iter.desc->cookie = (u64)page;
+ iter.desc->cookie = (u64)(unsigned long)page;
iter.desc->ptr = (u64)__pa(page_address(page));
iter.desc->len = PAGE_SIZE;

@@ -253,7 +253,7 @@ rx_setup(struct vbus_enet_priv *priv)
void *addr = &priv->l4ro.pool[offset];

iter.desc->ptr = (u64)offset;
- iter.desc->cookie = (u64)addr;
+ iter.desc->cookie = (u64)(unsigned long)addr;
iter.desc->len = SG_DESC_SIZE;
}

@@ -297,19 +297,19 @@ rx_rxq_teardown(struct vbus_enet_priv *p
struct venet_sg *vsg;
int i;

- vsg = (struct venet_sg *)iter.desc->cookie;
+ vsg = (struct venet_sg *)(unsigned long)iter.desc->cookie;

/* skip i=0, since that is the skb->data IOV */
for (i = 1; i < vsg->count; i++) {
struct venet_iov *iov = &vsg->iov[i];
- struct page *page = (struct page *)iov->ptr;
+ struct page *page = (struct page *)(unsigned long)iov->ptr;

put_page(page);
}

- skb = (struct sk_buff *)vsg->cookie;
+ skb = (struct sk_buff *)(unsigned long)vsg->cookie;
} else
- skb = (struct sk_buff *)iter.desc->cookie;
+ skb = (struct sk_buff *)(unsigned long)iter.desc->cookie;

iter.desc->valid = 0;
wmb();
@@ -341,7 +341,7 @@ rx_l4ro_teardown(struct vbus_enet_priv *
* free each valid descriptor
*/
while (iter.desc->sown) {
- struct page *page = (struct page *)iter.desc->cookie;
+ struct page *page = (struct page *)(unsigned long)iter.desc->cookie;

iter.desc->valid = 0;
wmb();
@@ -432,7 +432,7 @@ tx_setup(struct vbus_enet_priv *priv)
iter.desc->ptr = (u64)__pa(vsg);
}

- iter.desc->cookie = (u64)vsg;
+ iter.desc->cookie = (u64)(unsigned long)vsg;
iter.desc->len = SG_DESC_SIZE;

ret = ioq_iter_seek(&iter, ioq_seek_next, 0, 0);
@@ -480,7 +480,7 @@ tx_teardown(struct vbus_enet_priv *priv)
* free each valid descriptor
*/
while (iter.desc->cookie) {
- struct venet_sg *vsg = (struct venet_sg *)iter.desc->cookie;
+ struct venet_sg *vsg = (struct venet_sg *)(unsigned long)iter.desc->cookie;

iter.desc->valid = 0;
wmb();
@@ -597,8 +597,8 @@ vbus_enet_change_mtu(struct net_device *
static struct sk_buff *
vbus_enet_l4ro_import(struct vbus_enet_priv *priv, struct ioq_ring_desc *desc)
{
- struct venet_sg *vsg = (struct venet_sg *)desc->cookie;
- struct sk_buff *skb = (struct sk_buff *)vsg->cookie;
+ struct venet_sg *vsg = (struct venet_sg *)(unsigned long)desc->cookie;
+ struct sk_buff *skb = (struct sk_buff *)(unsigned long)vsg->cookie;
struct skb_shared_info *sinfo = skb_shinfo(skb);
int i;

@@ -618,7 +618,7 @@ vbus_enet_l4ro_import(struct vbus_enet_p
/* skip i=0, since that is the skb->data IOV */
for (i = 1; i < vsg->count; i++) {
struct venet_iov *iov = &vsg->iov[i];
- struct page *page = (struct page *)iov->ptr;
+ struct page *page = (struct page *)(unsigned long)iov->ptr;
skb_frag_t *f = &sinfo->frags[i-1];

f->page = page;
@@ -691,7 +691,7 @@ fail:
static struct sk_buff *
vbus_enet_flat_import(struct vbus_enet_priv *priv, struct ioq_ring_desc *desc)
{
- struct sk_buff *skb = (struct sk_buff *)desc->cookie;
+ struct sk_buff *skb = (struct sk_buff *)(unsigned long)desc->cookie;

if (!desc->len) {
/*
@@ -816,7 +816,7 @@ vbus_enet_tx_start(struct sk_buff *skb,
BUG_ON(iter.desc->sown);

if (priv->sg) {
- struct venet_sg *vsg = (struct venet_sg *)iter.desc->cookie;
+ struct venet_sg *vsg = (struct venet_sg *)(unsigned long)iter.desc->cookie;
struct scatterlist sgl[MAX_SKB_FRAGS+1];
struct scatterlist *sg;
int count, maxcount = ARRAY_SIZE(sgl);
@@ -825,7 +825,7 @@ vbus_enet_tx_start(struct sk_buff *skb,

memset(vsg, 0, sizeof(*vsg));

- vsg->cookie = (u64)skb;
+ vsg->cookie = (u64)(unsigned long)skb;
vsg->len = skb->len;

if (skb->ip_summed == CHECKSUM_PARTIAL) {
@@ -873,7 +873,7 @@ vbus_enet_tx_start(struct sk_buff *skb,
* non scatter-gather mode: simply put the skb right onto the
* ring.
*/
- iter.desc->cookie = (u64)skb;
+ iter.desc->cookie = (u64)(unsigned long)skb;
iter.desc->len = (u64)skb->len;
iter.desc->ptr = (u64)__pa(skb->data);
}
@@ -950,10 +950,10 @@ vbus_enet_tx_reap_one(struct vbus_enet_p
if (priv->sg) {
struct venet_sg *vsg;

- vsg = (struct venet_sg *)iter.desc->cookie;
- skb = (struct sk_buff *)vsg->cookie;
+ vsg = (struct venet_sg *)(unsigned long)iter.desc->cookie;
+ skb = (struct sk_buff *)(unsigned long)vsg->cookie;
} else
- skb = (struct sk_buff *)iter.desc->cookie;
+ skb = (struct sk_buff *)(unsigned long)iter.desc->cookie;

/* Reset the descriptor */
iter.desc->valid = 0;
@@ -1069,7 +1069,7 @@ evq_txc_event(struct vbus_enet_priv *pri

vbus_enet_tx_reap(priv);

- vbus_enet_skb_complete(priv, (struct sk_buff *)event->cookie);
+ vbus_enet_skb_complete(priv, (struct sk_buff *)(unsigned long)event->cookie);
}

static void
@@ -1097,7 +1097,7 @@ deferred_evq_isr(unsigned long data)
while (!iter.desc->sown) {
struct venet_event_header *header;

- header = (struct venet_event_header *)iter.desc->cookie;
+ header = (struct venet_event_header *)(unsigned long)iter.desc->cookie;

switch (header->id) {
case VENET_EVENT_LINKSTATE:
@@ -1112,7 +1112,7 @@ deferred_evq_isr(unsigned long data)
break;
}

- memset((void *)iter.desc->cookie, 0, priv->evq.evsize);
+ memset((void *)(unsigned long)iter.desc->cookie, 0, priv->evq.evsize);

/* Advance the in-use tail */
ret = ioq_iter_pop(&iter, 0);
@@ -1254,7 +1254,7 @@ vbus_enet_evq_negcap(struct vbus_enet_pr
void *addr = &priv->evq.pool[offset];

iter.desc->ptr = (u64)offset;
- iter.desc->cookie = (u64)addr;
+ iter.desc->cookie = (u64)(unsigned long)addr;
iter.desc->len = query.evsize;

ret = ioq_iter_push(&iter, 0);
--- linux-next-20091027.orig/drivers/vbus/pci-bridge.c
+++ linux-next-20091027/drivers/vbus/pci-bridge.c
@@ -325,9 +325,10 @@ vbus_pci_device_shm(struct vbus_device_p
*/
shm_signal_get(&_signal->signal);

- params.signal.offset = (u64)sdesc - (u64)ptr;
+ params.signal.offset = (u64)(unsigned long)sdesc -
+ (u64)(unsigned long)ptr;
params.signal.prio = prio;
- params.signal.cookie = (u64)_signal;
+ params.signal.cookie = (u64)(unsigned long)_signal;

} else
params.signal.offset = -1; /* yes, this is a u32, but its ok */
@@ -526,7 +527,7 @@ event_devdrop(struct vbus_pci_handle_eve
static void
event_shmsignal(struct vbus_pci_handle_event *event)
{
- struct _signal *_signal = (struct _signal *)event->handle;
+ struct _signal *_signal = (struct _signal *)(unsigned long)event->handle;
struct irq_desc *desc = _signal->desc;

vbus_pci.stats.notify++;
@@ -536,7 +537,7 @@ event_shmsignal(struct vbus_pci_handle_e
static void
event_shmclose(struct vbus_pci_handle_event *event)
{
- struct _signal *_signal = (struct _signal *)event->handle;
+ struct _signal *_signal = (struct _signal *)(unsigned long)event->handle;

/*
* This reference was taken during the DEVICESHM call
@@ -593,7 +594,7 @@ eventq_init(int qlen)

BUG_ON(iter.desc->valid);

- desc->cookie = (u64)event;
+ desc->cookie = (u64)(unsigned long)event;
desc->ptr = (u64)__pa(event);
desc->len = len; /* total length */
desc->valid = 1;
@@ -643,7 +644,7 @@ eventq_wakeup(struct ioq_notifier *notif
struct ioq_ring_desc *desc = iter.desc;
struct vbus_pci_event *event;

- event = (struct vbus_pci_event *)desc->cookie;
+ event = (struct vbus_pci_event *)(unsigned long)desc->cookie;

switch (event->eventid) {
case VBUS_PCI_EVENT_DEVADD:

2009-10-27 23:25:16

by Joe Perches

[permalink] [raw]
Subject: Re: [patch] Re: Zillions of warnings in -next

On Tue, 2009-10-27 at 15:36 -0700, Randy Dunlap wrote:
> On Tue, 27 Oct 2009 22:21:12 +0000 Alan Cox wrote:
>
> > > I just did a 32-bit build and indeed reproduced the warnings. However, the warnings
> > > appear to be dubious as the code is properly (afaict) annotated with explicit casts, and
> > > I believe they are doing what I intended.
> > >
> > > Basically I have structures that are always 64 bit (so we can have a mixed-mode 32-bit
> > > guest talk to a 64-bit hypervisor, for instance). Therefore I am casting between native
> > > and u64, but the compiler doesn't like this. Does anyone have any suggestions on ways
> > > to fix this so the compiler is happy?
> >
> > foo = (void *)(unsigned long)x
> >
> > works for the general case because Linux assumes ptr fits ulong
> >
> > Similarly in the other direction.
>
> Yes, I already had this done for venet and pci-bridge. Patch below.
>
> ---
> From: Randy Dunlap <[email protected]>
>
> Eliminate all cast warnings in vbus-enet.c and pci-bridge.c.
>
> Signed-off-by: Randy Dunlap <[email protected]>
> ---
> drivers/net/vbus-enet.c | 52 ++++++++++++++++++------------------
> drivers/vbus/pci-bridge.c | 13 ++++-----
> 2 files changed, 33 insertions(+), 32 deletions(-)
>
> --- linux-next-20091027.orig/drivers/net/vbus-enet.c
> +++ linux-next-20091027/drivers/net/vbus-enet.c
> @@ -162,18 +162,18 @@ rxdesc_alloc(struct vbus_enet_priv *priv
> * larger than MTU, the host will grab pages out of the
> * page-queue and populate additional IOVs
> */
> - struct venet_sg *vsg = (struct venet_sg *)desc->cookie;
> + struct venet_sg *vsg = (struct venet_sg *)(unsigned long)desc->cookie;
> struct venet_iov *iov = &vsg->iov[0];
>
> memset(vsg, 0, SG_DESC_SIZE);
>
> - vsg->cookie = (u64)skb;
> + vsg->cookie = (u64)(unsigned long)skb;
> vsg->count = 1;
>
> iov->ptr = (u64)__pa(skb->data);
> iov->len = len;
> } else {
> - desc->cookie = (u64)skb;
> + desc->cookie = (u64)(unsigned long)skb;
> desc->ptr = (u64)__pa(skb->data);
> desc->len = len; /* total length */
> }
> @@ -207,7 +207,7 @@ rx_pageq_refill(struct vbus_enet_priv *p
> page = alloc_page(GFP_KERNEL);
> BUG_ON(!page);
>
> - iter.desc->cookie = (u64)page;
> + iter.desc->cookie = (u64)(unsigned long)page;
> iter.desc->ptr = (u64)__pa(page_address(page));
> iter.desc->len = PAGE_SIZE;
>
> @@ -253,7 +253,7 @@ rx_setup(struct vbus_enet_priv *priv)
> void *addr = &priv->l4ro.pool[offset];
>
> iter.desc->ptr = (u64)offset;
> - iter.desc->cookie = (u64)addr;
> + iter.desc->cookie = (u64)(unsigned long)addr;
> iter.desc->len = SG_DESC_SIZE;
> }
>
> @@ -297,19 +297,19 @@ rx_rxq_teardown(struct vbus_enet_priv *p
> struct venet_sg *vsg;
> int i;
>
> - vsg = (struct venet_sg *)iter.desc->cookie;
> + vsg = (struct venet_sg *)(unsigned long)iter.desc->cookie;
>
> /* skip i=0, since that is the skb->data IOV */
> for (i = 1; i < vsg->count; i++) {
> struct venet_iov *iov = &vsg->iov[i];
> - struct page *page = (struct page *)iov->ptr;
> + struct page *page = (struct page *)(unsigned long)iov->ptr;
>
> put_page(page);
> }
>
> - skb = (struct sk_buff *)vsg->cookie;
> + skb = (struct sk_buff *)(unsigned long)vsg->cookie;
> } else
> - skb = (struct sk_buff *)iter.desc->cookie;
> + skb = (struct sk_buff *)(unsigned long)iter.desc->cookie;
>
> iter.desc->valid = 0;
> wmb();
> @@ -341,7 +341,7 @@ rx_l4ro_teardown(struct vbus_enet_priv *
> * free each valid descriptor
> */
> while (iter.desc->sown) {
> - struct page *page = (struct page *)iter.desc->cookie;
> + struct page *page = (struct page *)(unsigned long)iter.desc->cookie;
>
> iter.desc->valid = 0;
> wmb();
> @@ -432,7 +432,7 @@ tx_setup(struct vbus_enet_priv *priv)
> iter.desc->ptr = (u64)__pa(vsg);
> }
>
> - iter.desc->cookie = (u64)vsg;
> + iter.desc->cookie = (u64)(unsigned long)vsg;
> iter.desc->len = SG_DESC_SIZE;
>
> ret = ioq_iter_seek(&iter, ioq_seek_next, 0, 0);
> @@ -480,7 +480,7 @@ tx_teardown(struct vbus_enet_priv *priv)
> * free each valid descriptor
> */
> while (iter.desc->cookie) {
> - struct venet_sg *vsg = (struct venet_sg *)iter.desc->cookie;
> + struct venet_sg *vsg = (struct venet_sg *)(unsigned long)iter.desc->cookie;
>
> iter.desc->valid = 0;
> wmb();
> @@ -597,8 +597,8 @@ vbus_enet_change_mtu(struct net_device *
> static struct sk_buff *
> vbus_enet_l4ro_import(struct vbus_enet_priv *priv, struct ioq_ring_desc *desc)
> {
> - struct venet_sg *vsg = (struct venet_sg *)desc->cookie;
> - struct sk_buff *skb = (struct sk_buff *)vsg->cookie;
> + struct venet_sg *vsg = (struct venet_sg *)(unsigned long)desc->cookie;
> + struct sk_buff *skb = (struct sk_buff *)(unsigned long)vsg->cookie;
> struct skb_shared_info *sinfo = skb_shinfo(skb);
> int i;
>
> @@ -618,7 +618,7 @@ vbus_enet_l4ro_import(struct vbus_enet_p
> /* skip i=0, since that is the skb->data IOV */
> for (i = 1; i < vsg->count; i++) {
> struct venet_iov *iov = &vsg->iov[i];
> - struct page *page = (struct page *)iov->ptr;
> + struct page *page = (struct page *)(unsigned long)iov->ptr;
> skb_frag_t *f = &sinfo->frags[i-1];
>
> f->page = page;
> @@ -691,7 +691,7 @@ fail:
> static struct sk_buff *
> vbus_enet_flat_import(struct vbus_enet_priv *priv, struct ioq_ring_desc *desc)
> {
> - struct sk_buff *skb = (struct sk_buff *)desc->cookie;
> + struct sk_buff *skb = (struct sk_buff *)(unsigned long)desc->cookie;
>
> if (!desc->len) {
> /*
> @@ -816,7 +816,7 @@ vbus_enet_tx_start(struct sk_buff *skb,
> BUG_ON(iter.desc->sown);
>
> if (priv->sg) {
> - struct venet_sg *vsg = (struct venet_sg *)iter.desc->cookie;
> + struct venet_sg *vsg = (struct venet_sg *)(unsigned long)iter.desc->cookie;
> struct scatterlist sgl[MAX_SKB_FRAGS+1];
> struct scatterlist *sg;
> int count, maxcount = ARRAY_SIZE(sgl);
> @@ -825,7 +825,7 @@ vbus_enet_tx_start(struct sk_buff *skb,
>
> memset(vsg, 0, sizeof(*vsg));
>
> - vsg->cookie = (u64)skb;
> + vsg->cookie = (u64)(unsigned long)skb;
> vsg->len = skb->len;
>
> if (skb->ip_summed == CHECKSUM_PARTIAL) {
> @@ -873,7 +873,7 @@ vbus_enet_tx_start(struct sk_buff *skb,
> * non scatter-gather mode: simply put the skb right onto the
> * ring.
> */
> - iter.desc->cookie = (u64)skb;
> + iter.desc->cookie = (u64)(unsigned long)skb;
> iter.desc->len = (u64)skb->len;
> iter.desc->ptr = (u64)__pa(skb->data);
> }
> @@ -950,10 +950,10 @@ vbus_enet_tx_reap_one(struct vbus_enet_p
> if (priv->sg) {
> struct venet_sg *vsg;
>
> - vsg = (struct venet_sg *)iter.desc->cookie;
> - skb = (struct sk_buff *)vsg->cookie;
> + vsg = (struct venet_sg *)(unsigned long)iter.desc->cookie;
> + skb = (struct sk_buff *)(unsigned long)vsg->cookie;
> } else
> - skb = (struct sk_buff *)iter.desc->cookie;
> + skb = (struct sk_buff *)(unsigned long)iter.desc->cookie;
>
> /* Reset the descriptor */
> iter.desc->valid = 0;
> @@ -1069,7 +1069,7 @@ evq_txc_event(struct vbus_enet_priv *pri
>
> vbus_enet_tx_reap(priv);
>
> - vbus_enet_skb_complete(priv, (struct sk_buff *)event->cookie);
> + vbus_enet_skb_complete(priv, (struct sk_buff *)(unsigned long)event->cookie);
> }
>
> static void
> @@ -1097,7 +1097,7 @@ deferred_evq_isr(unsigned long data)
> while (!iter.desc->sown) {
> struct venet_event_header *header;
>
> - header = (struct venet_event_header *)iter.desc->cookie;
> + header = (struct venet_event_header *)(unsigned long)iter.desc->cookie;
>
> switch (header->id) {
> case VENET_EVENT_LINKSTATE:
> @@ -1112,7 +1112,7 @@ deferred_evq_isr(unsigned long data)
> break;
> }
>
> - memset((void *)iter.desc->cookie, 0, priv->evq.evsize);
> + memset((void *)(unsigned long)iter.desc->cookie, 0, priv->evq.evsize);
>
> /* Advance the in-use tail */
> ret = ioq_iter_pop(&iter, 0);
> @@ -1254,7 +1254,7 @@ vbus_enet_evq_negcap(struct vbus_enet_pr
> void *addr = &priv->evq.pool[offset];
>
> iter.desc->ptr = (u64)offset;
> - iter.desc->cookie = (u64)addr;
> + iter.desc->cookie = (u64)(unsigned long)addr;
> iter.desc->len = query.evsize;
>
> ret = ioq_iter_push(&iter, 0);
> --- linux-next-20091027.orig/drivers/vbus/pci-bridge.c
> +++ linux-next-20091027/drivers/vbus/pci-bridge.c
> @@ -325,9 +325,10 @@ vbus_pci_device_shm(struct vbus_device_p
> */
> shm_signal_get(&_signal->signal);
>
> - params.signal.offset = (u64)sdesc - (u64)ptr;
> + params.signal.offset = (u64)(unsigned long)sdesc -
> + (u64)(unsigned long)ptr;
> params.signal.prio = prio;
> - params.signal.cookie = (u64)_signal;
> + params.signal.cookie = (u64)(unsigned long)_signal;
>
> } else
> params.signal.offset = -1; /* yes, this is a u32, but its ok */
> @@ -526,7 +527,7 @@ event_devdrop(struct vbus_pci_handle_eve
> static void
> event_shmsignal(struct vbus_pci_handle_event *event)
> {
> - struct _signal *_signal = (struct _signal *)event->handle;
> + struct _signal *_signal = (struct _signal *)(unsigned long)event->handle;
> struct irq_desc *desc = _signal->desc;
>
> vbus_pci.stats.notify++;
> @@ -536,7 +537,7 @@ event_shmsignal(struct vbus_pci_handle_e
> static void
> event_shmclose(struct vbus_pci_handle_event *event)
> {
> - struct _signal *_signal = (struct _signal *)event->handle;
> + struct _signal *_signal = (struct _signal *)(unsigned long)event->handle;
>
> /*
> * This reference was taken during the DEVICESHM call
> @@ -593,7 +594,7 @@ eventq_init(int qlen)
>
> BUG_ON(iter.desc->valid);
>
> - desc->cookie = (u64)event;
> + desc->cookie = (u64)(unsigned long)event;
> desc->ptr = (u64)__pa(event);
> desc->len = len; /* total length */
> desc->valid = 1;
> @@ -643,7 +644,7 @@ eventq_wakeup(struct ioq_notifier *notif
> struct ioq_ring_desc *desc = iter.desc;
> struct vbus_pci_event *event;
>
> - event = (struct vbus_pci_event *)desc->cookie;
> + event = (struct vbus_pci_event *)(unsigned long)desc->cookie;
>
> switch (event->eventid) {
> case VBUS_PCI_EVENT_DEVADD:

#define cast_cookie(type, cookie) ((type)(unsigned long)(cookie))
#define assign_cookie(var, cookie) (var) = ((typeof(var))(unsigned
long)(cookie))
?

> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/


2009-10-28 00:08:55

by Stefan Richter

[permalink] [raw]
Subject: Re: [patch] Re: Zillions of warnings in -next

Joe Perches wrote:
> On Tue, 2009-10-27 at 15:36 -0700, Randy Dunlap wrote:
[...]
>> @@ -643,7 +644,7 @@ eventq_wakeup(struct ioq_notifier *notif
>> struct ioq_ring_desc *desc = iter.desc;
>> struct vbus_pci_event *event;
>>
>> - event = (struct vbus_pci_event *)desc->cookie;
>> + event = (struct vbus_pci_event *)(unsigned long)desc->cookie;
>>
>> switch (event->eventid) {
>> case VBUS_PCI_EVENT_DEVADD:
>
> #define cast_cookie(type, cookie) ((type)(unsigned long)(cookie))
> #define assign_cookie(var, cookie) (var) = ((typeof(var))(unsigned
> long)(cookie))

C is usually preferred over cpp. :-)
--
Stefan Richter
-=====-==--= =-=- ===--
http://arcgraph.de/sr/

2009-10-28 13:36:03

by Gregory Haskins

[permalink] [raw]
Subject: Re: [patch] Re: Zillions of warnings in -next

Randy Dunlap wrote:
> On Tue, 27 Oct 2009 22:21:12 +0000 Alan Cox wrote:
>
>>> I just did a 32-bit build and indeed reproduced the warnings. However, the warnings
>>> appear to be dubious as the code is properly (afaict) annotated with explicit casts, and
>>> I believe they are doing what I intended.
>>>
>>> Basically I have structures that are always 64 bit (so we can have a mixed-mode 32-bit
>>> guest talk to a 64-bit hypervisor, for instance). Therefore I am casting between native
>>> and u64, but the compiler doesn't like this. Does anyone have any suggestions on ways
>>> to fix this so the compiler is happy?
>> foo = (void *)(unsigned long)x
>>
>> works for the general case because Linux assumes ptr fits ulong
>>
>> Similarly in the other direction.

Thank you, Alan. Your tip was spot on.

>
> Yes, I already had this done for venet and pci-bridge. Patch below.
>
> ---
> From: Randy Dunlap <[email protected]>
>
> Eliminate all cast warnings in vbus-enet.c and pci-bridge.c.
>
> Signed-off-by: Randy Dunlap <[email protected]>

Thank you, Randy. Applied.

Kind Regards,
-Greg



Attachments:
signature.asc (267.00 B)
OpenPGP digital signature