On Wed, 2016-05-04 at 13:27 -0400, Waiman Long wrote:
On 05/03/2016 08:21 PM, Davidlohr Bueso wrote:It would be good to provide and use a rwsem_is_reader_owned() function
On Wed, 27 Apr 2016, Waiman Long wrote:
static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
@@ -378,7 +367,8 @@ static bool rwsem_optimistic_spin(struct
rw_semaphore *sem)
while (true) {
owner = READ_ONCE(sem->owner);
- if (owner&& !rwsem_spin_on_owner(sem, owner))
+ if (rwsem_is_writer_owned(owner)&&
+ !rwsem_spin_on_owner(sem, owner))
break;
/* wait_lock will be acquired if write_lock is obtained */
@@ -391,9 +381,11 @@ static bool rwsem_optimistic_spin(struct
rw_semaphore *sem)
* When there's no owner, we might have preempted between the
* owner acquiring the lock and setting the owner field. If
* we're an RT task that will live-lock because we won't let
- * the owner complete.
+ * the owner complete. We also quit if the lock is owned by
+ * readers.
*/
- if (!owner&& (need_resched() || rt_task(current)))
+ if ((owner == RWSEM_READER_OWNED) ||
like we do with rwsem_is_writer_owned(), especially if we're going to
add in the additional cast.