[openfabrics-ewg] FW: Mstflint - not working on ppc64 andwhendriver is not loaded on AMD
    Michael S. Tsirkin 
    mst at mellanox.co.il
       
    Thu Sep 28 06:40:30 PDT 2006
    
    
  
Quoting r. Moshe Kazir <moshek at voltaire.com>:
> 
> Quoting r. Moshe Kazir <moshek at voltaire.com>:
> > Subject: RE: FW: Mstflint - not working on ppc64 andwhendriver is not 
> > loaded on AMD
> > 
> > 
> >  # ls /sys/class/infiniband/mthca0/device/resource0
> > /sys/class/infiniband/mthca0/device/resource0
> 
> OK, so can you try this please:
> 
> strace -f -v -o log  mstflint -d
> /sys/class/infiniband/mthca0/device/resource0 q
> 
> cat log
> 
> -- 
> MST
> 30463 open("/sys/class/infiniband/mthca0/device/resource0", O_RDWR|O_SYNC|O_LARGEFILE) = 3
> 30463 mmap2(NULL, 1048576, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0) = -1 EINVAL (Invalid argument)
So we see that mmap is failing with EINVAL.
But why? We seem to be passing all valid parameters to it.
I'm looking at arch/ppc/kernel/pci.c at the moment.
It seems that EINVAL is returned if __pci_mmap_make_offset
fails, and that seems to be only looking for a valid resource size.
Are you up to finding the root cause of the problem in arch/ppc/kernel/pci.c?
Maybe the resource offsets are wrong? What does
cat /sys/class/infiniband/mthca0/device/resource
show?
Maybe there's some problem to map a full megabyte?
Here's a test that only maps 4K. Could you strace it please?
>>>>>>>>>>>
#define _XOPEN_SOURCE 500
#define _FILE_OFFSET_BITS 64
#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <endian.h>
#include <byteswap.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/pci.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/pci.h>
#include <sys/stat.h>
/* #include <sys/ioctl.h>
 * #include <sys/types.h> */
int main()
{
        int fd;
        unsigned value;
        volatile void *ptr;
        fd = open("/proc/bus/pci/00/00.0" ,O_RDWR | O_SYNC);
        /* ioctl(fd, PCIIOC_MMAP_IS_MEM); */
        ptr = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0xf0000);
        memcpy(&value, (void*)(ptr + 0x14), sizeof value);
        printf("0x%x\n");
        return 0;
}
-- 
MST
    
    
More information about the ewg
mailing list