Messages in this thread | | | Date | Fri, 08 Nov 2013 11:17:41 -0800 | From | "H. Peter Anvin" <> | Subject | Re: [PATCH v2 2/2] x86: add prefetching to do_csum |
| |
On 11/08/2013 11:07 AM, Neil Horman wrote: > On Fri, Nov 08, 2013 at 08:51:07AM -0800, Joe Perches wrote: >> On Fri, 2013-11-08 at 11:25 -0500, Neil Horman wrote: >>> On Wed, Nov 06, 2013 at 12:07:38PM -0800, Joe Perches wrote: >>>> On Wed, 2013-11-06 at 15:02 -0500, Neil Horman wrote: >>>>> On Wed, Nov 06, 2013 at 09:19:23AM -0800, Joe Perches wrote: >>>> [] >>>>>> __always_inline instead of inline >>>>>> static __always_inline void prefetch_lines(const void *addr, size_t len) >>>>>> { >>>>>> const void *end = addr + len; >>>>>> ... >>>>>> >>>>>> buff doesn't need a void * cast in prefetch_lines >>>>>> >>>>> Actually I take back what I said here, we do need the cast, not for a conversion >>>>> from unsigned char * to void *, but rather to discard the const qualifier >>>>> without making the compiler complain. >>>> >>>> Not if the function is changed to const void * >>>> and end is also const void * as shown. >>>> >>> Addr is incremented in the for loop, so it can't be const. I could add a loop >>> counter variable on the stack, but that doesn't seem like it would help anything >> >> Perhaps you meant >> void * const addr; >> but that's not what I wrote. >> > No, I meant smoething like: > static __always_inline void prefetch_lines(const void * addr, size_t len) > { > const void *tmp = (void *)addr; > ... > for(;tmp<end; tmp+=cache_line_size()) > ... > } > >> Let me know if this doesn't compile. >> It does here... > Huh, it does. But that makes very little sense to me. by qualifying addr as > const, how is the compiler not throwing a warning in the for loop about us > incrementing that same variable? >
As Joe is pointing out, you are confusing "const foo *tmp" with "foo * const tmp". The former means: "tmp is a variable pointing to type const foo". The latter means: "tmp is a constant pointing to type foo".
There is no problem modifying tmp in the former case; it prohibits modifying *tmp. In the latter case modifying tmp is prohibited, but modifying *tmp is just fine.
Now, "const char *" would arguably be more correct here since arithmetic on void is a gcc extension, but the same argument applies there.
-hpa
| |