[AF_UNIX]: Convert to use a spinlock instead of rwlock
authorBenjamin LaHaise <bcrl@kvack.org>
Tue, 3 Jan 2006 22:10:46 +0000 (14:10 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 3 Jan 2006 22:10:46 +0000 (14:10 -0800)
From: Benjamin LaHaise <bcrl@kvack.org>

In af_unix, a rwlock is used to protect internal state.  At least on my
P4 with HT it is faster to use a spinlock due to the simpler memory
barrier used to unlock.  This patch raises bw_unix to ~690K/s.

Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/af_unix.h
net/unix/af_unix.c

index 3f302ae..bfc1779 100644 (file)
@@ -58,10 +58,10 @@ struct unix_skb_parms {
 #define UNIXCB(skb)    (*(struct unix_skb_parms*)&((skb)->cb))
 #define UNIXCREDS(skb) (&UNIXCB((skb)).creds)
 
-#define unix_state_rlock(s)    read_lock(&unix_sk(s)->lock)
-#define unix_state_runlock(s)  read_unlock(&unix_sk(s)->lock)
-#define unix_state_wlock(s)    write_lock(&unix_sk(s)->lock)
-#define unix_state_wunlock(s)  write_unlock(&unix_sk(s)->lock)
+#define unix_state_rlock(s)    spin_lock(&unix_sk(s)->lock)
+#define unix_state_runlock(s)  spin_unlock(&unix_sk(s)->lock)
+#define unix_state_wlock(s)    spin_lock(&unix_sk(s)->lock)
+#define unix_state_wunlock(s)  spin_unlock(&unix_sk(s)->lock)
 
 #ifdef __KERNEL__
 /* The AF_UNIX socket */
@@ -76,7 +76,7 @@ struct unix_sock {
         struct sock            *other;
         struct sock            *gc_tree;
         atomic_t                inflight;
-        rwlock_t                lock;
+        spinlock_t             lock;
         wait_queue_head_t       peer_wait;
 };
 #define unix_sk(__sk) ((struct unix_sock *)__sk)
index 7d3fe6a..1ddd36d 100644 (file)
@@ -564,7 +564,7 @@ static struct sock * unix_create1(struct socket *sock)
        u         = unix_sk(sk);
        u->dentry = NULL;
        u->mnt    = NULL;
-       rwlock_init(&u->lock);
+       spin_lock_init(&u->lock);
        atomic_set(&u->inflight, sock ? 0 : -1);
        init_MUTEX(&u->readsem); /* single task reading lock */
        init_waitqueue_head(&u->peer_wait);