mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	NFS: Fix direct WRITE throughput regression
I measured a 50% throughput regression for large direct writes.
The observed on-the-wire behavior is that the client sends every
NFS WRITE twice: once as an UNSTABLE WRITE plus a COMMIT, and once
as a FILE_SYNC WRITE.
This is because the nfs_write_match_verf() check in
nfs_direct_commit_complete() fails for every WRITE.
Buffered writes use nfs_write_completion(), which sets req->wb_verf
correctly. Direct writes use nfs_direct_write_completion(), which
does not set req->wb_verf at all. This leaves req->wb_verf set to
all zeroes for every direct WRITE, and thus
nfs_direct_commit_completion() always sets NFS_ODIRECT_RESCHED_WRITES.
This fix appears to restore nearly all of the lost performance.
Fixes: 1f28476dcb ("NFS: Fix O_DIRECT commit verifier handling")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
			
			
This commit is contained in:
		
							parent
							
								
									94afd9c489
								
							
						
					
					
						commit
						ba838a75e7
					
				
					 1 changed files with 2 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -731,6 +731,8 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr)
 | 
			
		|||
		nfs_list_remove_request(req);
 | 
			
		||||
		if (request_commit) {
 | 
			
		||||
			kref_get(&req->wb_kref);
 | 
			
		||||
			memcpy(&req->wb_verf, &hdr->verf.verifier,
 | 
			
		||||
			       sizeof(req->wb_verf));
 | 
			
		||||
			nfs_mark_request_commit(req, hdr->lseg, &cinfo,
 | 
			
		||||
				hdr->ds_commit_idx);
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue