Commit 5d1952ac authored by Uma Krishnan's avatar Uma Krishnan Committed by Martin K. Petersen

cxlflash: Reorder user context initialization

In order to support cxlflash in the PowerVM environment, underlying
hypervisor APIs have imposed a kernel API ordering change.

For the superpipe access to LUN, user applications need a context.
The cxlflash module creates this context by making a sequence of
cxl calls. In the current code, a context is initialized via
cxl_dev_context_init() followed by cxl_process_element(), a function
that obtains the process element id. Finally, cxl_start_work()
is called to attach the process element.

In the PowerVM environment, a process element id cannot be obtained
from the hypervisor until the process element is attached. The
cxlflash module is unable to create contexts without a valid
process element id.

To fix this problem, cxl_start_work() is called before obtaining
the process element id.
Signed-off-by: default avatarUma Krishnan <ukrishn@linux.vnet.ibm.com>
Acked-by: default avatarMatthew R. Ochs <mrochs@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 8a96b52a
...@@ -1386,6 +1386,13 @@ static int cxlflash_disk_attach(struct scsi_device *sdev, ...@@ -1386,6 +1386,13 @@ static int cxlflash_disk_attach(struct scsi_device *sdev,
goto out_attach; goto out_attach;
} }
ctxi = create_context(cfg);
if (unlikely(!ctxi)) {
dev_err(dev, "%s: Failed to create context! (%d)\n",
__func__, ctxid);
goto err;
}
ctx = cxl_dev_context_init(cfg->dev); ctx = cxl_dev_context_init(cfg->dev);
if (IS_ERR_OR_NULL(ctx)) { if (IS_ERR_OR_NULL(ctx)) {
dev_err(dev, "%s: Could not initialize context %p\n", dev_err(dev, "%s: Could not initialize context %p\n",
...@@ -1394,6 +1401,17 @@ static int cxlflash_disk_attach(struct scsi_device *sdev, ...@@ -1394,6 +1401,17 @@ static int cxlflash_disk_attach(struct scsi_device *sdev,
goto err; goto err;
} }
work = &ctxi->work;
work->num_interrupts = attach->num_interrupts;
work->flags = CXL_START_WORK_NUM_IRQS;
rc = cxl_start_work(ctx, work);
if (unlikely(rc)) {
dev_dbg(dev, "%s: Could not start context rc=%d\n",
__func__, rc);
goto err;
}
ctxid = cxl_process_element(ctx); ctxid = cxl_process_element(ctx);
if (unlikely((ctxid >= MAX_CONTEXT) || (ctxid < 0))) { if (unlikely((ctxid >= MAX_CONTEXT) || (ctxid < 0))) {
dev_err(dev, "%s: ctxid (%d) invalid!\n", __func__, ctxid); dev_err(dev, "%s: ctxid (%d) invalid!\n", __func__, ctxid);
...@@ -1411,27 +1429,9 @@ static int cxlflash_disk_attach(struct scsi_device *sdev, ...@@ -1411,27 +1429,9 @@ static int cxlflash_disk_attach(struct scsi_device *sdev,
/* Translate read/write O_* flags from fcntl.h to AFU permission bits */ /* Translate read/write O_* flags from fcntl.h to AFU permission bits */
perms = SISL_RHT_PERM(attach->hdr.flags + 1); perms = SISL_RHT_PERM(attach->hdr.flags + 1);
ctxi = create_context(cfg);
if (unlikely(!ctxi)) {
dev_err(dev, "%s: Failed to create context! (%d)\n",
__func__, ctxid);
goto err;
}
/* Context mutex is locked upon return */ /* Context mutex is locked upon return */
init_context(ctxi, cfg, ctx, ctxid, fd, file, perms); init_context(ctxi, cfg, ctx, ctxid, fd, file, perms);
work = &ctxi->work;
work->num_interrupts = attach->num_interrupts;
work->flags = CXL_START_WORK_NUM_IRQS;
rc = cxl_start_work(ctx, work);
if (unlikely(rc)) {
dev_dbg(dev, "%s: Could not start context rc=%d\n",
__func__, rc);
goto err;
}
rc = afu_attach(cfg, ctxi); rc = afu_attach(cfg, ctxi);
if (unlikely(rc)) { if (unlikely(rc)) {
dev_err(dev, "%s: Could not attach AFU rc %d\n", __func__, rc); dev_err(dev, "%s: Could not attach AFU rc %d\n", __func__, rc);
...@@ -1532,24 +1532,24 @@ static int recover_context(struct cxlflash_cfg *cfg, struct ctx_info *ctxi) ...@@ -1532,24 +1532,24 @@ static int recover_context(struct cxlflash_cfg *cfg, struct ctx_info *ctxi)
goto out; goto out;
} }
rc = cxl_start_work(ctx, &ctxi->work);
if (unlikely(rc)) {
dev_dbg(dev, "%s: Could not start context rc=%d\n",
__func__, rc);
goto err1;
}
ctxid = cxl_process_element(ctx); ctxid = cxl_process_element(ctx);
if (unlikely((ctxid >= MAX_CONTEXT) || (ctxid < 0))) { if (unlikely((ctxid >= MAX_CONTEXT) || (ctxid < 0))) {
dev_err(dev, "%s: ctxid (%d) invalid!\n", __func__, ctxid); dev_err(dev, "%s: ctxid (%d) invalid!\n", __func__, ctxid);
rc = -EPERM; rc = -EPERM;
goto err1; goto err2;
} }
file = cxl_get_fd(ctx, &cfg->cxl_fops, &fd); file = cxl_get_fd(ctx, &cfg->cxl_fops, &fd);
if (unlikely(fd < 0)) { if (unlikely(fd < 0)) {
rc = -ENODEV; rc = -ENODEV;
dev_err(dev, "%s: Could not get file descriptor\n", __func__); dev_err(dev, "%s: Could not get file descriptor\n", __func__);
goto err1;
}
rc = cxl_start_work(ctx, &ctxi->work);
if (unlikely(rc)) {
dev_dbg(dev, "%s: Could not start context rc=%d\n",
__func__, rc);
goto err2; goto err2;
} }
...@@ -1594,10 +1594,10 @@ static int recover_context(struct cxlflash_cfg *cfg, struct ctx_info *ctxi) ...@@ -1594,10 +1594,10 @@ static int recover_context(struct cxlflash_cfg *cfg, struct ctx_info *ctxi)
return rc; return rc;
err3: err3:
cxl_stop_context(ctx);
err2:
fput(file); fput(file);
put_unused_fd(fd); put_unused_fd(fd);
err2:
cxl_stop_context(ctx);
err1: err1:
cxl_release_context(ctx); cxl_release_context(ctx);
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment