aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc/cxl/native.c
diff options
context:
space:
mode:
authorChristophe Lombard <clombard@linux.vnet.ibm.com>2015-10-07 01:07:40 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2015-10-07 01:44:46 -0400
commit4108efb02daa09cbb5db048ada55a5b021b5183d (patch)
treee701e7a77cdfcf77d4646631dce7ba1287a6756d /drivers/misc/cxl/native.c
parentd79e6801b1868ff65f4c956d782946c6221a4c1d (diff)
cxl: Fix number of allocated pages in SPA
The scheduled process area is currently allocated before assigning the correct maximum processes to the AFU, which will mean we only ever allocate a fixed number of pages for the scheduled process area. This will limit us to 958 processes with 2 x 64K pages. If we try to use more processes than that we'd probably overrun the buffer and corrupt memory or crash. AFUs that require three or more interrupts per process will not be affected as they are already limited to less processes than that, but we could hit it on an AFU that requires 0, 1 or 2 interrupts per process, or when using 4K pages. This patch moves the initialisation of the num_procs to before the SPA allocation so that enough pages will be allocated for the number of processes that the AFU supports. Signed-off-by: Christophe Lombard <clombard@linux.vnet.ibm.com> Signed-off-by: Ian Munsie <imunsie@au1.ibm.com> Cc: <stable@vger.kernel.org> # 3.18+ Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'drivers/misc/cxl/native.c')
-rw-r--r--drivers/misc/cxl/native.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/misc/cxl/native.c b/drivers/misc/cxl/native.c
index b37f2e8004f5..d2e75c88f4d2 100644
--- a/drivers/misc/cxl/native.c
+++ b/drivers/misc/cxl/native.c
@@ -457,6 +457,7 @@ static int activate_afu_directed(struct cxl_afu *afu)
457 457
458 dev_info(&afu->dev, "Activating AFU directed mode\n"); 458 dev_info(&afu->dev, "Activating AFU directed mode\n");
459 459
460 afu->num_procs = afu->max_procs_virtualised;
460 if (afu->spa == NULL) { 461 if (afu->spa == NULL) {
461 if (cxl_alloc_spa(afu)) 462 if (cxl_alloc_spa(afu))
462 return -ENOMEM; 463 return -ENOMEM;
@@ -468,7 +469,6 @@ static int activate_afu_directed(struct cxl_afu *afu)
468 cxl_p1n_write(afu, CXL_PSL_ID_An, CXL_PSL_ID_An_F | CXL_PSL_ID_An_L); 469 cxl_p1n_write(afu, CXL_PSL_ID_An, CXL_PSL_ID_An_F | CXL_PSL_ID_An_L);
469 470
470 afu->current_mode = CXL_MODE_DIRECTED; 471 afu->current_mode = CXL_MODE_DIRECTED;
471 afu->num_procs = afu->max_procs_virtualised;
472 472
473 if ((rc = cxl_chardev_m_afu_add(afu))) 473 if ((rc = cxl_chardev_m_afu_add(afu)))
474 return rc; 474 return rc;