From: Knut Omang Date: Sun, 23 Oct 2016 16:22:35 +0000 (+0200) Subject: sif: pqp: Make setup/teardown function ref sif_pqp_info directly X-Git-Tag: v4.1.12-92~36^2~16 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=d995c2ee73b672bdb3b8ca64d015695fa96b22a5;p=users%2Fjedix%2Flinux-maple.git sif: pqp: Make setup/teardown function ref sif_pqp_info directly Take advantage of the new, cleaner and more separate PQP data structures: Simplify/abstract pqp setup/teardown by pointing into sdev for a direct ref to the sif_pqp_info data structure. Orabug: 24715634 Signed-off-by: Knut Omang --- diff --git a/drivers/infiniband/hw/sif/sif_pqp.c b/drivers/infiniband/hw/sif/sif_pqp.c index fdbc9bf044c1..c71b8f4dd993 100644 --- a/drivers/infiniband/hw/sif/sif_pqp.c +++ b/drivers/infiniband/hw/sif/sif_pqp.c @@ -1075,26 +1075,27 @@ static int sif_ki_spqp_init(struct sif_dev *sdev) int ret = 0; int n = max(sif_ki_spqp_size, 0U); int bm_len = max(1, n/8); + struct sif_pqp_info *pqi = &sdev->pqi; - mutex_init(&sdev->pqi.ki_s.lock); - sdev->pqi.ki_s.spqp = + mutex_init(&pqi->ki_s.lock); + pqi->ki_s.spqp = #ifdef CONFIG_NUMA kmalloc_node(sizeof(struct sif_st_pqp *) * n, GFP_KERNEL | __GFP_ZERO, sdev->pdev->dev.numa_node); #else kmalloc(sizeof(struct sif_st_pqp *) * n, GFP_KERNEL | __GFP_ZERO); #endif - if (!sdev->pqi.ki_s.spqp) + if (!pqi->ki_s.spqp) return -ENOMEM; - sdev->pqi.ki_s.bitmap = + pqi->ki_s.bitmap = #ifdef CONFIG_NUMA kmalloc_node(sizeof(ulong) * bm_len, GFP_KERNEL | __GFP_ZERO, sdev->pdev->dev.numa_node); #else kmalloc(sizeof(ulong) * bm_len, GFP_KERNEL | __GFP_ZERO); #endif - if (!sdev->pqi.ki_s.bitmap) { + if (!pqi->ki_s.bitmap) { ret = -ENOMEM; goto bm_failed; } @@ -1106,10 +1107,10 @@ static int sif_ki_spqp_init(struct sif_dev *sdev) ret = PTR_ERR(spqp); break; } - sdev->pqi.ki_s.spqp[i] = spqp; + pqi->ki_s.spqp[i] = spqp; spqp->index = i; } - sdev->pqi.ki_s.pool_sz = i; + pqi->ki_s.pool_sz = i; if (ret && i) { sif_log(sdev, SIF_INFO, "Failed to create %d INVALIDATE_KEY stencil QPs", i); sif_ki_spqp_fini(sdev); @@ -1119,34 +1120,36 @@ static int sif_ki_spqp_init(struct sif_dev *sdev) sif_log(sdev, SIF_INIT, "Created %d INVALIDATE_KEY stencil QPs", i); bm_failed: if (ret) - kfree(sdev->pqi.ki_s.spqp); + kfree(pqi->ki_s.spqp); return 0; /* Never fail on stencil PQP allocation */ } static void sif_ki_spqp_fini(struct sif_dev *sdev) { + struct sif_pqp_info *pqi = &sdev->pqi; int i; - if (!sdev->pqi.ki_s.spqp) + if (!pqi->ki_s.spqp) return; - for (i = sdev->pqi.ki_s.pool_sz - 1; i >= 0; i--) - sif_destroy_st_pqp(sdev, sdev->pqi.ki_s.spqp[i]); - kfree(sdev->pqi.ki_s.bitmap); - kfree(sdev->pqi.ki_s.spqp); - sdev->pqi.ki_s.spqp = NULL; + for (i = pqi->ki_s.pool_sz - 1; i >= 0; i--) + sif_destroy_st_pqp(sdev, pqi->ki_s.spqp[i]); + kfree(pqi->ki_s.bitmap); + kfree(pqi->ki_s.spqp); + pqi->ki_s.spqp = NULL; } int sif_pqp_init(struct sif_dev *sdev) { struct sif_pqp *pqp; + struct sif_pqp_info *pqi = &sdev->pqi; struct sif_eps *es = &sdev->es[sdev->mbox_epsc]; int i; int ret = 0; uint n_pqps = es->eqs.cnt - 2; - sdev->pqi.pqp = sif_kmalloc(sdev, sizeof(struct sif_pqp *) * n_pqps, GFP_KERNEL | __GFP_ZERO); - if (!sdev->pqi.pqp) + pqi->pqp = sif_kmalloc(sdev, sizeof(struct sif_pqp *) * n_pqps, GFP_KERNEL | __GFP_ZERO); + if (!pqi->pqp) return -ENOMEM; for (i = 0; i < n_pqps; i++) { @@ -1161,10 +1164,10 @@ int sif_pqp_init(struct sif_dev *sdev) ret = PTR_ERR(pqp); goto failed; } - sdev->pqi.pqp[i] = pqp; + pqi->pqp[i] = pqp; } - sdev->pqi.cnt = i; - atomic_set(&sdev->pqi.next, 0); + pqi->cnt = i; + atomic_set(&pqi->next, 0); ret = sif_ki_spqp_init(sdev); if (ret) @@ -1172,32 +1175,34 @@ int sif_pqp_init(struct sif_dev *sdev) return 0; failed: - sdev->pqi.cnt = i; + pqi->cnt = i; sif_pqp_fini(sdev); return ret; } void sif_pqp_fini(struct sif_dev *sdev) { + struct sif_pqp_info *pqi = &sdev->pqi; + sif_ki_spqp_fini(sdev); /* we must maintain a consistent state of the PQP array * during takedown as these operations themselves * generate PQP requests.. */ - while (sdev->pqi.cnt > 0) { - int i = sdev->pqi.cnt - 1; - struct sif_pqp *pqp = sdev->pqi.pqp[i]; + while (pqi->cnt > 0) { + int i = pqi->cnt - 1; + struct sif_pqp *pqp = pqi->pqp[i]; if (i > 0) { /* Remove ourselves first, except the final PQP */ - sdev->pqi.pqp[i] = NULL; - sdev->pqi.cnt--; + pqi->pqp[i] = NULL; + pqi->cnt--; } sif_destroy_pqp(sdev, pqp); if (i == 0) - sdev->pqi.cnt--; + pqi->cnt--; } - kfree(sdev->pqi.pqp); - sdev->pqi.pqp = NULL; + kfree(pqi->pqp); + pqi->pqp = NULL; }