cifs: convert cifs_tcp_ses_lock from a rwlock to a spinlock
cifs_tcp_ses_lock is a rwlock with protects the cifs_tcp_ses_list, server->smb_ses_list and the ses->tcon_list. It also protects a few ref counters in server, ses and tcon. In most cases the critical section doesn't seem to be large, in a few cases where it is slightly large, there seem to be really no benefit from concurrent access. I briefly considered RCU mechanism but it appears to me that there is no real need. Replace it with a spinlock and get rid of the last rwlock in the cifs code. Signed-off-by: Suresh Jayaraman <sjayaraman@suse.de> Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:

committed by
Steve French

parent
3e24e13287
commit
3f9bcca782
@@ -347,7 +347,7 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ ,
|
||||
if (current_fsuid() != treeCon->ses->linux_uid) {
|
||||
cFYI(1, "Multiuser mode and UID "
|
||||
"did not match tcon uid");
|
||||
read_lock(&cifs_tcp_ses_lock);
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
list_for_each(temp_item, &treeCon->ses->server->smb_ses_list) {
|
||||
ses = list_entry(temp_item, struct cifsSesInfo, smb_ses_list);
|
||||
if (ses->linux_uid == current_fsuid()) {
|
||||
@@ -361,7 +361,7 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ ,
|
||||
}
|
||||
}
|
||||
}
|
||||
read_unlock(&cifs_tcp_ses_lock);
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -551,7 +551,7 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
|
||||
return false;
|
||||
|
||||
/* look up tcon based on tid & uid */
|
||||
read_lock(&cifs_tcp_ses_lock);
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
list_for_each(tmp, &srv->smb_ses_list) {
|
||||
ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list);
|
||||
list_for_each(tmp1, &ses->tcon_list) {
|
||||
@@ -573,7 +573,7 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
|
||||
*/
|
||||
if (netfile->closePend) {
|
||||
spin_unlock(&cifs_file_list_lock);
|
||||
read_unlock(&cifs_tcp_ses_lock);
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -595,16 +595,16 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
|
||||
netfile->oplock_break_cancelled = false;
|
||||
|
||||
spin_unlock(&cifs_file_list_lock);
|
||||
read_unlock(&cifs_tcp_ses_lock);
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
return true;
|
||||
}
|
||||
spin_unlock(&cifs_file_list_lock);
|
||||
read_unlock(&cifs_tcp_ses_lock);
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
cFYI(1, "No matching file for oplock break");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
read_unlock(&cifs_tcp_ses_lock);
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
cFYI(1, "Can not process oplock break for non-existent connection");
|
||||
return true;
|
||||
}
|
||||
|
Reference in New Issue
Block a user