]> www.infradead.org Git - users/hch/block.git/commitdiff
mmu_notifier: remove the .change_pte() callback
authorPaolo Bonzini <pbonzini@redhat.com>
Fri, 5 Apr 2024 11:58:14 +0000 (07:58 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 11 Apr 2024 17:18:36 +0000 (13:18 -0400)
The scope of set_pte_at_notify() has reduced more and more through the
years.  Initially, it was meant for when the change to the PTE was
not bracketed by mmu_notifier_invalidate_range_{start,end}().  However,
that has not been so for over ten years.  During all this period
the only implementation of .change_pte() was KVM and it
had no actual functionality, because it was called after
mmu_notifier_invalidate_range_start() zapped the secondary PTE.

Now that this (nonfunctional) user of the .change_pte() callback is
gone, the whole callback can be removed.  For now, leave in place
set_pte_at_notify() even though it is just a synonym for set_pte_at().

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Message-ID: <20240405115815.3226315-4-pbonzini@redhat.com>
Acked-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
include/linux/mmu_notifier.h
mm/mmu_notifier.c

index f349e08a9dfe1a51e3b901ec9eb78f889eed52f9..8c72bf651606d32bf0876dbd0a56977f542e939a 100644 (file)
@@ -122,15 +122,6 @@ struct mmu_notifier_ops {
                          struct mm_struct *mm,
                          unsigned long address);
 
-       /*
-        * change_pte is called in cases that pte mapping to page is changed:
-        * for example, when ksm remaps pte to point to a new shared page.
-        */
-       void (*change_pte)(struct mmu_notifier *subscription,
-                          struct mm_struct *mm,
-                          unsigned long address,
-                          pte_t pte);
-
        /*
         * invalidate_range_start() and invalidate_range_end() must be
         * paired and are called only when the mmap_lock and/or the
@@ -392,8 +383,6 @@ extern int __mmu_notifier_clear_young(struct mm_struct *mm,
                                      unsigned long end);
 extern int __mmu_notifier_test_young(struct mm_struct *mm,
                                     unsigned long address);
-extern void __mmu_notifier_change_pte(struct mm_struct *mm,
-                                     unsigned long address, pte_t pte);
 extern int __mmu_notifier_invalidate_range_start(struct mmu_notifier_range *r);
 extern void __mmu_notifier_invalidate_range_end(struct mmu_notifier_range *r);
 extern void __mmu_notifier_arch_invalidate_secondary_tlbs(struct mm_struct *mm,
@@ -439,13 +428,6 @@ static inline int mmu_notifier_test_young(struct mm_struct *mm,
        return 0;
 }
 
-static inline void mmu_notifier_change_pte(struct mm_struct *mm,
-                                          unsigned long address, pte_t pte)
-{
-       if (mm_has_notifiers(mm))
-               __mmu_notifier_change_pte(mm, address, pte);
-}
-
 static inline void
 mmu_notifier_invalidate_range_start(struct mmu_notifier_range *range)
 {
@@ -581,26 +563,6 @@ static inline void mmu_notifier_range_init_owner(
        __young;                                                        \
 })
 
-/*
- * set_pte_at_notify() sets the pte _after_ running the notifier.
- * This is safe to start by updating the secondary MMUs, because the primary MMU
- * pte invalidate must have already happened with a ptep_clear_flush() before
- * set_pte_at_notify() has been invoked.  Updating the secondary MMUs first is
- * required when we change both the protection of the mapping from read-only to
- * read-write and the pfn (like during copy on write page faults). Otherwise the
- * old page would remain mapped readonly in the secondary MMUs after the new
- * page is already writable by some CPU through the primary MMU.
- */
-#define set_pte_at_notify(__mm, __address, __ptep, __pte)              \
-({                                                                     \
-       struct mm_struct *___mm = __mm;                                 \
-       unsigned long ___address = __address;                           \
-       pte_t ___pte = __pte;                                           \
-                                                                       \
-       mmu_notifier_change_pte(___mm, ___address, ___pte);             \
-       set_pte_at(___mm, ___address, __ptep, ___pte);                  \
-})
-
 #else /* CONFIG_MMU_NOTIFIER */
 
 struct mmu_notifier_range {
@@ -650,11 +612,6 @@ static inline int mmu_notifier_test_young(struct mm_struct *mm,
        return 0;
 }
 
-static inline void mmu_notifier_change_pte(struct mm_struct *mm,
-                                          unsigned long address, pte_t pte)
-{
-}
-
 static inline void
 mmu_notifier_invalidate_range_start(struct mmu_notifier_range *range)
 {
@@ -693,7 +650,6 @@ static inline void mmu_notifier_subscriptions_destroy(struct mm_struct *mm)
 #define        ptep_clear_flush_notify ptep_clear_flush
 #define pmdp_huge_clear_flush_notify pmdp_huge_clear_flush
 #define pudp_huge_clear_flush_notify pudp_huge_clear_flush
-#define set_pte_at_notify set_pte_at
 
 static inline void mmu_notifier_synchronize(void)
 {
@@ -701,4 +657,6 @@ static inline void mmu_notifier_synchronize(void)
 
 #endif /* CONFIG_MMU_NOTIFIER */
 
+#define set_pte_at_notify set_pte_at
+
 #endif /* _LINUX_MMU_NOTIFIER_H */
index ec3b068cbbe6b1730c4205237c798834ad8d1ebe..8982e6139d074bb38777f1e84f24c84f079c4a2f 100644 (file)
@@ -424,23 +424,6 @@ int __mmu_notifier_test_young(struct mm_struct *mm,
        return young;
 }
 
-void __mmu_notifier_change_pte(struct mm_struct *mm, unsigned long address,
-                              pte_t pte)
-{
-       struct mmu_notifier *subscription;
-       int id;
-
-       id = srcu_read_lock(&srcu);
-       hlist_for_each_entry_rcu(subscription,
-                                &mm->notifier_subscriptions->list, hlist,
-                                srcu_read_lock_held(&srcu)) {
-               if (subscription->ops->change_pte)
-                       subscription->ops->change_pte(subscription, mm, address,
-                                                     pte);
-       }
-       srcu_read_unlock(&srcu, id);
-}
-
 static int mn_itree_invalidate(struct mmu_notifier_subscriptions *subscriptions,
                               const struct mmu_notifier_range *range)
 {