]> git.proxmox.com Git - mirror_spl.git/commitdiff
rwsem use kernel provided owner when possible
authorChunwei Chen <tuxoko@gmail.com>
Tue, 1 Sep 2015 15:28:02 +0000 (23:28 +0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 2 Oct 2015 18:21:32 +0000 (11:21 -0700)
If CONFIG_RWSEM_SPIN_ON_OWNER is defined, rw_semaphore will have an owner
field, so we don't need our own.

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

include/sys/rwlock.h

index 62544f3a814f3f2f4dbe48b0eb7f71a656535490..a3350b138c371974965816a6445d9c2bb53d95fe 100644 (file)
@@ -40,29 +40,47 @@ typedef enum {
         RW_READER = 2
 } krw_t;
 
+/*
+ * If CONFIG_RWSEM_SPIN_ON_OWNER is defined, rw_semaphore will have an owner
+ * field, so we don't need our own.
+ */
 typedef struct {
         struct rw_semaphore rw_rwlock;
+#ifndef CONFIG_RWSEM_SPIN_ON_OWNER
         kthread_t *rw_owner;
+#endif
 } krwlock_t;
 
-#define SEM(rwp)                        ((struct rw_semaphore *)(rwp))
+#define SEM(rwp)       (&(rwp)->rw_rwlock)
 
 static inline void
 spl_rw_set_owner(krwlock_t *rwp)
 {
+/*
+ * If CONFIG_RWSEM_SPIN_ON_OWNER is defined, down_write, up_write,
+ * downgrade_write and __init_rwsem will set/clear owner for us.
+ */
+#ifndef CONFIG_RWSEM_SPIN_ON_OWNER
        rwp->rw_owner = current;
+#endif
 }
 
 static inline void
 spl_rw_clear_owner(krwlock_t *rwp)
 {
+#ifndef CONFIG_RWSEM_SPIN_ON_OWNER
        rwp->rw_owner = NULL;
+#endif
 }
 
 static inline kthread_t *
 rw_owner(krwlock_t *rwp)
 {
+#ifdef CONFIG_RWSEM_SPIN_ON_OWNER
+       return SEM(rwp)->owner;
+#else
        return rwp->rw_owner;
+#endif
 }
 
 static inline int
@@ -153,6 +171,9 @@ RW_LOCK_HELD(krwlock_t *rwp)
 })
 
 #if defined(CONFIG_RWSEM_GENERIC_SPINLOCK)
+#ifdef CONFIG_RWSEM_SPIN_ON_OWNER
+#error spinlock rwsem should not have spin on owner
+#endif
 /*
  * For the generic implementations of rw-semaphores the following is
  * true.  If your semaphore implementation internally represents the