Changeset 20282ef3 in mainline for kernel/generic/src/ipc/sysipc.c


Ignore:
Timestamp:
2012-08-26T13:36:41Z (13 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
53af6e8c
Parents:
b1e6269
Message:

When answer_preprocess() wins the race for a call, let it also dequeue
the call from the sender's active list so that we have a real atomic
either-answered-or-forgotten behavior.

This change avoids the possibility that the race is won in
answer_preprocess(), but lost later in _ipc_answer_free_call(), which
would have the effect of skipping some of the necessary call_t cleanup.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/ipc/sysipc.c

    rb1e6269 r20282ef3  
    175175                return rc;
    176176        } else {
     177                ASSERT(answer->active);
     178
     179                /*
     180                 * Mark the call as inactive to prevent _ipc_answer_free_call()
     181                 * from attempting to remove the call from the active list
     182                 * itself.
     183                 */
     184                answer->active = false;
     185
     186                /*
     187                 * Remove the call from the sender's active call list.
     188                 * We enforce this locking order so that any potential
     189                 * concurrently executing forget operation is forced to
     190                 * release its active_calls_lock and lose the race to
     191                 * forget this soon to be answered call.
     192                 */
     193                spinlock_lock(&answer->sender->active_calls_lock);
     194                list_remove(&answer->ta_link);
     195                spinlock_unlock(&answer->sender->active_calls_lock);
     196
    177197                /*
    178198                 * Hold the sender task so that it cannot suddenly disappear
Note: See TracChangeset for help on using the changeset viewer.