[openib-general] [PATCH 3 of 4] IB/mthca: fix non-cache-coherent CPUs with memfree

Roland Dreier rdreier at cisco.com
Mon Feb 12 21:45:19 PST 2007


OK, I already merged this but now I'm thinking it's somewhat buggy:

 > +		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.  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);




More information about the general mailing list