summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJérôme Glisse <jglisse@redhat.com>2019-05-13 20:21:00 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-05-14 12:47:49 -0400
commitc6d23413f81bd69935afedaf1da9d55b03febf58 (patch)
tree3afcc9ecb72d326b393aca737425cd5f71017b90
parentbf198b2b34bfd4bc9bd6abb33bf650b74329a2ac (diff)
mm/mmu_notifier: mmu_notifier_range_update_to_read_only() helper
Helper to test if a range is updated to read only (it is still valid to read from the range). This is useful for device driver or anyone who wish to optimize out update when they know that they already have the range map read only. Link: http://lkml.kernel.org/r/20190326164747.24405-9-jglisse@redhat.com Signed-off-by: Jérôme Glisse <jglisse@redhat.com> Reviewed-by: Ralph Campbell <rcampbell@nvidia.com> Reviewed-by: Ira Weiny <ira.weiny@intel.com> Cc: Christian König <christian.koenig@amd.com> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Jani Nikula <jani.nikula@linux.intel.com> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Cc: Jan Kara <jack@suse.cz> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Peter Xu <peterx@redhat.com> Cc: Felix Kuehling <Felix.Kuehling@amd.com> Cc: Jason Gunthorpe <jgg@mellanox.com> Cc: Ross Zwisler <zwisler@kernel.org> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Radim Krcmar <rkrcmar@redhat.com> Cc: Michal Hocko <mhocko@kernel.org> Cc: Christian Koenig <christian.koenig@amd.com> Cc: John Hubbard <jhubbard@nvidia.com> Cc: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/linux/mmu_notifier.h4
-rw-r--r--mm/mmu_notifier.c10
2 files changed, 14 insertions, 0 deletions
diff --git a/include/linux/mmu_notifier.h b/include/linux/mmu_notifier.h
index 0379956fff23..b6c004bd9f6a 100644
--- a/include/linux/mmu_notifier.h
+++ b/include/linux/mmu_notifier.h
@@ -259,6 +259,8 @@ extern void __mmu_notifier_invalidate_range_end(struct mmu_notifier_range *r,
259 bool only_end); 259 bool only_end);
260extern void __mmu_notifier_invalidate_range(struct mm_struct *mm, 260extern void __mmu_notifier_invalidate_range(struct mm_struct *mm,
261 unsigned long start, unsigned long end); 261 unsigned long start, unsigned long end);
262extern bool
263mmu_notifier_range_update_to_read_only(const struct mmu_notifier_range *range);
262 264
263static inline bool 265static inline bool
264mmu_notifier_range_blockable(const struct mmu_notifier_range *range) 266mmu_notifier_range_blockable(const struct mmu_notifier_range *range)
@@ -568,6 +570,8 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct *mm)
568{ 570{
569} 571}
570 572
573#define mmu_notifier_range_update_to_read_only(r) false
574
571#define ptep_clear_flush_young_notify ptep_clear_flush_young 575#define ptep_clear_flush_young_notify ptep_clear_flush_young
572#define pmdp_clear_flush_young_notify pmdp_clear_flush_young 576#define pmdp_clear_flush_young_notify pmdp_clear_flush_young
573#define ptep_clear_young_notify ptep_test_and_clear_young 577#define ptep_clear_young_notify ptep_test_and_clear_young
diff --git a/mm/mmu_notifier.c b/mm/mmu_notifier.c
index abd88c466eb2..ee36068077b6 100644
--- a/mm/mmu_notifier.c
+++ b/mm/mmu_notifier.c
@@ -395,3 +395,13 @@ void mmu_notifier_unregister_no_release(struct mmu_notifier *mn,
395 mmdrop(mm); 395 mmdrop(mm);
396} 396}
397EXPORT_SYMBOL_GPL(mmu_notifier_unregister_no_release); 397EXPORT_SYMBOL_GPL(mmu_notifier_unregister_no_release);
398
399bool
400mmu_notifier_range_update_to_read_only(const struct mmu_notifier_range *range)
401{
402 if (!range->vma || range->event != MMU_NOTIFY_PROTECTION_VMA)
403 return false;
404 /* Return true if the vma still have the read flag set. */
405 return range->vma->vm_flags & VM_READ;
406}
407EXPORT_SYMBOL_GPL(mmu_notifier_range_update_to_read_only);