Message ID | 20220302082718.32268-3-songmuchun@bytedance.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Fix some bugs related to ramp and dax | expand |
On Wed, Mar 2, 2022 at 12:29 AM Muchun Song <songmuchun@bytedance.com> wrote: > > 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 needs to clarify that 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: d92576f1167c dax: does not work correctly with virtual aliasing caches Otherwise, you can add: Reviewed-by: Dan Williams <dan.j.williams@intel.com>
On Thu, Mar 10, 2022 at 8:06 AM Dan Williams <dan.j.williams@intel.com> wrote: > > On Wed, Mar 2, 2022 at 12:29 AM Muchun Song <songmuchun@bytedance.com> wrote: > > > > 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 needs to clarify that 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: Right. I'll add this into the commit log. > > d92576f1167c dax: does not work correctly with virtual aliasing caches > > Otherwise, you can add: > > Reviewed-by: Dan Williams <dan.j.williams@intel.com> Thanks.
diff --git a/fs/dax.c b/fs/dax.c index 67a08a32fccb..a372304c9695 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -845,7 +845,8 @@ static void dax_entry_mkclean(struct address_space *mapping, pgoff_t index, 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);
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. Fixes: f729c8c9b24f ("dax: wrprotect pmd_t in dax_mapping_entry_mkclean") Signed-off-by: Muchun Song <songmuchun@bytedance.com> --- fs/dax.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)