lkml.org 
[lkml]   [2014]   [Feb]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [RFC][PATCH 0/5] arch: atomic rework
    From
    On Mon, Feb 17, 2014 at 7:24 PM, Linus Torvalds
    <torvalds@linux-foundation.org> wrote:
    >
    > As far as I can tell, the intent is that you can't do value
    > speculation (except perhaps for the "relaxed", which quite frankly
    > sounds largely useless).

    Hmm. The language I see for "consume" is not obvious:

    "Consume operation: no reads in the current thread dependent on the
    value currently loaded can be reordered before this load"

    and it could make a compiler writer say that value speculation is
    still valid, if you do it like this (with "ptr" being the atomic
    variable):

    value = ptr->val;

    into

    tmp = ptr;
    value = speculated.value;
    if (unlikely(tmp != &speculated))
    value = tmp->value;

    which is still bogus. The load of "ptr" does happen before the load of
    "value = speculated->value" in the instruction stream, but it would
    still result in the CPU possibly moving the value read before the
    pointer read at least on ARM and power.

    So if you're a compiler person, you think you followed the letter of
    the spec - as far as *you* were concerned, no load dependent on the
    value of the atomic load moved to before the atomic load. You go home,
    happy, knowing you've done your job. Never mind that you generated
    code that doesn't actually work.

    I dread having to explain to the compiler person that he may be right
    in some theoretical virtual machine, but the code is subtly broken and
    nobody will ever understand why (and likely not be able to create a
    test-case showing the breakage).

    But maybe the full standard makes it clear that "reordered before this
    load" actually means on the real hardware, not just in the generated
    instruction stream. Reading it with understanding of the *intent* and
    understanding all the different memory models that requirement should
    be obvious (on alpha, you need an "rmb" instruction after the load),
    but ...

    Linus


    \
     
     \ /
      Last update: 2014-02-18 05:21    [W:2.194 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site