]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mm/mmu_notifiers: annotate with might_sleep()
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 26 Aug 2019 20:14:25 +0000 (22:14 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Sat, 7 Sep 2019 07:28:04 +0000 (04:28 -0300)
Since mmu notifiers don't exist for many processes, but could block in
interesting places, add some annotations. This should help make sure the
core mm keeps up its end of the mmu notifier contract.

The checks here are outside of all notifier checks because of that.
They compile away without CONFIG_DEBUG_ATOMIC_SLEEP.

Link: https://lore.kernel.org/r/20190826201425.17547-6-daniel.vetter@ffwll.ch
Suggested-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Reviewed-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
include/linux/mmu_notifier.h

index 4dfe996dafd29d542c998ba437826a82ea86f037..1bd8e6a09a3c27842d1e48a38796cf52b5de3127 100644 (file)
@@ -343,6 +343,8 @@ static inline void mmu_notifier_change_pte(struct mm_struct *mm,
 static inline void
 mmu_notifier_invalidate_range_start(struct mmu_notifier_range *range)
 {
+       might_sleep();
+
        lock_map_acquire(&__mmu_notifier_invalidate_range_start_map);
        if (mm_has_notifiers(range->mm)) {
                range->flags |= MMU_NOTIFIER_RANGE_BLOCKABLE;
@@ -368,6 +370,9 @@ mmu_notifier_invalidate_range_start_nonblock(struct mmu_notifier_range *range)
 static inline void
 mmu_notifier_invalidate_range_end(struct mmu_notifier_range *range)
 {
+       if (mmu_notifier_range_blockable(range))
+               might_sleep();
+
        if (mm_has_notifiers(range->mm))
                __mmu_notifier_invalidate_range_end(range, false);
 }