• Dani Liberman's avatar
    habanalabs: fix race condition in multi CS completion · 3beaf903
    Dani Liberman authored
    
    
    Race example scenario:
    1. User have 2 threads that waits on multi CS:
       - thread_0 waits on QID 0 and uses multi CS context 0.
       - thread_1 waits on QID 1 and uses multi CS context 1.
    2. thread_1 got completion and release multi CS context 1.
    3. CS related to multi CS of thread_0 starts executing
       complete_multi_cs function, the first iteration of the loop
       completes the multi CS of thread_0, hence multi CS context 0
       is released.
    4. thread_1 waits on QID 1 and uses multi CS context 0.
    5. thread_0 waits on QID 0 and uses multi CS context 1.
    6. The second iterattion of the loop (from step 3) starts, which
       means, start checking multi CS context 1:
       - multi CS contetxt is being used by thread_0 waiting on QID 0.
       - The fence of the CS (still CS from step 3) has QID map the same
         as the multi CS context 1.
       - multi CS context 1 (thread_0) gets completion on CS that triggered
         already thread_0 (with multi CS context 0) and is no longer
         being waited on.
    
    Fixed by exiting the loop in complete_multi_cs after getting completion
    Signed-off-by: default avatarDani Liberman <dliberman@habana.ai>
    Reviewed-by: default avatarOded Gabbay <ogabbay@kernel.org>
    Signed-off-by: default avatarOded Gabbay <ogabbay@kernel.org>
    3beaf903
command_submission.c 78 KB