lkml.org 
[lkml]   [2008]   [Nov]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC patch 08/18] cnt32_to_63 should use smp_rmb()
    * David Howells (dhowells@redhat.com) wrote:
    > Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> wrote:
    >
    > > First off, using this macro with get_cycles() is simply buggy, because the
    > > macro expects _perfect_ order of timestamps, no skew whatsoever, or
    > > otherwise time could jump.
    >
    > Erm... Why can't I pass it get_cycles()? Are you saying that sched_clock()
    > in MN10300 is wrong for it's use of get_cycles() with cnt32_to_63()?
    >

    Yes. Do you think the synchronization of the cycles counters is
    _perfect_ across CPUs so that there is no possible way whatsoever that
    two cycle counter values appear to go backward between CPUs ? (also
    taking in account delays in __m_cnt_hi write-back...)

    As I showed in my previous example, if you are unlucky enough to hit the
    spot where the cycle counters go backward at the time warp edge, time
    will jump of 2^32, so about 4.29s at 1GHz.

    > > __x.lo = readl(cnt_lo); /* mmio read */
    >
    > readl() might insert an extra barrier instruction. Not only that, io_addr
    > must be unsigned long.

    If we expect the only correct use-case to be with readl(), I don't see
    the problem with added synchronization.

    >

    Ah, right, then the parameters should be updated accordingly.

    static inline u64 cnt32_to_63(unsigned long io_addr, u32 *__m_cnt_hi)
    {
    union cnt32_to_63 __x;
    __x.hi = *__m_cnt_hi; /* memory read for high bits internal state */
    rmb(); /*
    * read high bits before low bits insures time
    * does not go backward. Sync across
    * CPUs and for interrupts.
    */
    __x.lo = readl(io_addr); /* mmio read */
    if (unlikely((s32)(__x.hi ^ __x.lo) < 0))
    *__m_cnt_hi =
    __x.hi = (__x.hi ^ 0x80000000) + (__x.hi >> 31);
    return __x.val;
    }

    Mathieu

    > David

    --
    Mathieu Desnoyers
    OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68


    \
     
     \ /
      Last update: 2008-11-07 18:19    [W:2.661 / U:0.224 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site