[ofa-general] ipath oops

Robert Walsh rjwalsh at pathscale.com
Mon Apr 2 12:12:23 PDT 2007


> Here is a list of calls in the lustre code intercepted by ipath.

Just a clarification: as they currently stand in your code, these will 
NOT be intercepted by ipath, and that's most likely the source of your OOPs.

> o2iblnd.c:
>                 rx->rx_msgaddr = dma_map_single(cmid->device->dma_device,
>                                                 rx->rx_msg,
>                                                 IBLND_MSG_SIZE,
>                                                 DMA_FROM_DEVICE);
> 
> o2iblnd.c:
>                 tx->tx_msgaddr = dma_map_single(
>                         kiblnd_data.kib_cmid->device->dma_device,
>                         tx->tx_msg, IBLND_MSG_SIZE, DMA_TO_DEVICE);
> 
> 
> o2iblnd.c:
>                         dma_unmap_single(conn->ibc_cmid->device->dma_device,
>                                          pci_unmap_addr(rx, rx_msgunmap),
>                                          IBLND_MSG_SIZE, DMA_FROM_DEVICE);
> o2iblnd.c:
>                 dma_unmap_single(kiblnd_data.kib_cmid->device->dma_device,
>                                  pci_unmap_addr(tx, tx_msgunmap),
>                                  IBLND_MSG_SIZE, DMA_TO_DEVICE);
> 
> 
> o2iblnd_cb.c:
>         rd->rd_nfrags = dma_map_sg(kiblnd_data.kib_cmid->device->dma_device,
>                                    tx->tx_frags, tx->tx_nfrags,tx->tx_dmadir);
> 
> 
> o2iblnd_cb.c:
>                 dma_unmap_sg(kiblnd_data.kib_cmid->device->dma_device,
>                              tx->tx_frags, tx->tx_nfrags, tx->tx_dmadir);
> 
> o2iblnd_cb.c:
>                 rd->rd_frags[i].rf_addr = sg_dma_address(&tx->tx_frags[i]);
> 
> o2iblnd_cb.c:
>                 rd->rd_frags[i].rf_nob  = sg_dma_len(&tx->tx_frags[i]);
> 
> 
> 
> So, how to proceed now?

These need to be replaced with calls to ib_dma_map_single, 
ib_dma_unmap_single, ib_dma_map_sg, ib_dma_unmap_sg, etc.  Note that 
these calls typically take a struct ib_device * as the first argument 
instead of a struct device *.  Other than that, the API is pretty much 
identical.  Here's the complete list:

   ib_dma_mapping_error
   ib_dma_map_single
   ib_dma_unmap_single
   ib_dma_map_page
   ib_dma_unmap_page
   ib_dma_map_sg
   ib_dma_unmap_sg
   ib_sg_dma_address
   ib_sg_dma_len
   ib_dma_sync_single_for_cpu
   ib_dma_sync_single_for_device
   ib_dma_alloc_coherent
   ib_dma_free_coherent

Look in rdma/ib_verbs.h for prototypes.

Let me know if you need any more assistance with this.

Regards,
  Robert.



More information about the general mailing list