]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
NFSv4: Convert open state lookup to use RCU
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 2 Sep 2018 23:15:15 +0000 (19:15 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 30 Sep 2018 19:35:17 +0000 (15:35 -0400)
Further reduce contention on the inode->i_lock.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/nfs4_fs.h
fs/nfs/nfs4state.c

index 3a6904173214c6ce4399de30f007d479b7983174..1b4737f4cac4cd51e6edd9d998655329c5f1731a 100644 (file)
@@ -191,6 +191,7 @@ struct nfs4_state {
        atomic_t count;
 
        wait_queue_head_t waitq;
+       struct rcu_head rcu_head;
 };
 
 
index be92ce4259e9d15836b93275d4d1e74e197a5aed..7feac365038c01862b18dfff899902c5c3c13be0 100644 (file)
@@ -684,7 +684,7 @@ __nfs4_find_state_byowner(struct inode *inode, struct nfs4_state_owner *owner)
        struct nfs_inode *nfsi = NFS_I(inode);
        struct nfs4_state *state;
 
-       list_for_each_entry(state, &nfsi->open_states, inode_states) {
+       list_for_each_entry_rcu(state, &nfsi->open_states, inode_states) {
                if (state->owner != owner)
                        continue;
                if (!nfs4_valid_open_stateid(state))
@@ -698,7 +698,7 @@ __nfs4_find_state_byowner(struct inode *inode, struct nfs4_state_owner *owner)
 static void
 nfs4_free_open_state(struct nfs4_state *state)
 {
-       kfree(state);
+       kfree_rcu(state, rcu_head);
 }
 
 struct nfs4_state *
@@ -707,9 +707,9 @@ nfs4_get_open_state(struct inode *inode, struct nfs4_state_owner *owner)
        struct nfs4_state *state, *new;
        struct nfs_inode *nfsi = NFS_I(inode);
 
-       spin_lock(&inode->i_lock);
+       rcu_read_lock();
        state = __nfs4_find_state_byowner(inode, owner);
-       spin_unlock(&inode->i_lock);
+       rcu_read_unlock();
        if (state)
                goto out;
        new = nfs4_alloc_open_state();
@@ -720,7 +720,7 @@ nfs4_get_open_state(struct inode *inode, struct nfs4_state_owner *owner)
                state = new;
                state->owner = owner;
                atomic_inc(&owner->so_count);
-               list_add(&state->inode_states, &nfsi->open_states);
+               list_add_rcu(&state->inode_states, &nfsi->open_states);
                ihold(inode);
                state->inode = inode;
                spin_unlock(&inode->i_lock);
@@ -746,7 +746,7 @@ void nfs4_put_open_state(struct nfs4_state *state)
        if (!atomic_dec_and_lock(&state->count, &owner->so_lock))
                return;
        spin_lock(&inode->i_lock);
-       list_del(&state->inode_states);
+       list_del_rcu(&state->inode_states);
        list_del(&state->open_states);
        spin_unlock(&inode->i_lock);
        spin_unlock(&owner->so_lock);