On 2/1/21 2:40 PM, Peter Xu wrote: > On Mon, Feb 01, 2021 at 02:11:55PM -0800, Axel Rasmussen wrote: >> On Mon, Feb 1, 2021 at 11:21 AM Peter Xu <peterx@xxxxxxxxxx> wrote: >>> >>> On Thu, Jan 28, 2021 at 02:48:17PM -0800, Axel Rasmussen wrote: >>>> diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h >>>> index f94a35296618..79e1f0155afa 100644 >>>> --- a/include/linux/hugetlb.h >>>> +++ b/include/linux/hugetlb.h >>>> @@ -135,11 +135,14 @@ void hugetlb_show_meminfo(void); >>>> unsigned long hugetlb_total_pages(void); >>>> vm_fault_t hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, >>>> unsigned long address, unsigned int flags); >>>> +#ifdef CONFIG_USERFAULTFD >>> >>> I'm confused why this is needed.. hugetlb_mcopy_atomic_pte() should only be >>> called in userfaultfd.c, but if without uffd config set it won't compile >>> either: >>> >>> obj-$(CONFIG_USERFAULTFD) += userfaultfd.o >> >> With this series as-is, but *without* the #ifdef CONFIG_USERFAULTFD >> here, we introduce a bunch of build warnings like this: >> >> >> >> In file included from ./include/linux/migrate.h:8:0, >> from kernel/sched/sched.h:53, >> from kernel/sched/isolation.c:10: >> ./include/linux/hugetlb.h:143:12: warning: 'enum mcopy_atomic_mode' >> declared inside parameter list >> struct page **pagep); >> ^ >> ./include/linux/hugetlb.h:143:12: warning: its scope is only this >> definition or declaration, which is probably not what you want >> >> And similarly we get an error about the "mode" parameter having an >> incomplete type in hugetlb.c. >> >> >> >> This is because enum mcopy_atomic_mode is defined in userfaultfd_k.h, >> and that entire header is wrapped in a #ifdef CONFIG_USERFAULTFD. So >> we either need to define enum mcopy_atomic_mode unconditionally, or we >> need to #ifdef CONFIG_USERFAULTFD the references to it also. >> >> - I opted not to move it outside the #ifdef CONFIG_USERFAULTFD in >> userfaultfd_k.h (defining it unconditionally), because that seemed >> messy to me. >> - I opted not to define it unconditionally in hugetlb.h, because we'd >> have to move it to userfaultfd_k.h anyway when shmem or other users >> are introduced. I'm planning to send a series to add this a few days >> or so after this series is merged, so it seems churn-y to move it >> then. >> - It seemed optimal to not compile hugetlb_mcopy_atomic_pte anyway >> (even ignoring adding the continue ioctl), since as you point out >> userfaultfd is the only caller. >> >> Hopefully this clarifies this and the next two comments. Let me know >> if you still feel strongly, I don't hate any of the alternatives, just >> wanted to clarify that I had considered them and thought this approach >> was best. > > Then I'd suggest you use a standalone patch to put hugetlb_mcopy_atomic_pte() > into CONFIG_USERFAULTFD blocks, then propose your change with the minor mode. > Note that there're two hugetlb_mcopy_atomic_pte() defined in hugetlb.h. > Although I don't think it a problem since the other one is inlined - I think > you should still put that one into the same ifdef: > > #ifdef CONFIG_USERFAULTFD > static inline int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm, > pte_t *dst_pte, > struct vm_area_struct *dst_vma, > unsigned long dst_addr, > unsigned long src_addr, > struct page **pagep) > { > BUG(); > return 0; > } > #endif /* CONFIG_USERFAULTFD */ > > Let's also see whether Mike would have a preference on this. > No real preference. Just need to fix up the argument list in that second definition. -- Mike Kravetz