On Wed, 14 Mar 2018 11:52:51 -0700 Mike Kravetz <mike.kravetz@xxxxxxxxxx> wrote: > On 03/13/2018 11:15 PM, kbuild test robot wrote: > > tree: git://git.cmpxchg.org/linux-mmotm.git master > > head: ead058c4ec49752a4e0323368f1d695385c66020 > > commit: af7abfba1161d2814301844fe11adac16910ea80 [8/285] hugetlbfs-check-for-pgoff-value-overflow-v3 > > config: sh-defconfig (attached as .config) > > compiler: sh4-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0 > > reproduce: > > wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross > > chmod +x ~/bin/make.cross > > git checkout af7abfba1161d2814301844fe11adac16910ea80 > > # save the attached .config to linux build tree > > make.cross ARCH=sh > > > > All warnings (new ones prefixed by >>): > > > > fs//hugetlbfs/inode.c: In function 'hugetlbfs_file_mmap': > >>> fs//hugetlbfs/inode.c:118:36: warning: left shift count is negative [-Wshift-count-negative] > > #define PGOFF_LOFFT_MAX (PAGE_MASK << (BITS_PER_LONG - (2 * PAGE_SHIFT) - 1)) > > ^ > > BITS_PER_LONG = 32 (32bit config) > PAGE_SHIFT = 16 (64K pages) > This results in the negative shift value. > > I had proposed another (not so pretty way) to create the mask. > > #define PGOFF_LOFFT_MAX \ > (((1UL << (PAGE_SHIFT + 1)) - 1) << (BITS_PER_LONG - (PAGE_SHIFT + 1))) > > This works for the above config, and should work for any. > > Andrew, how would you like me to update the patch? I can send a new > version but know you have also made some changes for VM_WARN. Would > you simply like a delta on top of the current patch? This? From: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> Subject: hugetlbfs-check-for-pgoff-value-overflow-v3-fix-fix fix -ve left shift count on sh Cc: "Kirill A . Shutemov" <kirill.shutemov@xxxxxxxxxxxxxxx> Cc: Michal Hocko <mhocko@xxxxxxxxxx> Cc: Mike Kravetz <mike.kravetz@xxxxxxxxxx> Cc: Nic Losby <blurbdust@xxxxxxxxx> Cc: Yisheng Xie <xieyisheng1@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- fs/hugetlbfs/inode.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff -puN mm/hugetlb.c~hugetlbfs-check-for-pgoff-value-overflow-v3-fix-fix mm/hugetlb.c diff -puN fs/hugetlbfs/inode.c~hugetlbfs-check-for-pgoff-value-overflow-v3-fix-fix fs/hugetlbfs/inode.c --- a/fs/hugetlbfs/inode.c~hugetlbfs-check-for-pgoff-value-overflow-v3-fix-fix +++ a/fs/hugetlbfs/inode.c @@ -115,7 +115,8 @@ static void huge_pagevec_release(struct * value. The extra bit (- 1 in the shift value) is to take the sign * bit into account. */ -#define PGOFF_LOFFT_MAX (PAGE_MASK << (BITS_PER_LONG - (2 * PAGE_SHIFT) - 1)) +#define PGOFF_LOFFT_MAX \ + (((1UL << (PAGE_SHIFT + 1)) - 1) << (BITS_PER_LONG - (PAGE_SHIFT + 1))) static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma) { _