[ofa-general] Re: [PATCH] IB/mthca: Clear ICM pages before handing to FW
Roland Dreier
rdreier at cisco.com
Sun Jun 22 12:57:26 PDT 2008
> I was thinking about applications which create and destroy HCA
> resources at a high rate which might be affected.
I would expect all the other costs of mapping pages into/out of the ICM
to be large enough that the cost of zeroing a page is not too big a
deal. But if there is anyone who cares we can always make this
__GFP_ZERO flag conditional on FW version I guess.
> Looks to me like using __GFP_ZERO is the cleanest approach. I like
> less clear_highpage() since it uses kmap_atomic() which could fail.
To the best of my knowledge, kmap_atomic() cannot fail -- and if you
think about it, what could make it fail? The whole point of
kmap_atomic() is that there is a per-cpu pre-reserved slot to map the
memory at for highmem pages, so it has to always work. As far as I can
see, __GFP_ZERO allocations use clear_highpage() internally anyway, so
it ends up being the same thing.
Since just adding __GFP_ZERO is so much simpler, I'll just commit the
patch below and send it to Linus in a day or two if it seems OK to you:
commit 801d1ad7b6bdb3418a462c6b4950aee56dbac940
Author: Eli Cohen <eli at mellanox.co.il>
Date: Sun Jun 22 12:56:58 2008 -0700
IB/mthca: Clear ICM pages before handing to FW
Current memfree FW has a bug which in some cases, assumes that ICM
pages passed to it are cleared. This patch uses __GFP_ZERO to
allocate all ICM pages passed to the FW. Once firmware with a fix is
released, we can make the workaround conditional on firmware version.
This fixes the bug reported by Arthur Kepner <akepner at sgi.com> here:
http://lists.openfabrics.org/pipermail/general/2008-May/050026.html
Signed-off-by: Eli Cohen <eli at mellanox.co.il>
[ Rewritten to be a one-liner using __GFP_ZERO instead of vmap()ing
ICM memory and memset()ing it to 0. - Roland ]
Signed-off-by: Roland Dreier <rolandd at cisco.com>
diff --git a/drivers/infiniband/hw/mthca/mthca_memfree.c b/drivers/infiniband/hw/mthca/mthca_memfree.c
index 9e77ba9..1f7d1a2 100644
--- a/drivers/infiniband/hw/mthca/mthca_memfree.c
+++ b/drivers/infiniband/hw/mthca/mthca_memfree.c
@@ -107,7 +107,11 @@ static int mthca_alloc_icm_pages(struct scatterlist *mem, int order, gfp_t gfp_m
{
struct page *page;
- page = alloc_pages(gfp_mask, order);
+ /*
+ * Use __GFP_ZERO because buggy firmware assumes ICM pages are
+ * cleared, and subtle failures are seen if they aren't.
+ */
+ page = alloc_pages(gfp_mask | __GFP_ZERO, order);
if (!page)
return -ENOMEM;
More information about the general
mailing list