| From: Muchun Song <songmuchun@bytedance.com> |
| Subject: dax: fix cache flush on PMD-mapped pages |
| |
| The flush_cache_page() only remove a PAGE_SIZE sized range from the cache. |
| However, it does not cover the full pages in a THP except a head page. |
| Replace it with flush_cache_range() to fix this issue. This is just a |
| documentation issue with the respect to properly documenting the expected |
| usage of cache flushing before modifying the pmd. However, in practice |
| this is not a problem due to the fact that DAX is not available on |
| architectures with virtually indexed caches per: |
| |
| commit d92576f1167c ("dax: does not work correctly with virtual aliasing caches") |
| |
| Link: https://lkml.kernel.org/r/20220403053957.10770-3-songmuchun@bytedance.com |
| Fixes: f729c8c9b24f ("dax: wrprotect pmd_t in dax_mapping_entry_mkclean") |
| Signed-off-by: Muchun Song <songmuchun@bytedance.com> |
| Reviewed-by: Dan Williams <dan.j.williams@intel.com> |
| Reviewed-by: Christoph Hellwig <hch@lst.de> |
| Cc: Alistair Popple <apopple@nvidia.com> |
| Cc: Al Viro <viro@zeniv.linux.org.uk> |
| Cc: Hugh Dickins <hughd@google.com> |
| Cc: Jan Kara <jack@suse.cz> |
| Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> |
| Cc: Matthew Wilcox <willy@infradead.org> |
| Cc: Ralph Campbell <rcampbell@nvidia.com> |
| Cc: Ross Zwisler <zwisler@kernel.org> |
| Cc: Xiongchun Duan <duanxiongchun@bytedance.com> |
| Cc: Xiyu Yang <xiyuyang19@fudan.edu.cn> |
| Cc: Yang Shi <shy828301@gmail.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| fs/dax.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/fs/dax.c~dax-fix-cache-flush-on-pmd-mapped-pages |
| +++ a/fs/dax.c |
| @@ -845,7 +845,8 @@ static void dax_entry_mkclean(struct add |
| if (!pmd_dirty(*pmdp) && !pmd_write(*pmdp)) |
| goto unlock_pmd; |
| |
| - flush_cache_page(vma, address, pfn); |
| + flush_cache_range(vma, address, |
| + address + HPAGE_PMD_SIZE); |
| pmd = pmdp_invalidate(vma, address, pmdp); |
| pmd = pmd_wrprotect(pmd); |
| pmd = pmd_mkclean(pmd); |
| _ |