Message ID | 20190304200026.1140281-1-arnd@arndb.de |
---|---|
State | New |
Headers | show |
Series | mm/hmm: fix unused variable warnings | expand |
On 03/05/2019 01:30 AM, Arnd Bergmann wrote: > When CONFIG_HUGETLB_PAGE is disabled, the only use of the variable 'h' > is compiled out, and the compiler thinks it is unnecessary: > > mm/hmm.c: In function 'hmm_range_snapshot': > mm/hmm.c:1015:19: error: unused variable 'h' [-Werror=unused-variable] > struct hstate *h = hstate_vma(vma); After doing some Kconfig hacks like (ARCH_WANT_GENERAL_HUGETLB = n) on an X86 system I got (HUGETLB_PAGE = n and HMM = y) config. But was unable to hit the build error. Helper is_vm_hugetlb_page() seems to always return false when HUGETLB_PAGE = n. Would not the compiler remove the entire code block including the declaration for 'h' ? #ifdef CONFIG_HUGETLB_PAGE #include <linux/mm.h> static inline bool is_vm_hugetlb_page(struct vm_area_struct *vma) { return !!(vma->vm_flags & VM_HUGETLB); } #else static inline bool is_vm_hugetlb_page(struct vm_area_struct *vma) { return false; } #endif
On 3/4/19 12:00 PM, Arnd Bergmann wrote: > When CONFIG_HUGETLB_PAGE is disabled, the only use of the variable 'h' > is compiled out, and the compiler thinks it is unnecessary: > > mm/hmm.c: In function 'hmm_range_snapshot': > mm/hmm.c:1015:19: error: unused variable 'h' [-Werror=unused-variable] > struct hstate *h = hstate_vma(vma); > > Rephrase the code to avoid the temporary variable instead, so the > compiler stops warning. > > Fixes: 5409a90d4212 ("mm/hmm: support hugetlbfs (snapshotting, faulting and DMA mapping)") > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > mm/hmm.c | 10 ++++------ > 1 file changed, 4 insertions(+), 6 deletions(-) > > diff --git a/mm/hmm.c b/mm/hmm.c > index 3c9781037918..c4beb1628cad 100644 > --- a/mm/hmm.c > +++ b/mm/hmm.c > @@ -1012,9 +1012,8 @@ long hmm_range_snapshot(struct hmm_range *range) > return -EFAULT; > > if (is_vm_hugetlb_page(vma)) { > - struct hstate *h = hstate_vma(vma); > - > - if (huge_page_shift(h) != range->page_shift && > + if (range->page_shift != > + huge_page_shift(hstate_vma(vma)) && > range->page_shift != PAGE_SHIFT) > return -EINVAL; > } else { > @@ -1115,9 +1114,8 @@ long hmm_range_fault(struct hmm_range *range, bool block) > return -EFAULT; > > if (is_vm_hugetlb_page(vma)) { > - struct hstate *h = hstate_vma(vma); > - > - if (huge_page_shift(h) != range->page_shift && > + if (range->page_shift != > + huge_page_shift(hstate_vma(vma)) && > range->page_shift != PAGE_SHIFT) > return -EINVAL; > } else { > Hi Arnd, With some Kconfig local hacks that removed all HUGE* support, while leaving HMM enabled, I was able to reproduce your results, and also to verify the fix. It also makes sense from reading it. Also, I ran into one more warning as well: mm/hmm.c: In function ‘hmm_vma_walk_pud’: mm/hmm.c:764:25: warning: unused variable ‘vma’ [-Wunused-variable] struct vm_area_struct *vma = walk->vma; ^~~ ...which can be fixed like this: diff --git a/mm/hmm.c b/mm/hmm.c index c4beb1628cad..c1cbe82d12b5 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -761,7 +761,6 @@ static int hmm_vma_walk_pud(pud_t *pudp, { struct hmm_vma_walk *hmm_vma_walk = walk->private; struct hmm_range *range = hmm_vma_walk->range; - struct vm_area_struct *vma = walk->vma; unsigned long addr = start, next; pmd_t *pmdp; pud_t pud; @@ -807,7 +806,7 @@ static int hmm_vma_walk_pud(pud_t *pudp, return 0; } - split_huge_pud(vma, pudp, addr); + split_huge_pud(walk->vma, pudp, addr); if (pud_none(*pudp)) goto again; ...so maybe you'd like to fold that into your patch? thanks, -- John Hubbard NVIDIA
On Wed, Mar 6, 2019 at 12:51 AM John Hubbard <jhubbard@nvidia.com> wrote: > > With some Kconfig local hacks that removed all HUGE* support, while leaving > HMM enabled, I was able to reproduce your results, and also to verify the > fix. It also makes sense from reading it. Thanks for the confirmation. > Also, I ran into one more warning as well: > > mm/hmm.c: In function ‘hmm_vma_walk_pud’: > mm/hmm.c:764:25: warning: unused variable ‘vma’ [-Wunused-variable] > struct vm_area_struct *vma = walk->vma; > ^~~ > > ...which can be fixed like this: > > diff --git a/mm/hmm.c b/mm/hmm.c > index c4beb1628cad..c1cbe82d12b5 100644 > --- a/mm/hmm.c > +++ b/mm/hmm.c > @@ -761,7 +761,6 @@ static int hmm_vma_walk_pud(pud_t *pudp, > { > struct hmm_vma_walk *hmm_vma_walk = walk->private; > struct hmm_range *range = hmm_vma_walk->range; > - struct vm_area_struct *vma = walk->vma; > unsigned long addr = start, next; > pmd_t *pmdp; > pud_t pud; > @@ -807,7 +806,7 @@ static int hmm_vma_walk_pud(pud_t *pudp, > return 0; > } > > - split_huge_pud(vma, pudp, addr); > + split_huge_pud(walk->vma, pudp, addr); > if (pud_none(*pudp)) > goto again; > > ...so maybe you'd like to fold that into your patch? I also ran into this one last night during further randconfig testing, and came up with the same patch that you showed here. I'll send this one to Andrew and add a Reported-by line for you, since he already merged the first patch. I'll leave it up to Andrew to fold the fixes into one, or into the original patches if he thinks that makes sense. Arnd
On Tue, Mar 5, 2019 at 1:18 PM Anshuman Khandual <anshuman.khandual@arm.com> wrote: > On 03/05/2019 01:30 AM, Arnd Bergmann wrote: > > When CONFIG_HUGETLB_PAGE is disabled, the only use of the variable 'h' > > is compiled out, and the compiler thinks it is unnecessary: > > > > mm/hmm.c: In function 'hmm_range_snapshot': > > mm/hmm.c:1015:19: error: unused variable 'h' [-Werror=unused-variable] > > struct hstate *h = hstate_vma(vma); > > After doing some Kconfig hacks like (ARCH_WANT_GENERAL_HUGETLB = n) on an > X86 system I got (HUGETLB_PAGE = n and HMM = y) config. But was unable to > hit the build error. Helper is_vm_hugetlb_page() seems to always return > false when HUGETLB_PAGE = n. Would not the compiler remove the entire code > block including the declaration for 'h' ? > > #ifdef CONFIG_HUGETLB_PAGE > #include <linux/mm.h> > static inline bool is_vm_hugetlb_page(struct vm_area_struct *vma) > { > return !!(vma->vm_flags & VM_HUGETLB); > } > #else > static inline bool is_vm_hugetlb_page(struct vm_area_struct *vma) > { > return false; > } > #endif The is_vm_hugetlb_page() check is unrelated to the warning here, the problem is that huge_page_shift() is defined as #define huge_page_shift(h) PAGE_SHIFT when CONFIG_HUGETLB_PAGE is disabled, so after preprocessing, the only reference to the variable is removed. Arnd
On 3/6/19 2:19 AM, Arnd Bergmann wrote: > On Wed, Mar 6, 2019 at 12:51 AM John Hubbard <jhubbard@nvidia.com> wrote: >> >> With some Kconfig local hacks that removed all HUGE* support, while leaving >> HMM enabled, I was able to reproduce your results, and also to verify the >> fix. It also makes sense from reading it. > > Thanks for the confirmation. > >> Also, I ran into one more warning as well: >> >> mm/hmm.c: In function ‘hmm_vma_walk_pud’: >> mm/hmm.c:764:25: warning: unused variable ‘vma’ [-Wunused-variable] >> struct vm_area_struct *vma = walk->vma; >> ^~~ >> >> ...which can be fixed like this: >> >> diff --git a/mm/hmm.c b/mm/hmm.c >> index c4beb1628cad..c1cbe82d12b5 100644 >> --- a/mm/hmm.c >> +++ b/mm/hmm.c >> @@ -761,7 +761,6 @@ static int hmm_vma_walk_pud(pud_t *pudp, >> { >> struct hmm_vma_walk *hmm_vma_walk = walk->private; >> struct hmm_range *range = hmm_vma_walk->range; >> - struct vm_area_struct *vma = walk->vma; >> unsigned long addr = start, next; >> pmd_t *pmdp; >> pud_t pud; >> @@ -807,7 +806,7 @@ static int hmm_vma_walk_pud(pud_t *pudp, >> return 0; >> } >> >> - split_huge_pud(vma, pudp, addr); >> + split_huge_pud(walk->vma, pudp, addr); >> if (pud_none(*pudp)) >> goto again; >> >> ...so maybe you'd like to fold that into your patch? > > I also ran into this one last night during further randconfig testing, > and came up with the same patch that you showed here. I'll > send this one to Andrew and add a Reported-by line for you, > since he already merged the first patch. > > I'll leave it up to Andrew to fold the fixes into one, or into the original > patches if he thinks that makes sense. > > Arnd > Sounds good! thanks, -- John Hubbard NVIDIA
diff --git a/mm/hmm.c b/mm/hmm.c index 3c9781037918..c4beb1628cad 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -1012,9 +1012,8 @@ long hmm_range_snapshot(struct hmm_range *range) return -EFAULT; if (is_vm_hugetlb_page(vma)) { - struct hstate *h = hstate_vma(vma); - - if (huge_page_shift(h) != range->page_shift && + if (range->page_shift != + huge_page_shift(hstate_vma(vma)) && range->page_shift != PAGE_SHIFT) return -EINVAL; } else { @@ -1115,9 +1114,8 @@ long hmm_range_fault(struct hmm_range *range, bool block) return -EFAULT; if (is_vm_hugetlb_page(vma)) { - struct hstate *h = hstate_vma(vma); - - if (huge_page_shift(h) != range->page_shift && + if (range->page_shift != + huge_page_shift(hstate_vma(vma)) && range->page_shift != PAGE_SHIFT) return -EINVAL; } else {
When CONFIG_HUGETLB_PAGE is disabled, the only use of the variable 'h' is compiled out, and the compiler thinks it is unnecessary: mm/hmm.c: In function 'hmm_range_snapshot': mm/hmm.c:1015:19: error: unused variable 'h' [-Werror=unused-variable] struct hstate *h = hstate_vma(vma); Rephrase the code to avoid the temporary variable instead, so the compiler stops warning. Fixes: 5409a90d4212 ("mm/hmm: support hugetlbfs (snapshotting, faulting and DMA mapping)") Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- mm/hmm.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) -- 2.20.0