• Arnd Bergmann's avatar
    staging: vchiq: rework remove_event handling · 852b2876
    Arnd Bergmann authored
    I had started the removal of semaphores in this driver without knowing
    that Nicolas Saenz Julienne also worked on this. In case of the "remote
    event" infrastructure, my solution seemed significantly better, so I'm
    proposing this as a change on top.
    
    The problem with using either semaphores or completions here is that
    it's an overly complex way of waking up a thread, and it looks like the
    'count' of the semaphore can easily get out of sync, even though I found
    it hard to come up with a specific example.
    
    Changing it to a 'wait_queue_head_t' instead of a completion simplifies
    this by letting us wait directly on the 'event->fired' variable that is
    set by the videocore.
    
    Another simplification is passing the wait queue directly into the helper
    functions instead of going through the fragile logic of recording the
    offset inside of a structure as part of a shared memory variable. This
    also avoids one uncached memory read and should be faster.
    
    Note that I'm changing it back to 'killable' after the previous patch
    changed 'killable' to 'interruptible', apparently based on a misunderstanding
    of the subtle down_interruptible() macro override in vchiq_killable.h.
    
    Fixes: f27e47bc ("staging: vchiq: use completions instead of semaphores")
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    852b2876
vchiq_core.c 96 KB