Message ID | 20220916001038.11147-1-ansuelsmth@gmail.com |
---|---|
State | New |
Headers | show |
Series | mtd: nand: raw: qcom_nandc: handle error pointer from adm prep_slave_sg | expand |
On Fri, Sep 16, 2022, at 2:10 AM, Christian Marangi wrote: > ADM dma engine has changed to also provide error pointer instaed of > plain NULL pointer on invalid configuration of prep_slave_sg function. > Currently this is not handled and an error pointer is detected as a > valid dma_desc. This cause kernel panic as the driver doesn't fail > with an invalid dma engine configuration. > > Correctly handle this case by checking if dma_desc is NULL or IS_ERR. Using IS_ERR_OR_NULL() is almost never a correct solution. I think in this case the problem is the adm_prep_slave_sg() function that returns an invalid error code. While error pointers are often better than NULL pointers for passing information to the caller, a driver can't just change the calling conventions on its own. If we want to change the dmaengine_prep_slave_sg() API, I would suggest coming up with a new name for a replacement interface that uses error pointers instead of NULL first, and then changing all callers to the new interface. Arnd
On Fri, Sep 16, 2022, at 5:11 AM, Christian Marangi wrote: > On Fri, Sep 16, 2022 at 11:01:11AM +0200, Arnd Bergmann wrote: > > Thanks for the review and the clarification! > (Also extra point the fixes tag will match the driver) Regarding the fixes tag, how did you actually get to my patch? While it's possible that it caused the regression, it did not introduce the ERR_PTR() usage that was already there in 5c9f8c2dbdbe ("dmaengine: qcom: Add ADM driver"). Maybe there is another bug that needs to be addressed in this driver? Arnd
diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c index 8f80019a9f01..d7eac196dde0 100644 --- a/drivers/mtd/nand/raw/qcom_nandc.c +++ b/drivers/mtd/nand/raw/qcom_nandc.c @@ -1054,7 +1054,7 @@ static int prep_adm_dma_desc(struct qcom_nand_controller *nandc, bool read, } dma_desc = dmaengine_prep_slave_sg(nandc->chan, sgl, 1, dir_eng, 0); - if (!dma_desc) { + if (IS_ERR_OR_NULL(dma_desc)) { dev_err(nandc->dev, "failed to prepare desc\n"); ret = -EINVAL; goto err;
ADM dma engine has changed to also provide error pointer instaed of plain NULL pointer on invalid configuration of prep_slave_sg function. Currently this is not handled and an error pointer is detected as a valid dma_desc. This cause kernel panic as the driver doesn't fail with an invalid dma engine configuration. Correctly handle this case by checking if dma_desc is NULL or IS_ERR. Fixes: 03de6b273805 ("dmaengine: qcom-adm: stop abusing slave_id config") Signed-off-by: Christian Marangi <ansuelsmth@gmail.com> Cc: stable@vger.kernel.org # v5.17+ --- drivers/mtd/nand/raw/qcom_nandc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)