Commit 458dde3c authored by Soby Mathew's avatar Soby Mathew Committed by TrustedFirmware Code Review
Browse files

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

parents 8efec9e0 c0018913
......@@ -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();
}
......@@ -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();
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment