Merge "T589: Fix insufficient ordering guarantees in bakery lock" into integration

This commit is contained in:
Soby Mathew 2020-01-29 15:35:23 +00:00 committed by TrustedFirmware Code Review
commit 458dde3c44
2 changed files with 20 additions and 12 deletions

View File

@ -137,10 +137,11 @@ void bakery_lock_get(bakery_lock_t *bakery)
}
/*
* Lock acquired. Ensure that any reads from a shared resource in the
* critical section read values after the lock is acquired.
* Lock acquired. Ensure that any reads and writes from a shared
* resource in the critical section read/write values after the lock is
* acquired.
*/
dmbld();
dmbish();
}
@ -154,11 +155,14 @@ void bakery_lock_release(bakery_lock_t *bakery)
/*
* Ensure that other observers see any stores in the critical section
* before releasing the lock. Release the lock by resetting ticket.
* Then signal other waiting contenders.
* before releasing the lock. Also ensure all loads in the critical
* section are complete before releasing the lock. Release the lock by
* resetting ticket. Then signal other waiting contenders.
*/
dmbst();
dmbish();
bakery->lock_data[me] = 0U;
/* Required to ensure ordering of the following sev */
dsb();
sev();
}

View File

@ -219,10 +219,11 @@ void bakery_lock_get(bakery_lock_t *lock)
}
/*
* Lock acquired. Ensure that any reads from a shared resource in the
* critical section read values after the lock is acquired.
* Lock acquired. Ensure that any reads and writes from a shared
* resource in the critical section read/write values after the lock is
* acquired.
*/
dmbld();
dmbish();
}
void bakery_lock_release(bakery_lock_t *lock)
@ -240,11 +241,14 @@ void bakery_lock_release(bakery_lock_t *lock)
/*
* Ensure that other observers see any stores in the critical section
* before releasing the lock. Release the lock by resetting ticket.
* Then signal other waiting contenders.
* before releasing the lock. Also ensure all loads in the critical
* section are complete before releasing the lock. Release the lock by
* resetting ticket. Then signal other waiting contenders.
*/
dmbst();
dmbish();
my_bakery_info->lock_data = 0U;
write_cache_op((uintptr_t)my_bakery_info, is_cached);
/* This sev is ordered by the dsbish in write_cahce_op */
sev();
}