GFS2: Improve cluster mmap scalability
The mmap system call grabs a glock when an update to atime maybe required. It does this in order to ensure that the flags on the inode are uptodate, but since it will only mark atime for a future update, an exclusive lock is not required here (one will be taken later when the actual update is performed). Also, the lock can be skipped when the mount is marked noatime in addition to the original check which only looked at the noatime flag for the inode itself. This should increase the scalability of the mmap call when multiple nodes are all mmaping the same file. Reported-by: Scooter Morris <scooter@cgl.ucsf.edu> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
This commit is contained in:
Родитель
edae38a643
Коммит
b9c93bb7de
|
@ -448,15 +448,20 @@ static int gfs2_mmap(struct file *file, struct vm_area_struct *vma)
|
|||
{
|
||||
struct gfs2_inode *ip = GFS2_I(file->f_mapping->host);
|
||||
|
||||
if (!(file->f_flags & O_NOATIME)) {
|
||||
if (!(file->f_flags & O_NOATIME) &&
|
||||
!IS_NOATIME(&ip->i_inode)) {
|
||||
struct gfs2_holder i_gh;
|
||||
int error;
|
||||
|
||||
gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &i_gh);
|
||||
gfs2_holder_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh);
|
||||
error = gfs2_glock_nq(&i_gh);
|
||||
file_accessed(file);
|
||||
if (error == 0)
|
||||
gfs2_glock_dq_uninit(&i_gh);
|
||||
if (error == 0) {
|
||||
file_accessed(file);
|
||||
gfs2_glock_dq(&i_gh);
|
||||
}
|
||||
gfs2_holder_uninit(&i_gh);
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
vma->vm_ops = &gfs2_vm_ops;
|
||||
vma->vm_flags |= VM_CAN_NONLINEAR;
|
||||
|
|
Загрузка…
Ссылка в новой задаче