]> git.proxmox.com Git - mirror_spl.git/commitdiff
Don't take spin lock on rwlock owner
authorChunwei Chen <tuxoko@gmail.com>
Tue, 1 Sep 2015 13:55:06 +0000 (21:55 +0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 2 Oct 2015 18:20:55 +0000 (11:20 -0700)
The spin lock around rw_owner is completely unnecessary. The reason is that it
is only modified in the down_write context. If you race against another thread
modifying it, that means that you aren't holding the rwlock, so taking the
spin lock don't eliminate the race.

Also, we only check rw_owner in RW_WRITE_HELD because spl_rwsem_is_locked
is unnecessary and might need to take spin lock.

Signed-off-by: Chunwei Chen <tuxoko@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #473

include/sys/rwlock.h

index 7064e8f1f2018a162ceae6097bf7b80a49948fdd..62544f3a814f3f2f4dbe48b0eb7f71a656535490 100644 (file)
@@ -50,34 +50,19 @@ typedef struct {
 static inline void
 spl_rw_set_owner(krwlock_t *rwp)
 {
-        unsigned long flags;
-
-        spl_rwsem_lock_irqsave(&SEM(rwp)->wait_lock, flags);
-        rwp->rw_owner = current;
-        spl_rwsem_unlock_irqrestore(&SEM(rwp)->wait_lock, flags);
+       rwp->rw_owner = current;
 }
 
 static inline void
 spl_rw_clear_owner(krwlock_t *rwp)
 {
-        unsigned long flags;
-
-        spl_rwsem_lock_irqsave(&SEM(rwp)->wait_lock, flags);
-        rwp->rw_owner = NULL;
-        spl_rwsem_unlock_irqrestore(&SEM(rwp)->wait_lock, flags);
+       rwp->rw_owner = NULL;
 }
 
 static inline kthread_t *
 rw_owner(krwlock_t *rwp)
 {
-        unsigned long flags;
-        kthread_t *owner;
-
-        spl_rwsem_lock_irqsave(&SEM(rwp)->wait_lock, flags);
-        owner = rwp->rw_owner;
-        spl_rwsem_unlock_irqrestore(&SEM(rwp)->wait_lock, flags);
-
-        return owner;
+       return rwp->rw_owner;
 }
 
 static inline int
@@ -89,7 +74,7 @@ RW_READ_HELD(krwlock_t *rwp)
 static inline int
 RW_WRITE_HELD(krwlock_t *rwp)
 {
-       return (spl_rwsem_is_locked(SEM(rwp)) && rw_owner(rwp) == current);
+       return (rw_owner(rwp) == current);
 }
 
 static inline int