Message ID | YCwaIGPd9ktMoYPu@mwanda |
---|---|
State | Accepted |
Headers | show |
Series | cxl/mem: Fix an error code in cxl_mem_mbox_get() | expand |
On Tue, Feb 16, 2021 at 11:17 AM Dan Carpenter <dan.carpenter@oracle.com> wrote: > > Smatch complains that sometimes when we return success we are holding > the mutex and sometimes we have released the mutex. It turns out that > the bug is a missing error code if the mbox is not ready. It should > return -EBUSY instead of success. > > Fixes: cc1967ac93ab ("cxl/mem: Find device capabilities") > Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> > --- > drivers/cxl/mem.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/cxl/mem.c b/drivers/cxl/mem.c > index 3bca8451348a..2ebc84e4d202 100644 > --- a/drivers/cxl/mem.c > +++ b/drivers/cxl/mem.c > @@ -383,8 +383,8 @@ static int __cxl_mem_mbox_send_cmd(struct cxl_mem *cxlm, > static int cxl_mem_mbox_get(struct cxl_mem *cxlm) > { > struct device *dev = &cxlm->pdev->dev; > - int rc = -EBUSY; > u64 md_status; > + int rc; > > mutex_lock_io(&cxlm->mbox_mutex); > > @@ -414,6 +414,7 @@ static int cxl_mem_mbox_get(struct cxl_mem *cxlm) > md_status = readq(cxlm->memdev_regs + CXLMDEV_STATUS_OFFSET); > if (!(md_status & CXLMDEV_MBOX_IF_READY && CXLMDEV_READY(md_status))) { > dev_err(dev, "mbox: reported doorbell ready, but not mbox ready\n"); > + rc = -EBUSY; > goto out; Hey, Smatch gave a more thorough report than Coverity: http://lore.kernel.org/r/20210215195313.90231-1-colin.king@canonical.com
diff --git a/drivers/cxl/mem.c b/drivers/cxl/mem.c index 3bca8451348a..2ebc84e4d202 100644 --- a/drivers/cxl/mem.c +++ b/drivers/cxl/mem.c @@ -383,8 +383,8 @@ static int __cxl_mem_mbox_send_cmd(struct cxl_mem *cxlm, static int cxl_mem_mbox_get(struct cxl_mem *cxlm) { struct device *dev = &cxlm->pdev->dev; - int rc = -EBUSY; u64 md_status; + int rc; mutex_lock_io(&cxlm->mbox_mutex); @@ -414,6 +414,7 @@ static int cxl_mem_mbox_get(struct cxl_mem *cxlm) md_status = readq(cxlm->memdev_regs + CXLMDEV_STATUS_OFFSET); if (!(md_status & CXLMDEV_MBOX_IF_READY && CXLMDEV_READY(md_status))) { dev_err(dev, "mbox: reported doorbell ready, but not mbox ready\n"); + rc = -EBUSY; goto out; }
Smatch complains that sometimes when we return success we are holding the mutex and sometimes we have released the mutex. It turns out that the bug is a missing error code if the mbox is not ready. It should return -EBUSY instead of success. Fixes: cc1967ac93ab ("cxl/mem: Find device capabilities") Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> --- drivers/cxl/mem.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)