From: Souptick Joarder <jrdr.linux@gmail.com> To: gregkh@linuxfoundation.org, jane.pnx9@gmail.com, daniel.m.jordan@oracle.com, simon@nikanor.nu, harshjain32@gmail.com, pakki001@umn.edu Cc: devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org, Souptick Joarder <jrdr.linux@gmail.com>, John Hubbard <jhubbard@nvidia.com>, Bharath Vedartham <linux.bhar@gmail.com>, Dan Carpenter <dan.carpenter@oracle.com> Subject: [PATCH v3 4/4] staging: kpc2000: kpc_dma: Remove additional goto statements Date: Wed, 1 Jul 2020 11:47:44 +0530 [thread overview] Message-ID: <1593584264-16982-5-git-send-email-jrdr.linux@gmail.com> (raw) In-Reply-To: <1593584264-16982-1-git-send-email-jrdr.linux@gmail.com> As 3 goto level referring to same common code, those can be accomodated with a single goto level and renameing it to unpin_pages. Set the -ERRNO when returning partial mapped pages in more appropriate place. When dma_map_sg() failed, the previously allocated memory was not freed properly. This is corrected now. Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com> Cc: John Hubbard <jhubbard@nvidia.com> Cc: Bharath Vedartham <linux.bhar@gmail.com> Cc: Dan Carpenter <dan.carpenter@oracle.com> --- drivers/staging/kpc2000/kpc_dma/fileops.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/drivers/staging/kpc2000/kpc_dma/fileops.c b/drivers/staging/kpc2000/kpc_dma/fileops.c index 8cd20ad..dd716edd 100644 --- a/drivers/staging/kpc2000/kpc_dma/fileops.c +++ b/drivers/staging/kpc2000/kpc_dma/fileops.c @@ -35,7 +35,7 @@ static int kpc_dma_transfer(struct dev_private_data *priv, unsigned long iov_base, size_t iov_len) { unsigned int i = 0; - int rv = 0; + int rv = 0, nr_pages = 0; struct kpc_dma_device *ldev; struct aio_cb_data *acd; DECLARE_COMPLETION_ONSTACK(done); @@ -79,22 +79,27 @@ static int kpc_dma_transfer(struct dev_private_data *priv, rv = pin_user_pages(iov_base, acd->page_count, FOLL_TOUCH | FOLL_WRITE, acd->user_pages, NULL); mmap_read_unlock(current->mm); /* release the semaphore */ if (rv != acd->page_count) { + nr_pages = rv; + if (rv > 0) + rv = -EFAULT; + dev_err(&priv->ldev->pldev->dev, "Couldn't pin_user_pages (%d)\n", rv); - goto err_get_user_pages; + goto unpin_pages; } + nr_pages = acd->page_count; // Allocate and setup the sg_table (scatterlist entries) rv = sg_alloc_table_from_pages(&acd->sgt, acd->user_pages, acd->page_count, iov_base & (PAGE_SIZE - 1), iov_len, GFP_KERNEL); if (rv) { dev_err(&priv->ldev->pldev->dev, "Couldn't alloc sg_table (%d)\n", rv); - goto err_alloc_sg_table; + goto unpin_pages; } // Setup the DMA mapping for all the sg entries acd->mapped_entry_count = dma_map_sg(&ldev->pldev->dev, acd->sgt.sgl, acd->sgt.nents, ldev->dir); if (acd->mapped_entry_count <= 0) { dev_err(&priv->ldev->pldev->dev, "Couldn't dma_map_sg (%d)\n", acd->mapped_entry_count); - goto err_dma_map_sg; + goto free_table; } // Calculate how many descriptors are actually needed for this transfer. @@ -186,16 +191,12 @@ static int kpc_dma_transfer(struct dev_private_data *priv, err_descr_too_many: unlock_engine(ldev); dma_unmap_sg(&ldev->pldev->dev, acd->sgt.sgl, acd->sgt.nents, ldev->dir); + free_table: sg_free_table(&acd->sgt); - err_dma_map_sg: - err_alloc_sg_table: - unpin_user_pages(acd->user_pages, acd->page_count); - err_get_user_pages: - if (rv > 0) { - unpin_user_pages(acd->user_pages, rv); - rv = -EFAULT; - } + unpin_pages: + if (nr_pages > 0) + unpin_user_pages(acd->user_pages, nr_pages); kfree(acd->user_pages); err_alloc_userpages: kfree(acd); -- 1.9.1
WARNING: multiple messages have this Message-ID (diff)
From: Souptick Joarder <jrdr.linux@gmail.com> To: gregkh@linuxfoundation.org, jane.pnx9@gmail.com, daniel.m.jordan@oracle.com, simon@nikanor.nu, harshjain32@gmail.com, pakki001@umn.edu Cc: devel@driverdev.osuosl.org, Bharath Vedartham <linux.bhar@gmail.com>, John Hubbard <jhubbard@nvidia.com>, linux-kernel@vger.kernel.org, Souptick Joarder <jrdr.linux@gmail.com>, Dan Carpenter <dan.carpenter@oracle.com> Subject: [PATCH v3 4/4] staging: kpc2000: kpc_dma: Remove additional goto statements Date: Wed, 1 Jul 2020 11:47:44 +0530 [thread overview] Message-ID: <1593584264-16982-5-git-send-email-jrdr.linux@gmail.com> (raw) In-Reply-To: <1593584264-16982-1-git-send-email-jrdr.linux@gmail.com> As 3 goto level referring to same common code, those can be accomodated with a single goto level and renameing it to unpin_pages. Set the -ERRNO when returning partial mapped pages in more appropriate place. When dma_map_sg() failed, the previously allocated memory was not freed properly. This is corrected now. Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com> Cc: John Hubbard <jhubbard@nvidia.com> Cc: Bharath Vedartham <linux.bhar@gmail.com> Cc: Dan Carpenter <dan.carpenter@oracle.com> --- drivers/staging/kpc2000/kpc_dma/fileops.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/drivers/staging/kpc2000/kpc_dma/fileops.c b/drivers/staging/kpc2000/kpc_dma/fileops.c index 8cd20ad..dd716edd 100644 --- a/drivers/staging/kpc2000/kpc_dma/fileops.c +++ b/drivers/staging/kpc2000/kpc_dma/fileops.c @@ -35,7 +35,7 @@ static int kpc_dma_transfer(struct dev_private_data *priv, unsigned long iov_base, size_t iov_len) { unsigned int i = 0; - int rv = 0; + int rv = 0, nr_pages = 0; struct kpc_dma_device *ldev; struct aio_cb_data *acd; DECLARE_COMPLETION_ONSTACK(done); @@ -79,22 +79,27 @@ static int kpc_dma_transfer(struct dev_private_data *priv, rv = pin_user_pages(iov_base, acd->page_count, FOLL_TOUCH | FOLL_WRITE, acd->user_pages, NULL); mmap_read_unlock(current->mm); /* release the semaphore */ if (rv != acd->page_count) { + nr_pages = rv; + if (rv > 0) + rv = -EFAULT; + dev_err(&priv->ldev->pldev->dev, "Couldn't pin_user_pages (%d)\n", rv); - goto err_get_user_pages; + goto unpin_pages; } + nr_pages = acd->page_count; // Allocate and setup the sg_table (scatterlist entries) rv = sg_alloc_table_from_pages(&acd->sgt, acd->user_pages, acd->page_count, iov_base & (PAGE_SIZE - 1), iov_len, GFP_KERNEL); if (rv) { dev_err(&priv->ldev->pldev->dev, "Couldn't alloc sg_table (%d)\n", rv); - goto err_alloc_sg_table; + goto unpin_pages; } // Setup the DMA mapping for all the sg entries acd->mapped_entry_count = dma_map_sg(&ldev->pldev->dev, acd->sgt.sgl, acd->sgt.nents, ldev->dir); if (acd->mapped_entry_count <= 0) { dev_err(&priv->ldev->pldev->dev, "Couldn't dma_map_sg (%d)\n", acd->mapped_entry_count); - goto err_dma_map_sg; + goto free_table; } // Calculate how many descriptors are actually needed for this transfer. @@ -186,16 +191,12 @@ static int kpc_dma_transfer(struct dev_private_data *priv, err_descr_too_many: unlock_engine(ldev); dma_unmap_sg(&ldev->pldev->dev, acd->sgt.sgl, acd->sgt.nents, ldev->dir); + free_table: sg_free_table(&acd->sgt); - err_dma_map_sg: - err_alloc_sg_table: - unpin_user_pages(acd->user_pages, acd->page_count); - err_get_user_pages: - if (rv > 0) { - unpin_user_pages(acd->user_pages, rv); - rv = -EFAULT; - } + unpin_pages: + if (nr_pages > 0) + unpin_user_pages(acd->user_pages, nr_pages); kfree(acd->user_pages); err_alloc_userpages: kfree(acd); -- 1.9.1 _______________________________________________ devel mailing list devel@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
next prev parent reply other threads:[~2020-07-01 6:10 UTC|newest] Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-07-01 6:17 [PATCH v3 0/4] staging: kpc2000: kpc_dma: Few clean up and Convert to pin_user_pages() Souptick Joarder 2020-07-01 6:17 ` Souptick Joarder 2020-07-01 6:17 ` [PATCH v3 1/4] staging: kpc2000: kpc_dma: Unpin partial pinned pages Souptick Joarder 2020-07-01 6:17 ` Souptick Joarder 2020-07-01 6:17 ` [PATCH v3 2/4] staging: kpc2000: kpc_dma: Convert set_page_dirty() --> set_page_dirty_lock() Souptick Joarder 2020-07-01 6:17 ` Souptick Joarder 2020-07-01 6:17 ` [PATCH v3 3/4] staging: kpc2000: kpc_dma: Convert get_user_pages() --> pin_user_pages() Souptick Joarder 2020-07-01 6:17 ` Souptick Joarder 2020-07-01 6:17 ` Souptick Joarder [this message] 2020-07-01 6:17 ` [PATCH v3 4/4] staging: kpc2000: kpc_dma: Remove additional goto statements Souptick Joarder
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1593584264-16982-5-git-send-email-jrdr.linux@gmail.com \ --to=jrdr.linux@gmail.com \ --cc=dan.carpenter@oracle.com \ --cc=daniel.m.jordan@oracle.com \ --cc=devel@driverdev.osuosl.org \ --cc=gregkh@linuxfoundation.org \ --cc=harshjain32@gmail.com \ --cc=jane.pnx9@gmail.com \ --cc=jhubbard@nvidia.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux.bhar@gmail.com \ --cc=pakki001@umn.edu \ --cc=simon@nikanor.nu \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.