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.

                -ben

diff --git a/include/net/af_unix.h b/include/net/af_unix.h
index 3f302ae..677081b 100644
--- a/include/net/af_unix.h
+++ b/include/net/af_unix.h
@@ -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 */
@@ -71,12 +71,12 @@ struct unix_sock {
         struct unix_address     *addr;
         struct dentry          *dentry;
         struct vfsmount                *mnt;
         struct semaphore        readsem;
         struct sock            *peer;
         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)
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index 04e850e..0ffd705 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -564,9 +564,9 @@ static struct sock * unix_create1(struct
        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);
        unix_insert_socket(unix_sockets_unbound, sk);
 out:
-- 
"You know, I've seen some crystals do some pretty trippy shit, man."
Don't Email: <[EMAIL PROTECTED]>.
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to