• Joonsoo Kim's avatar
    ARM: 7643/1: sched: correct update_sched_clock() · 7c4e9ced
    Joonsoo Kim authored
    If we want load epoch_cyc and epoch_ns atomically,
    we should update epoch_cyc_copy first of all.
    This notify reader that updating is in progress.
    
    If we update epoch_cyc first like as current implementation,
    there is subtle error case.
    Look at the below example.
    
    <Initial Condition>
    cyc = 9
    ns = 900
    cyc_copy = 9
    
    == CASE 1 ==
    <CPU A = reader>           <CPU B = updater>
                               write cyc = 10
    read cyc = 10
    read ns = 900
                               write ns = 1000
                               write cyc_copy = 10
    read cyc_copy = 10
    
    output = (10, 900)
    
    == CASE 2 ==
    <CPU A = reader>           <CPU B = updater>
    read cyc = 9
                               write cyc = 10
                               write ns = 1000
    read ns = 1000
    read cyc_copy = 9
                               write cyc_copy = 10
    output = (9, 1000)
    
    If atomic read is ensured, output should be (9, 900) or (10, 1000).
    But, output in example case are not.
    
    So, change updating sequence in order to correct this problem.
    
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarJoonsoo Kim <iamjoonsoo.kim@lge.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    7c4e9ced
sched_clock.c 4.82 KB