[adding linux-arch and relevant folk] On Wed, Apr 17, 2019 at 08:35:25PM +0800, Boyang Zhou wrote: > The error information is that “offset value too large for defined data type”. > Reason: > On the X86 platform, the data type of “off" is unsigned long; but on the > ARM64 platform, the data type is defined as off_t, and off_t is by type long > instead of unsigned long. > When the off right shifts in the function “sys_mmap_pgoff(addr, len, prot, > flags, fd, off >> PAGE_SHIFT)"on ARM64, high address of off is filled with > sign bit 1instead of 0. > In our case, we mmap GPU doorbell on both platform. On the x86 platform, the > value of off is f009c00000000000, after shift the value becomes > f009c00000000; while on the ARM64, the value of off changes from > ed35c00000000000 to fffed35c00000000. This value is treated as unsigned long > in later functions. So it is too big for off and the error happened. > We have tested the patchs in Huawei ARM64 server with a couples of AMD GPUs.
It looks like the generic mmap uses unsigned long, as do sparc and x86. However, arm64, microblase, powerpc and riscv all use off_t. Should those all be using unsigned long? If so, that seems like it should be a treewide cleanup. Similar applies to pgoff for mmap2. Thanks, Mark. > > Signed-off-by: Boyang Zhou <zhouby...@126.com> > --- > arch/arm64/kernel/sys.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/arch/arm64/kernel/sys.c b/arch/arm64/kernel/sys.c > index b44065f..6f91e81 100644 > --- a/arch/arm64/kernel/sys.c > +++ b/arch/arm64/kernel/sys.c > @@ -31,7 +31,7 @@ > > SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, > unsigned long, prot, unsigned long, flags, > - unsigned long, fd, off_t, off) > + unsigned long, fd, unsigned long, off) > { > if (offset_in_page(off) != 0) > return -EINVAL; > -- > 2.7.4 >