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()
    * Steven Rostedt (rostedt@goodmis.org) wrote:
    >
    > On Fri, 7 Nov 2008, Mathieu Desnoyers wrote:
    > >
    > > __m_cnt_hi
    > > is read before
    > > mmio cnt_lo read
    > >
    > > for the detailed reasons explained in my previous discussion with
    > > Nicolas here :
    > > http://lkml.org/lkml/2008/10/21/1
    > >
    > > I use smp_rmb() to do this on SMP systems (hrm, actually, a rmb() could
    > > be required so it works also on UP systems safely wrt interrupts).
    >
    > smp_rmb turns into a compiler barrier on UP and should prevent the below
    > description.
    >

    Ah, right, preserving program order on UP should be enough. smp_rmb()
    then.

    Thanks,

    Mathieu

    > -- Steve
    >
    > >
    > > The write side is between the hardware counter, which is assumed to
    > > increment monotonically between each read, and the value __m_cnt_hi
    > > updated by the CPU. I don't see where we could put a wmb() there.
    > >
    > > Without barrier, the smp race looks as follow :
    > >
    > >
    > > CPU A B
    > > read hw cnt low (0xFFFFFFFA)
    > > read __m_cnt_hi (0x80000000)
    > > read hw cnt low (0x00000001)
    > > (wrap detected :
    > > (s32)(0x80000000 ^ 0x1) < 0)
    > > write __m_cnt_hi = 0x00000001
    > > read __m_cnt_hi (0x00000001)
    > > return 0x0000000100000001
    > > (wrap detected :
    > > (s32)(0x00000001 ^ 0xFFFFFFFA) < 0)
    > > write __m_cnt_hi = 0x80000001
    > > return 0x80000001FFFFFFFA
    > > (time jumps)
    > >
    > > And UP interrupt race :
    > >
    > > Thread context Interrupts
    > > read hw cnt low (0xFFFFFFFA)
    > > read __m_cnt_hi (0x80000000)
    > > read hw cnt low (0x00000001)
    > > (wrap detected :
    > > (s32)(0x80000000 ^ 0x1) < 0)
    > > write __m_cnt_hi = 0x00000001
    > > read __m_cnt_hi (0x00000001)
    > > return 0x0000000100000001
    > > (wrap detected :
    > > (s32)(0x00000001 ^ 0xFFFFFFFA) < 0)
    > > write __m_cnt_hi = 0x80000001
    > > return 0x80000001FFFFFFFA
    > > (time jumps)
    > >

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


    \
     
     \ /
      Last update: 2008-11-07 20:21    [W:0.028 / U:3.508 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site