Message ID | 20221222061341.381903-2-yuanchu@google.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [1/2] mm: add vma_has_locality() | expand |
On Wed, Dec 21, 2022 at 11:13 PM Yuanchu Xie <yuanchu@google.com> wrote: Thanks for following up on this. > POSIX_FADV_NOREUSE allows an application to specify that accesses to > file data does not follow LRU and is used only once. Since 2.6.18 this > is a no-op. We add FMODE_NOREUSE, checked in vma_has_locality to prevent > LRU activation. This needs to include what you plan to write on the man page. A few questions to answer: 1. Does this flag work with accesses via FDs? 2. If there is a random or sequential file VMA, should the user choose this flag or the VMA flag or both? Consider a) how those flags affect readahead; b) their scopes, i.e., per VMA or per file. Please also follow up with Jens to add this flag to fio. Micheal reported that SVT-AV1 regressed with MGLRU, which is the only real one [1]. The following not only fixes the regression but also improves the baseline. Please follow up on that as well. --- a/Source/App/EncApp/EbAppMain.c +++ b/Source/App/EncApp/EbAppMain.c @@ -115,6 +115,7 @@ void init_memory_file_map(EbConfig* config) { fseeko(config->input_file, curr_loc, SEEK_SET); // seek back to that location #ifndef _WIN32 config->mmap.fd = fileno(config->input_file); + posix_fadvise(config->mmap.fd, 0, 0, POSIX_FADV_NOREUSE); #endif } config->mmap.file_frame_it = 0; [1] https://openbenchmarking.org/result/2209259-PTS-MGLRU8GB57
diff --git a/include/linux/fs.h b/include/linux/fs.h index 066555ad1bf8..5660ed0edf1a 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -166,6 +166,8 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, /* File supports DIRECT IO */ #define FMODE_CAN_ODIRECT ((__force fmode_t)0x400000) +#define FMODE_NOREUSE ((__force fmode_t)0x800000) + /* File was opened by fanotify and shouldn't generate fanotify events */ #define FMODE_NONOTIFY ((__force fmode_t)0x4000000) diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h index 80c0f6901ead..024f834d952d 100644 --- a/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h @@ -583,6 +583,9 @@ static inline bool vma_has_locality(struct vm_area_struct *vma) if (vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ)) return false; + if (vma->vm_file && (vma->vm_file->f_mode & FMODE_NOREUSE)) + return false; + return true; } diff --git a/mm/fadvise.c b/mm/fadvise.c index bf04fec87f35..fb7c5f43fd2a 100644 --- a/mm/fadvise.c +++ b/mm/fadvise.c @@ -80,7 +80,7 @@ int generic_fadvise(struct file *file, loff_t offset, loff_t len, int advice) case POSIX_FADV_NORMAL: file->f_ra.ra_pages = bdi->ra_pages; spin_lock(&file->f_lock); - file->f_mode &= ~FMODE_RANDOM; + file->f_mode &= ~(FMODE_RANDOM | FMODE_NOREUSE); spin_unlock(&file->f_lock); break; case POSIX_FADV_RANDOM: @@ -107,6 +107,9 @@ int generic_fadvise(struct file *file, loff_t offset, loff_t len, int advice) force_page_cache_readahead(mapping, file, start_index, nrpages); break; case POSIX_FADV_NOREUSE: + spin_lock(&file->f_lock); + file->f_mode |= FMODE_NOREUSE; + spin_unlock(&file->f_lock); break; case POSIX_FADV_DONTNEED: __filemap_fdatawrite_range(mapping, offset, endbyte,