* [patch 2.6.22-rc2-git] spidev compiler warning gone
@ 2007-05-25 17:35 David Brownell
[not found] ` <200705251035.10587.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
0 siblings, 1 reply; 6+ messages in thread
From: David Brownell @ 2007-05-25 17:35 UTC (permalink / raw)
To: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f; +Cc: Andrew Morton
Get rid of annoying GCC warning on 32-bit platforms. The trick is to
add an extra cast using "ptrdiff_t" to convert the u64 to the correct
size integer, and only then casting it into a "void *" pointer.
Signed-off-by: David Brownell <dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>
---
drivers/spi/spidev.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
--- g26.orig/drivers/spi/spidev.c 2007-05-24 12:04:46.000000000 -0700
+++ g26/drivers/spi/spidev.c 2007-05-25 10:31:56.000000000 -0700
@@ -181,7 +181,8 @@ static int spidev_message(struct spidev_
}
if (u_tmp->tx_buf) {
k_tmp->tx_buf = buf;
- if (copy_from_user(buf, (const u8 __user *)u_tmp->tx_buf,
+ if (copy_from_user(buf, (const u8 __user *)
+ (ptrdiff_t) u_tmp->tx_buf,
u_tmp->len))
goto done;
}
@@ -213,7 +214,8 @@ static int spidev_message(struct spidev_
buf = spidev->buffer;
for (n = n_xfers, u_tmp = u_xfers; n; n--, u_tmp++) {
if (u_tmp->rx_buf) {
- if (__copy_to_user((u8 __user *)u_tmp->rx_buf, buf,
+ if (__copy_to_user((u8 __user *)
+ (ptrdiff_t) u_tmp->rx_buf, buf,
u_tmp->len)) {
status = -EFAULT;
goto done;
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
^ permalink raw reply [flat|nested] 6+ messages in thread[parent not found: <200705251035.10587.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>]
* Re: [patch 2.6.22-rc2-git] spidev compiler warning gone [not found] ` <200705251035.10587.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org> @ 2007-05-29 22:02 ` Andrew Morton [not found] ` <20070529150214.75204439.akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org> 0 siblings, 1 reply; 6+ messages in thread From: Andrew Morton @ 2007-05-29 22:02 UTC (permalink / raw) To: David Brownell; +Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f On Fri, 25 May 2007 10:35:07 -0700 David Brownell <david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org> wrote: > Get rid of annoying GCC warning on 32-bit platforms. The trick is to > add an extra cast using "ptrdiff_t" to convert the u64 to the correct > size integer, and only then casting it into a "void *" pointer. > > Signed-off-by: David Brownell <dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org> > --- > drivers/spi/spidev.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > --- g26.orig/drivers/spi/spidev.c 2007-05-24 12:04:46.000000000 -0700 > +++ g26/drivers/spi/spidev.c 2007-05-25 10:31:56.000000000 -0700 > @@ -181,7 +181,8 @@ static int spidev_message(struct spidev_ > } > if (u_tmp->tx_buf) { > k_tmp->tx_buf = buf; > - if (copy_from_user(buf, (const u8 __user *)u_tmp->tx_buf, > + if (copy_from_user(buf, (const u8 __user *) > + (ptrdiff_t) u_tmp->tx_buf, > u_tmp->len)) > goto done; > } > @@ -213,7 +214,8 @@ static int spidev_message(struct spidev_ > buf = spidev->buffer; > for (n = n_xfers, u_tmp = u_xfers; n; n--, u_tmp++) { > if (u_tmp->rx_buf) { > - if (__copy_to_user((u8 __user *)u_tmp->rx_buf, buf, > + if (__copy_to_user((u8 __user *) > + (ptrdiff_t) u_tmp->rx_buf, buf, > u_tmp->len)) { > status = -EFAULT; > goto done; This seems overly tricky. The way we normally squish that warning is via a (long) cast. ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ ^ permalink raw reply [flat|nested] 6+ messages in thread
[parent not found: <20070529150214.75204439.akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>]
* Re: [patch 2.6.22-rc2-git] spidev compiler warning gone [not found] ` <20070529150214.75204439.akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org> @ 2007-05-29 22:39 ` David Brownell [not found] ` <200705291539.04253.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org> 0 siblings, 1 reply; 6+ messages in thread From: David Brownell @ 2007-05-29 22:39 UTC (permalink / raw) To: Andrew Morton; +Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f On Tuesday 29 May 2007, Andrew Morton wrote: > On Fri, 25 May 2007 10:35:07 -0700 > David Brownell <david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org> wrote: > > > Get rid of annoying GCC warning on 32-bit platforms. The trick is to > > add an extra cast using "ptrdiff_t" to convert the u64 to the correct > > size integer, and only then casting it into a "void *" pointer. > > > > ... > > - if (__copy_to_user((u8 __user *)u_tmp->rx_buf, buf, > > + if (__copy_to_user((u8 __user *) > > + (ptrdiff_t) u_tmp->rx_buf, buf, > > ... > > This seems overly tricky. The way we normally squish that warning is > via a (long) cast. Well, "ptrdiff_t" seems equivalent to "long" in common cases. Presumably C99 guarantees pointer-to-long conversions work in both directions? It seemed there must necessarily be such a guarantee for "ptrdiff_t", even if it weren't true for "long". I didn't have a copy of a C spec to consult. ;) - Dave ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ ^ permalink raw reply [flat|nested] 6+ messages in thread
[parent not found: <200705291539.04253.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>]
* Re: [patch 2.6.22-rc2-git] spidev compiler warning gone [not found] ` <200705291539.04253.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org> @ 2007-05-29 22:59 ` Andrew Morton [not found] ` <20070529155911.105c65b7.akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org> 0 siblings, 1 reply; 6+ messages in thread From: Andrew Morton @ 2007-05-29 22:59 UTC (permalink / raw) To: David Brownell; +Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f On Tue, 29 May 2007 15:39:04 -0700 David Brownell <david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org> wrote: > On Tuesday 29 May 2007, Andrew Morton wrote: > > On Fri, 25 May 2007 10:35:07 -0700 > > David Brownell <david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org> wrote: > > > > > Get rid of annoying GCC warning on 32-bit platforms. The trick is to > > > add an extra cast using "ptrdiff_t" to convert the u64 to the correct > > > size integer, and only then casting it into a "void *" pointer. > > > > > > ... > > > - if (__copy_to_user((u8 __user *)u_tmp->rx_buf, buf, > > > + if (__copy_to_user((u8 __user *) > > > + (ptrdiff_t) u_tmp->rx_buf, buf, > > > ... > > > > This seems overly tricky. The way we normally squish that warning is > > via a (long) cast. > > Well, "ptrdiff_t" seems equivalent to "long" in common cases. > > Presumably C99 guarantees pointer-to-long conversions work in > both directions? It seemed there must necessarily be such a > guarantee for "ptrdiff_t", even if it weren't true for "long". > I didn't have a copy of a C spec to consult. ;) > Thing is, the kernel does a cast of an integer-type to a pointer-type in a *lot* of places. And the standard way in which we squish the warning is via a (long) cast. So it's a standard pattern and people understand it. Whereas the ptrdiff_t thing will make readers go "wtf?". Even if it deos happen to work. ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ ^ permalink raw reply [flat|nested] 6+ messages in thread
[parent not found: <20070529155911.105c65b7.akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>]
* Re: [patch 2.6.22-rc2-git] spidev compiler warning gone [not found] ` <20070529155911.105c65b7.akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org> @ 2007-05-30 2:05 ` David Brownell [not found] ` <200705291905.34670.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org> 0 siblings, 1 reply; 6+ messages in thread From: David Brownell @ 2007-05-30 2:05 UTC (permalink / raw) To: Andrew Morton; +Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f > > > > Get rid of annoying GCC warning on 32-bit platforms. The trick is to > > > > add an extra cast using "ptrdiff_t" to convert the u64 to the correct > > > > size integer, and only then casting it into a "void *" pointer. > > > > > > > > ... > > > > - if (__copy_to_user((u8 __user *)u_tmp->rx_buf, buf, > > > > + if (__copy_to_user((u8 __user *) > > > > + (ptrdiff_t) u_tmp->rx_buf, buf, > > > > ... > > > > > > This seems overly tricky. The way we normally squish that warning is > > > via a (long) cast. > > > > Well, "ptrdiff_t" seems equivalent to "long" in common cases. > > > > Presumably C99 guarantees pointer-to-long conversions work in > > both directions? It seemed there must necessarily be such a > > guarantee for "ptrdiff_t", even if it weren't true for "long". > > I didn't have a copy of a C spec to consult. ;) > > > > Thing is, the kernel does a cast of an integer-type to a pointer-type in a > *lot* of places. And the standard way in which we squish the warning is > via a (long) cast. Good to know, but I didn't notice any examples anywhere in the source code of doing that. I used the first solution I found, when I went hunting for a fix. It wasn't "long". And it appears that "long" has fewer portability guarantees... Something in Documentation/* should talk about 64-bit cleanliness, and maybe mention such issues. > So it's a standard pattern and people understand it. Whereas the ptrdiff_t > thing will make readers go "wtf?". Even if it deos happen to work. At this point, "long" would surprise *me*! I notice you didn't answer my question about C specs and "long". "ptrdiff_t" sure seems to be a standard C data type designed specifically to solve that class of 32/64/... portability problem. "intptr_t" would seem to be the most standard type, but I don't see it in kernel includes. I notice that GCC docs say ptrdiff_t "will probably be one of the standard integer types (short, int, long) but might be a nonstandard type that exists only for this purpose". So using "long" isn't as portable, and isn't even guaranteed to work everywhere. - Dave ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ ^ permalink raw reply [flat|nested] 6+ messages in thread
[parent not found: <200705291905.34670.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>]
* Re: [patch 2.6.22-rc2-git] spidev compiler warning gone [not found] ` <200705291905.34670.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org> @ 2007-05-30 2:19 ` Andrew Morton 0 siblings, 0 replies; 6+ messages in thread From: Andrew Morton @ 2007-05-30 2:19 UTC (permalink / raw) To: David Brownell; +Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f On Tue, 29 May 2007 19:05:34 -0700 David Brownell <david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org> wrote: > > > > > > Get rid of annoying GCC warning on 32-bit platforms. The trick is to > > > > > add an extra cast using "ptrdiff_t" to convert the u64 to the correct > > > > > size integer, and only then casting it into a "void *" pointer. > > > > > > > > > > ... > > > > > - if (__copy_to_user((u8 __user *)u_tmp->rx_buf, buf, > > > > > + if (__copy_to_user((u8 __user *) > > > > > + (ptrdiff_t) u_tmp->rx_buf, buf, > > > > > ... > > > > > > > > This seems overly tricky. The way we normally squish that warning is > > > > via a (long) cast. > > > > > > Well, "ptrdiff_t" seems equivalent to "long" in common cases. > > > > > > Presumably C99 guarantees pointer-to-long conversions work in > > > both directions? It seemed there must necessarily be such a > > > guarantee for "ptrdiff_t", even if it weren't true for "long". > > > I didn't have a copy of a C spec to consult. ;) > > > > > > > Thing is, the kernel does a cast of an integer-type to a pointer-type in a > > *lot* of places. And the standard way in which we squish the warning is > > via a (long) cast. > > Good to know, but I didn't notice any examples anywhere in the source > code of doing that. I used the first solution I found, when I went > hunting for a fix. It wasn't "long". And it appears that "long" has > fewer portability guarantees... Kernel assumes that sizeof(long)==sizeof(foo *) in a tremendous number of places. That's why we safely use (long) for this. box:/usr/src/linux-2.6.22-rc3> fgrep -r '*)(long)' . | wc -l 95 box:/usr/src/linux-2.6.22-rc3> fgrep -r '(int)(long)' . | wc -l 45 box:/usr/src/linux-2.6.22-rc3> fgrep -r '(ptrdiff_t)' . | wc -l 7 > Something in Documentation/* should talk about 64-bit cleanliness, > and maybe mention such issues. spose so. > > > So it's a standard pattern and people understand it. Whereas the ptrdiff_t > > thing will make readers go "wtf?". Even if it deos happen to work. > > At this point, "long" would surprise *me*! I notice you didn't > answer my question about C specs and "long". oh. I wasn't very interested, sorry ;) I'm just pointing out that (long) will cause least-surprise to most-people. ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2007-05-30 2:19 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-25 17:35 [patch 2.6.22-rc2-git] spidev compiler warning gone David Brownell
[not found] ` <200705251035.10587.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-05-29 22:02 ` Andrew Morton
[not found] ` <20070529150214.75204439.akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>
2007-05-29 22:39 ` David Brownell
[not found] ` <200705291539.04253.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-05-29 22:59 ` Andrew Morton
[not found] ` <20070529155911.105c65b7.akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>
2007-05-30 2:05 ` David Brownell
[not found] ` <200705291905.34670.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-05-30 2:19 ` Andrew Morton
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.