* Start-end is necessary in case the secondary MMU is mapping the page
* at a smaller granularity than the primary MMU.
*/
- int (*clear_flush_young)(struct mmu_notifier *subscription,
- struct mm_struct *mm,
- unsigned long start,
- unsigned long end);
+ bool (*clear_flush_young)(struct mmu_notifier *subscription,
+ struct mm_struct *mm,
+ unsigned long start,
+ unsigned long end);
/*
* clear_young is a lightweight version of clear_flush_young. Like the
* latter, it is supposed to test-and-clear the young/accessed bitflag
* in the secondary pte, but it may omit flushing the secondary tlb.
*/
- int (*clear_young)(struct mmu_notifier *subscription,
- struct mm_struct *mm,
- unsigned long start,
- unsigned long end);
+ bool (*clear_young)(struct mmu_notifier *subscription,
+ struct mm_struct *mm,
+ unsigned long start,
+ unsigned long end);
/*
* test_young is called to check the young/accessed bitflag in
* frequently used without actually clearing the flag or tearing
* down the secondary mapping on the page.
*/
- int (*test_young)(struct mmu_notifier *subscription,
- struct mm_struct *mm,
- unsigned long address);
+ bool (*test_young)(struct mmu_notifier *subscription,
+ struct mm_struct *mm,
+ unsigned long address);
/*
* invalidate_range_start() and invalidate_range_end() must be
extern void __mmu_notifier_subscriptions_destroy(struct mm_struct *mm);
extern void __mmu_notifier_release(struct mm_struct *mm);
-extern int __mmu_notifier_clear_flush_young(struct mm_struct *mm,
- unsigned long start,
- unsigned long end);
-extern int __mmu_notifier_clear_young(struct mm_struct *mm,
- unsigned long start,
- unsigned long end);
-extern int __mmu_notifier_test_young(struct mm_struct *mm,
- unsigned long address);
+bool __mmu_notifier_clear_flush_young(struct mm_struct *mm,
+ unsigned long start, unsigned long end);
+bool __mmu_notifier_clear_young(struct mm_struct *mm,
+ unsigned long start, unsigned long end);
+bool __mmu_notifier_test_young(struct mm_struct *mm,
+ unsigned long address);
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,
__mmu_notifier_release(mm);
}
-static inline int mmu_notifier_clear_flush_young(struct mm_struct *mm,
- unsigned long start,
- unsigned long end)
+static inline bool mmu_notifier_clear_flush_young(struct mm_struct *mm,
+ unsigned long start, unsigned long end)
{
if (mm_has_notifiers(mm))
return __mmu_notifier_clear_flush_young(mm, start, end);
- return 0;
+ return false;
}
-static inline int mmu_notifier_clear_young(struct mm_struct *mm,
- unsigned long start,
- unsigned long end)
+static inline bool mmu_notifier_clear_young(struct mm_struct *mm,
+ unsigned long start, unsigned long end)
{
if (mm_has_notifiers(mm))
return __mmu_notifier_clear_young(mm, start, end);
- return 0;
+ return false;
}
-static inline int mmu_notifier_test_young(struct mm_struct *mm,
- unsigned long address)
+static inline bool mmu_notifier_test_young(struct mm_struct *mm,
+ unsigned long address)
{
if (mm_has_notifiers(mm))
return __mmu_notifier_test_young(mm, address);
- return 0;
+ return false;
}
static inline void
{
}
-static inline int mmu_notifier_clear_flush_young(struct mm_struct *mm,
- unsigned long start,
- unsigned long end)
+static inline bool mmu_notifier_clear_flush_young(struct mm_struct *mm,
+ unsigned long start, unsigned long end)
{
- return 0;
+ return false;
}
-static inline int mmu_notifier_clear_young(struct mm_struct *mm,
- unsigned long start,
- unsigned long end)
+static inline bool mmu_notifier_clear_young(struct mm_struct *mm,
+ unsigned long start, unsigned long end)
{
- return 0;
+ return false;
}
-static inline int mmu_notifier_test_young(struct mm_struct *mm,
- unsigned long address)
+static inline bool mmu_notifier_test_young(struct mm_struct *mm,
+ unsigned long address)
{
- return 0;
+ return false;
}
static inline void
}
#ifdef CONFIG_MMU_NOTIFIER
-static inline int clear_flush_young_ptes_notify(struct vm_area_struct *vma,
+static inline bool clear_flush_young_ptes_notify(struct vm_area_struct *vma,
unsigned long addr, pte_t *ptep, unsigned int nr)
{
- int young;
+ bool young;
young = clear_flush_young_ptes(vma, addr, ptep, nr);
young |= mmu_notifier_clear_flush_young(vma->vm_mm, addr,
return young;
}
-static inline int pmdp_clear_flush_young_notify(struct vm_area_struct *vma,
+static inline bool pmdp_clear_flush_young_notify(struct vm_area_struct *vma,
unsigned long addr, pmd_t *pmdp)
{
- int young;
+ bool young;
young = pmdp_clear_flush_young(vma, addr, pmdp);
young |= mmu_notifier_clear_flush_young(vma->vm_mm, addr, addr + PMD_SIZE);
return young;
}
-static inline int test_and_clear_young_ptes_notify(struct vm_area_struct *vma,
+static inline bool test_and_clear_young_ptes_notify(struct vm_area_struct *vma,
unsigned long addr, pte_t *ptep, unsigned int nr)
{
- int young;
+ bool young;
young = test_and_clear_young_ptes(vma, addr, ptep, nr);
young |= mmu_notifier_clear_young(vma->vm_mm, addr, addr + nr * PAGE_SIZE);
return young;
}
-static inline int pmdp_test_and_clear_young_notify(struct vm_area_struct *vma,
+static inline bool pmdp_test_and_clear_young_notify(struct vm_area_struct *vma,
unsigned long addr, pmd_t *pmdp)
{
- int young;
+ bool young;
young = pmdp_test_and_clear_young(vma, addr, pmdp);
young |= mmu_notifier_clear_young(vma->vm_mm, addr, addr + PMD_SIZE);
* unmap the address and return 1 or 0 depending if the mapping previously
* existed or not.
*/
-int __mmu_notifier_clear_flush_young(struct mm_struct *mm,
- unsigned long start,
- unsigned long end)
+bool __mmu_notifier_clear_flush_young(struct mm_struct *mm,
+ unsigned long start, unsigned long end)
{
struct mmu_notifier *subscription;
- int young = 0, id;
+ bool young = false;
+ int id;
id = srcu_read_lock(&srcu);
hlist_for_each_entry_srcu(subscription,
return young;
}
-int __mmu_notifier_clear_young(struct mm_struct *mm,
- unsigned long start,
- unsigned long end)
+bool __mmu_notifier_clear_young(struct mm_struct *mm,
+ unsigned long start, unsigned long end)
{
struct mmu_notifier *subscription;
- int young = 0, id;
+ bool young = false;
+ int id;
id = srcu_read_lock(&srcu);
hlist_for_each_entry_srcu(subscription,
return young;
}
-int __mmu_notifier_test_young(struct mm_struct *mm,
- unsigned long address)
+bool __mmu_notifier_test_young(struct mm_struct *mm,
+ unsigned long address)
{
struct mmu_notifier *subscription;
- int young = 0, id;
+ bool young = false;
+ int id;
id = srcu_read_lock(&srcu);
hlist_for_each_entry_srcu(subscription,
return r;
}
-static __always_inline int kvm_age_hva_range(struct mmu_notifier *mn,
- unsigned long start,
- unsigned long end,
- gfn_handler_t handler,
- bool flush_on_ret)
+static __always_inline bool kvm_age_hva_range(struct mmu_notifier *mn,
+ unsigned long start, unsigned long end, gfn_handler_t handler,
+ bool flush_on_ret)
{
struct kvm *kvm = mmu_notifier_to_kvm(mn);
const struct kvm_mmu_notifier_range range = {
return kvm_handle_hva_range(kvm, &range).ret;
}
-static __always_inline int kvm_age_hva_range_no_flush(struct mmu_notifier *mn,
- unsigned long start,
- unsigned long end,
- gfn_handler_t handler)
+static __always_inline bool kvm_age_hva_range_no_flush(struct mmu_notifier *mn,
+ unsigned long start, unsigned long end, gfn_handler_t handler)
{
return kvm_age_hva_range(mn, start, end, handler, false);
}
rcuwait_wake_up(&kvm->mn_memslots_update_rcuwait);
}
-static int kvm_mmu_notifier_clear_flush_young(struct mmu_notifier *mn,
- struct mm_struct *mm,
- unsigned long start,
- unsigned long end)
+static bool kvm_mmu_notifier_clear_flush_young(struct mmu_notifier *mn,
+ struct mm_struct *mm, unsigned long start, unsigned long end)
{
trace_kvm_age_hva(start, end);
!IS_ENABLED(CONFIG_KVM_ELIDE_TLB_FLUSH_IF_YOUNG));
}
-static int kvm_mmu_notifier_clear_young(struct mmu_notifier *mn,
- struct mm_struct *mm,
- unsigned long start,
- unsigned long end)
+static bool kvm_mmu_notifier_clear_young(struct mmu_notifier *mn,
+ struct mm_struct *mm, unsigned long start, unsigned long end)
{
trace_kvm_age_hva(start, end);
return kvm_age_hva_range_no_flush(mn, start, end, kvm_age_gfn);
}
-static int kvm_mmu_notifier_test_young(struct mmu_notifier *mn,
- struct mm_struct *mm,
- unsigned long address)
+static bool kvm_mmu_notifier_test_young(struct mmu_notifier *mn,
+ struct mm_struct *mm, unsigned long address)
{
trace_kvm_test_age_hva(address);