[openfabrics-ewg] FW: Mstflint - not working on ppc64 andwhendriver is not loaded on AMD

Tseng-Hui (Frank) Lin thlin at us.ibm.com
Thu Sep 28 12:43:15 PDT 2006


The ppc64 problem is actually in pci_64.c. Here is the patch:

============ cut here =============
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c
index 4c4449b..490403c 100644
--- a/arch/powerpc/kernel/pci_64.c
+++ b/arch/powerpc/kernel/pci_64.c
@@ -734,9 +734,7 @@ static struct resource *__pci_mmap_make_
 	if (hose == 0)
 		return NULL;		/* should never happen */
 
-	/* If memory, add on the PCI bridge address offset */
 	if (mmap_state == pci_mmap_mem) {
-		*offset += hose->pci_mem_offset;
 		res_bit = IORESOURCE_MEM;
 	} else {
 		io_offset = (unsigned long)hose->io_base_virt - pci_io_base;
============= end cut =============

The mmap() system call on resource0 does not work on ppc64 without this
patch. PowerMAC G5 got away with this because its hose->pci_mem_offset
was set to 0.

The fix is made on 8/21. It may be able to make it into 2.6.19. But it
certainly won't get into SLES10, SLES9-SP3, or REHL4-U4 which have
already been released. 

To cover both cases with and without the fix, my patch try to
mmap /sys/bus/pci/..../resource0 first. It it failed it tries
mmap /proc/bus/pci/.... If it failed again, we have no choice but fall
back to use PCI config space.


On Thu, 2006-09-28 at 16:59 +0300, Moshe Kazir wrote:
> Michael,
> 
> Frank found the cause to the problem in the implementation of
> arch/ppc/kernel/pci.c , 
> and asked the IBM kernel group to send a bug fix to the Linux kernel
> group.
> 
> The problem is :
> 
> 1. This bug fix will not enter SLES10 as it is closed.
> 2. It also will not enter SLES9 :-) or Redhate as4 u4 .
> 
> So we need a bug fix that will enable the use of mstflint on js21 PPC64
> + backport to old systems  .
> 
> Franks fix is based on two points (if I understand the code with no
> errors) -
> 
> 1. It opens /proc/bus/pci... And not /sys/bus/pci/...
> 2. It perform an ictl(fd, PCIIOC_MMAP_IS_MEM) ;
> 
> Frank - am I write ?
> 
> Can we enter these two small changes to the mstflint to have it working
> on the PPC64 js21 ?
> 
> Moshe 
> 
> 
> 
> 
> 
> ____________________________________________________________
> Moshe Katzir   |  +972-9971-8639 (o)   |   +972-52-860-6042  (m)
>  
> Voltaire - The Grid Backbone
>  
> www.voltaire.com
> 
>   
> 
> 
> -----Original Message-----
> From: Michael S. Tsirkin [mailto:mst at mellanox.co.il] 
> Sent: Thursday, September 28, 2006 4:41 PM
> To: Moshe Kazir
> Cc: Tseng-Hui (Frank) Lin; openfabrics-ewg at openib.org;
> openib-general at openib.org
> Subject: Re: FW: Mstflint - not working on ppc64 andwhendriver is not
> loaded on AMD
> 
> 
> 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;
> }
> 
> 
> 





More information about the ewg mailing list