[openib-general] [PATCH 3 of 4] IB/mthca: fix non-cache-coherent CPUs with memfree
Michael S. Tsirkin
mst at mellanox.co.il
Wed Feb 14 02:01:09 PST 2007
> Quoting Roland Dreier <rdreier at cisco.com>:
> Subject: Re: [PATCH 3 of 4] IB/mthca: fix non-cache-coherent CPUs with memfree
>
> OK, I already merged this but now I'm thinking it's somewhat buggy:
Hopefully not.
> > + if (coherent)
> > + ret = mthca_alloc_icm_coherent(&dev->pdev->dev,
> > + &chunk->mem[chunk->npages],
> > + cur_order, gfp_mask);
> > + else
> > + ret = mthca_alloc_icm_pages(&chunk->mem[chunk->npages],
> > + cur_order, gfp_mask);
> >
> > - if (++chunk->npages == MTHCA_ICM_CHUNK_LEN) {
> > + if (!ret) {
> > + ++chunk->npages;
> > +
> > + if (!coherent && chunk->npages == MTHCA_ICM_CHUNK_LEN) {
> > chunk->nsg = pci_map_sg(dev->pdev, chunk->mem,
>
> I don't see anything that ever bumps chunk->nsg if we're allocating a
> coherent region and we end up needing more than one allocation to do
> it.
Yes but this is intentional.
> Maybe something like this on top of the patch?
>
> diff --git a/drivers/infiniband/hw/mthca/mthca_memfree.c b/drivers/infiniband/hw/mthca/mthca_memfree.c
> index 0b9d053..48f7c65 100644
> --- a/drivers/infiniband/hw/mthca/mthca_memfree.c
> +++ b/drivers/infiniband/hw/mthca/mthca_memfree.c
> @@ -175,7 +175,9 @@ struct mthca_icm *mthca_alloc_icm(struct mthca_dev *dev, int npages,
> if (!ret) {
> ++chunk->npages;
>
> - if (!coherent && chunk->npages == MTHCA_ICM_CHUNK_LEN) {
> + if (coherent)
> + ++chunk->nsg;
> + else if (chunk->npages == MTHCA_ICM_CHUNK_LEN) {
> chunk->nsg = pci_map_sg(dev->pdev, chunk->mem,
> chunk->npages,
> PCI_DMA_BIDIRECTIONAL);
No, I think the code is fine and this patch will break things:
chunk->nsg is needed only for non-coherent memory to call pci_unmap_sg:
if (chunk->nsg > 0)
pci_unmap_sg(dev->pdev, chunk->mem,
chunk->npages, PCI_DMA_BIDIRECTIONAL);
and we do *not* want to call pci_unmap_sg on consistent memory.
--
MST
More information about the general
mailing list