From: Knut Omang Date: Fri, 16 Sep 2016 09:32:32 +0000 (+0200) Subject: sif: Avoid using SIFMT_2M for allocation of any tables in no_huge_page mode X-Git-Tag: v4.1.12-92~67^2~32 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=d212f7fb8698b209199382792321456f326d7cb3;p=users%2Fjedix%2Flinux-maple.git sif: Avoid using SIFMT_2M for allocation of any tables in no_huge_page mode The feature mask no_huge_pages, enabled for Xen due to DMA address alignment issues with huge pages, did not apply to allocation of CQs, RQs, and SQs, only to the tableworks. This causes allocation of queues of these types larger than 4M in total size to fail on Xen PV domains such as dom0. Orabug: 24683830 Signed-off-by: Knut Omang Reviewed-by: HÃ¥kon Bugge --- diff --git a/drivers/infiniband/hw/sif/sif_cq.c b/drivers/infiniband/hw/sif/sif_cq.c index d6d6ceca2de8..d49667330abe 100644 --- a/drivers/infiniband/hw/sif/sif_cq.c +++ b/drivers/infiniband/hw/sif/sif_cq.c @@ -208,9 +208,12 @@ struct sif_cq *create_cq(struct sif_pd *pd, int entries, if (alloc_sz <= SIF_MAX_CONT) cq->mem = sif_mem_create_dmacont(sdev, alloc_sz, GFP_KERNEL | __GFP_ZERO, DMA_BIDIRECTIONAL); - else + else { + enum sif_mem_type memtype = sif_feature(no_huge_pages) ? SIFMT_4K : SIFMT_2M; + cq->mem = sif_mem_create(sdev, alloc_sz >> PMD_SHIFT, - alloc_sz, SIFMT_2M, GFP_KERNEL | __GFP_ZERO, DMA_BIDIRECTIONAL); + alloc_sz, memtype, GFP_KERNEL | __GFP_ZERO, DMA_BIDIRECTIONAL); + } if (!cq->mem) { sif_log(sdev, SIF_INFO, "Failed to allocate %d CQ entries", entries); ecq = ERR_PTR(-ENOMEM); diff --git a/drivers/infiniband/hw/sif/sif_rq.c b/drivers/infiniband/hw/sif/sif_rq.c index 8a7d3f1eadc6..f8c9685b7ba1 100644 --- a/drivers/infiniband/hw/sif/sif_rq.c +++ b/drivers/infiniband/hw/sif/sif_rq.c @@ -143,9 +143,12 @@ int alloc_rq(struct sif_dev *sdev, struct sif_pd *pd, if (alloc_sz <= SIF_MAX_CONT) rq->mem = sif_mem_create_dmacont(sdev, alloc_sz, GFP_KERNEL | __GFP_ZERO, DMA_BIDIRECTIONAL); - else + else { + enum sif_mem_type memtype = sif_feature(no_huge_pages) ? SIFMT_4K : SIFMT_2M; + rq->mem = sif_mem_create(sdev, alloc_sz >> PMD_SHIFT, - alloc_sz, SIFMT_2M, GFP_KERNEL | __GFP_ZERO, DMA_BIDIRECTIONAL); + alloc_sz, memtype, GFP_KERNEL | __GFP_ZERO, DMA_BIDIRECTIONAL); + } if (!rq->mem) { sif_log(sdev, SIF_INFO, "Failed RQ buffer pool allocation!"); ret = -ENOMEM; diff --git a/drivers/infiniband/hw/sif/sif_sq.c b/drivers/infiniband/hw/sif/sif_sq.c index 8ce97a2a6ebd..9c13976eecdf 100644 --- a/drivers/infiniband/hw/sif/sif_sq.c +++ b/drivers/infiniband/hw/sif/sif_sq.c @@ -167,9 +167,11 @@ int sif_alloc_sq(struct sif_dev *sdev, struct sif_pd *pd, if (alloc_sz <= SIF_MAX_CONT) sq->mem = sif_mem_create_dmacont(sdev, alloc_sz, GFP_KERNEL, DMA_BIDIRECTIONAL); else { + enum sif_mem_type memtype = sif_feature(no_huge_pages) ? SIFMT_4K : SIFMT_2M; + alloc_sz = (alloc_sz + ~PMD_MASK) & PMD_MASK; sq->mem = sif_mem_create(sdev, alloc_sz >> PMD_SHIFT, - alloc_sz, SIFMT_2M, GFP_KERNEL | __GFP_ZERO, + alloc_sz, memtype, GFP_KERNEL | __GFP_ZERO, DMA_BIDIRECTIONAL); } if (!sq->mem) {