lkml.org 
[lkml]   [2013]   [Nov]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [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




    \
     
     \ /
      Last update: 2013-11-08 20:41    [W:4.132 / U:0.128 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site