* \retval VM_FAULT_ERROR on general error
* \retval NOPAGE_OOM not have memory for allocate new page
*/
-static int ll_fault0(struct vm_area_struct *vma, struct vm_fault *vmf)
+static vm_fault_t ll_fault0(struct vm_area_struct *vma, struct vm_fault *vmf)
{
struct lu_env *env;
struct cl_io *io;
}
#ifdef HAVE_VM_OPS_USE_VM_FAULT_ONLY
-static int ll_fault(struct vm_fault *vmf)
+static vm_fault_t ll_fault(struct vm_fault *vmf)
{
struct vm_area_struct *vma = vmf->vma;
#else
-static int ll_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
+static vm_fault_t ll_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
{
#endif
int count = 0;
bool printed = false;
bool cached;
- int result;
+ vm_fault_t result;
+ ktime_t kstart = ktime_get();
sigset_t set;
- ll_stats_ops_tally(ll_i2sbi(file_inode(vma->vm_file)),
- LPROC_LL_FAULT, 1);
-
result = pcc_fault(vma, vmf, &cached);
if (cached)
- return result;
+ goto out;
/* Only SIGKILL and SIGTERM is allowed for fault/nopage/mkwrite
* so that it can be killed by admin but not cause segfault by
result |= VM_FAULT_LOCKED;
}
cfs_restore_sigs(set);
- return result;
+
+out:
+ if (vmf->page && result == VM_FAULT_LOCKED) {
+ ll_rw_stats_tally(ll_i2sbi(file_inode(vma->vm_file)),
+ current->pid, LUSTRE_FPRIVATE(vma->vm_file),
+ cl_offset(NULL, vmf->page->index), PAGE_SIZE,
+ READ);
+ ll_stats_ops_tally(ll_i2sbi(file_inode(vma->vm_file)),
+ LPROC_LL_FAULT,
+ ktime_us_delta(ktime_get(), kstart));
+ }
+
+ return result;
}
#ifdef HAVE_VM_OPS_USE_VM_FAULT_ONLY
-static int ll_page_mkwrite(struct vm_fault *vmf)
+static vm_fault_t ll_page_mkwrite(struct vm_fault *vmf)
{
struct vm_area_struct *vma = vmf->vma;
#else
-static int ll_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
+static vm_fault_t ll_page_mkwrite(struct vm_area_struct *vma,
+ struct vm_fault *vmf)
{
#endif
int count = 0;
bool printed = false;
bool retry;
bool cached;
- int result;
-
- ll_stats_ops_tally(ll_i2sbi(file_inode(vma->vm_file)),
- LPROC_LL_MKWRITE, 1);
+ ktime_t kstart = ktime_get();
+ vm_fault_t result;
result = pcc_page_mkwrite(vma, vmf, &cached);
if (cached)
- return result;
+ goto out;
file_update_time(vma->vm_file);
- do {
- retry = false;
- result = ll_page_mkwrite0(vma, vmf->page, &retry);
+ do {
+ retry = false;
+ result = ll_page_mkwrite0(vma, vmf->page, &retry);
- if (!printed && ++count > 16) {
+ if (!printed && ++count > 16) {
const struct dentry *de = file_dentry(vma->vm_file);
CWARN("app(%s): the page %lu of file "DFID" is under"
break;
}
- return result;
+out:
+ if (result == VM_FAULT_LOCKED) {
+ ll_rw_stats_tally(ll_i2sbi(file_inode(vma->vm_file)),
+ current->pid, LUSTRE_FPRIVATE(vma->vm_file),
+ cl_offset(NULL, vmf->page->index), PAGE_SIZE,
+ WRITE);
+ ll_stats_ops_tally(ll_i2sbi(file_inode(vma->vm_file)),
+ LPROC_LL_MKWRITE,
+ ktime_us_delta(ktime_get(), kstart));
+ }
+
+ return result;
}
/**
int ll_file_mmap(struct file *file, struct vm_area_struct * vma)
{
struct inode *inode = file_inode(file);
+ ktime_t kstart = ktime_get();
bool cached;
- int rc;
+ int rc;
- ENTRY;
+ ENTRY;
- if (ll_file_nolock(file))
- RETURN(-EOPNOTSUPP);
+ if (ll_file_nolock(file))
+ RETURN(-EOPNOTSUPP);
rc = pcc_file_mmap(file, vma, &cached);
if (cached && rc != 0)
RETURN(rc);
- ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_MAP, 1);
- rc = generic_file_mmap(file, vma);
- if (rc == 0) {
+ rc = generic_file_mmap(file, vma);
+ if (rc == 0) {
vma->vm_ops = &ll_file_vm_ops;
- vma->vm_ops->open(vma);
- /* update the inode's size and mtime */
+ vma->vm_ops->open(vma);
+ /* update the inode's size and mtime */
if (!cached)
rc = ll_glimpse_size(inode);
- }
+ }
- RETURN(rc);
+ if (!rc)
+ ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_MMAP,
+ ktime_us_delta(ktime_get(), kstart));
+
+ RETURN(rc);
}