Skip to content
  • Prakash Kamliya's avatar
    staging: android: sync: Signal pt before sync_timeline object gets destroyed · ac5b705b
    Prakash Kamliya authored
    
    
    There is a race condition
    
    Assume we have *one* sync_fence object, with *one* sync_pt
    which belongs to *one* sync_timeline, given this condition,
    sync_timeline->kref will have two counts, one for sync_timeline
    (implicit) and another for sync_pt.
    
    Assume following is the situation on CPU
    
    Theead-1 : (Thread which calls sync_timeline_destroy())
      -> (some function calls)
       -> sync_timeline_destory()
        -> sync_timeline_signal() (CPU is inside this
    function after putting reference to sync_timeline)
    
    At this time Thread-2 comes and does following
    
    Thread-2 : (fclose on fence fd)
    > sync_fence_release() -> because of fclose() on fence object
     -> sync_fence_free()
      -> sync_pt_free()
       -> kref_put(&pt->parent->kref, sync_timeline_free);
        -> sync_timeline_free() (CPU is inside this because
    this time kref will be zero after _put)
    
    Thread-2 will free sync_timeline object before Thread-1
    has finished its work inside sync_timeline_signal.
    
    With this change we signals all sync_pt before putting
    reference to sync_timeline object.
    
    Cc: Colin Cross <ccross@android.com>
    Cc: Android Kernel Team <kernel-team@android.com>
    Signed-off-by: default avatarPrakash Kamliya <pkamliya@codeaurora.org>
    [jstultz: minor commit subject tweak]
    Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ac5b705b