On Tue, 11 Dec 2018, Jerome Glisse wrote: > > > > The macro version of mmu_notifier_range_init() for CONFIG_MMU_NOTIFIER=n > > > > does not evaluate all its arguments, leading to a warning in one case: > > > > > > > > mm/migrate.c: In function 'migrate_vma_pages': > > > > mm/migrate.c:2711:20: error: unused variable 'mm' > > > > [-Werror=unused-variable] > > > > struct mm_struct *mm = vma->vm_mm; > > > > > > > > Pass down the 'mm' as into the inline function as well so gcc can > > > > see why the variable exists. > > > > > > > > Fixes: 137d92bd73b1 ("mm/mmu_notifier: use structure for > > > > invalidate_range_start/end calls v2") > > > > > > What about changing migrate.c (i actualy tried to do that everywhere in > > > the patchset but i missed that spot) So we avoid one useless variable on > > > such configuration: > > > > > > diff --git a/mm/migrate.c b/mm/migrate.c > > > index f02bb4b22c1a..883fce631f47 100644 > > > --- a/mm/migrate.c > > > +++ b/mm/migrate.c > > > @@ -2701,7 +2701,6 @@ static void migrate_vma_pages(struct migrate_vma > > > *migrate) > > > const unsigned long npages = migrate->npages; > > > const unsigned long start = migrate->start; > > > struct vm_area_struct *vma = migrate->vma; > > > - struct mm_struct *mm = vma->vm_mm; > > > struct mmu_notifier_range range; > > > unsigned long addr, i; > > > bool notified = false; > > > @@ -2724,8 +2723,8 @@ static void migrate_vma_pages(struct migrate_vma > > > *migrate) > > > if (!notified) { > > > notified = true; > > > > > > - mmu_notifier_range_init(&range, mm, addr, > > > - migrate->end, > > > + mmu_notifier_range_init(&range, vma->vm_mm, > > > + addr, migrate->end, > > > MMU_NOTIFY_CLEAR); > > > mmu_notifier_invalidate_range_start(&range); > > > } > > > > Wouldn't it be better to just declare mmu_notifier_range_init() as a > > static inline function rather than a #define to avoid this warning? > > The define trick is use to drop the event parameter so that we do not > need to define the event value for CONFIG_MMU_NOTIFIER=n case. >
Hmm, strange that Arnd's build failure is only reporting about an unused variable instead of MMU_NOTIFY_CLEAR being undefined :/ I think this should be done so that anybody using mmu_notifier_range_init() doesn't need to worry about the implications of *any* unused formal parameter as a result of how the #define is formed: diff --git a/include/linux/mmu_notifier.h b/include/linux/mmu_notifier.h --- a/include/linux/mmu_notifier.h +++ b/include/linux/mmu_notifier.h @@ -10,21 +10,6 @@ struct mmu_notifier; struct mmu_notifier_ops; -#ifdef CONFIG_MMU_NOTIFIER - -/* - * The mmu notifier_mm structure is allocated and installed in - * mm->mmu_notifier_mm inside the mm_take_all_locks() protected - * critical section and it's released only when mm_count reaches zero - * in mmdrop(). - */ -struct mmu_notifier_mm { - /* all mmu notifiers registerd in this mm are queued in this list */ - struct hlist_head list; - /* to serialize the list modifications and hlist_unhashed */ - spinlock_t lock; -}; - /** * enum mmu_notifier_event - reason for the mmu notifier callback * @MMU_NOTIFY_UNMAP: either munmap() that unmap the range or a mremap() that @@ -53,6 +38,21 @@ enum mmu_notifier_event { MMU_NOTIFY_SOFT_DIRTY, }; +#ifdef CONFIG_MMU_NOTIFIER + +/* + * The mmu notifier_mm structure is allocated and installed in + * mm->mmu_notifier_mm inside the mm_take_all_locks() protected + * critical section and it's released only when mm_count reaches zero + * in mmdrop(). + */ +struct mmu_notifier_mm { + /* all mmu notifiers registerd in this mm are queued in this list */ + struct hlist_head list; + /* to serialize the list modifications and hlist_unhashed */ + spinlock_t lock; +}; + struct mmu_notifier_range { struct mm_struct *mm; unsigned long start; @@ -483,9 +483,14 @@ static inline void _mmu_notifier_range_init(struct mmu_notifier_range *range, range->end = end; } -#define mmu_notifier_range_init(range, mm, start, end, event) \ - _mmu_notifier_range_init(range, start, end) - +static inline void mmu_notifier_range_init(struct mmu_notifier_range *range, + struct mm_struct *mm, + unsigned long start, + unsigned long end, + enum mmu_notifier_event event) +{ + _mmu_notifier_range_init(range, start, end); +} static inline int mm_has_notifiers(struct mm_struct *mm) {