diff options
author | Juan Gutierrez <jgutierrez@ti.com> | 2011-09-06 02:30:16 -0400 |
---|---|---|
committer | Ohad Ben-Cohen <ohad@wizery.com> | 2011-09-21 12:45:32 -0400 |
commit | 93b465c2e186d96fb90012ba0f9372eb9952e732 (patch) | |
tree | 3781c5443068f2fc79c2bb70c8793075b608d1f0 /Documentation | |
parent | c3c1250e93a7ab1327a9fc49d2a22405672f4204 (diff) |
hwspinlock/core: use a mutex to protect the radix tree
Since we're using non-atomic radix tree allocations, we
should be protecting the tree using a mutex and not a
spinlock.
Non-atomic allocations and process context locking is good enough,
as the tree is manipulated only when locks are registered/
unregistered/requested/freed.
The locks themselves are still protected by spinlocks of course,
and mutexes are not involved in the locking/unlocking paths.
Cc: <stable@kernel.org>
Signed-off-by: Juan Gutierrez <jgutierrez@ti.com>
[ohad@wizery.com: rewrite the commit log, #include mutex.h, add minor
commentary]
[ohad@wizery.com: update register/unregister parts in hwspinlock.txt]
Signed-off-by: Ohad Ben-Cohen <ohad@wizery.com>
Diffstat (limited to 'Documentation')
-rw-r--r-- | Documentation/hwspinlock.txt | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/Documentation/hwspinlock.txt b/Documentation/hwspinlock.txt index bbaa4649b637..9171f9120143 100644 --- a/Documentation/hwspinlock.txt +++ b/Documentation/hwspinlock.txt | |||
@@ -39,23 +39,20 @@ independent, drivers. | |||
39 | in case an unused hwspinlock isn't available. Users of this | 39 | in case an unused hwspinlock isn't available. Users of this |
40 | API will usually want to communicate the lock's id to the remote core | 40 | API will usually want to communicate the lock's id to the remote core |
41 | before it can be used to achieve synchronization. | 41 | before it can be used to achieve synchronization. |
42 | Can be called from an atomic context (this function will not sleep) but | 42 | Should be called from a process context (might sleep). |
43 | not from within interrupt context. | ||
44 | 43 | ||
45 | struct hwspinlock *hwspin_lock_request_specific(unsigned int id); | 44 | struct hwspinlock *hwspin_lock_request_specific(unsigned int id); |
46 | - assign a specific hwspinlock id and return its address, or NULL | 45 | - assign a specific hwspinlock id and return its address, or NULL |
47 | if that hwspinlock is already in use. Usually board code will | 46 | if that hwspinlock is already in use. Usually board code will |
48 | be calling this function in order to reserve specific hwspinlock | 47 | be calling this function in order to reserve specific hwspinlock |
49 | ids for predefined purposes. | 48 | ids for predefined purposes. |
50 | Can be called from an atomic context (this function will not sleep) but | 49 | Should be called from a process context (might sleep). |
51 | not from within interrupt context. | ||
52 | 50 | ||
53 | int hwspin_lock_free(struct hwspinlock *hwlock); | 51 | int hwspin_lock_free(struct hwspinlock *hwlock); |
54 | - free a previously-assigned hwspinlock; returns 0 on success, or an | 52 | - free a previously-assigned hwspinlock; returns 0 on success, or an |
55 | appropriate error code on failure (e.g. -EINVAL if the hwspinlock | 53 | appropriate error code on failure (e.g. -EINVAL if the hwspinlock |
56 | is already free). | 54 | is already free). |
57 | Can be called from an atomic context (this function will not sleep) but | 55 | Should be called from a process context (might sleep). |
58 | not from within interrupt context. | ||
59 | 56 | ||
60 | int hwspin_lock_timeout(struct hwspinlock *hwlock, unsigned int timeout); | 57 | int hwspin_lock_timeout(struct hwspinlock *hwlock, unsigned int timeout); |
61 | - lock a previously-assigned hwspinlock with a timeout limit (specified in | 58 | - lock a previously-assigned hwspinlock with a timeout limit (specified in |
@@ -232,15 +229,14 @@ int hwspinlock_example2(void) | |||
232 | 229 | ||
233 | int hwspin_lock_register(struct hwspinlock *hwlock); | 230 | int hwspin_lock_register(struct hwspinlock *hwlock); |
234 | - to be called from the underlying platform-specific implementation, in | 231 | - to be called from the underlying platform-specific implementation, in |
235 | order to register a new hwspinlock instance. Can be called from an atomic | 232 | order to register a new hwspinlock instance. Should be called from |
236 | context (this function will not sleep) but not from within interrupt | 233 | a process context (this function might sleep). |
237 | context. Returns 0 on success, or appropriate error code on failure. | 234 | Returns 0 on success, or appropriate error code on failure. |
238 | 235 | ||
239 | struct hwspinlock *hwspin_lock_unregister(unsigned int id); | 236 | struct hwspinlock *hwspin_lock_unregister(unsigned int id); |
240 | - to be called from the underlying vendor-specific implementation, in order | 237 | - to be called from the underlying vendor-specific implementation, in order |
241 | to unregister an existing (and unused) hwspinlock instance. | 238 | to unregister an existing (and unused) hwspinlock instance. |
242 | Can be called from an atomic context (will not sleep) but not from | 239 | Should be called from a process context (this function might sleep). |
243 | within interrupt context. | ||
244 | Returns the address of hwspinlock on success, or NULL on error (e.g. | 240 | Returns the address of hwspinlock on success, or NULL on error (e.g. |
245 | if the hwspinlock is sill in use). | 241 | if the hwspinlock is sill in use). |
246 | 242 | ||