All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ivajlo Dimitrov <ivo.g.dimitrov.75@gmail.com>
To: Steven Luo <steven@steven676.net>,
	?????? ???????? <ivo.g.dimitrov.75@gmail.com>
Cc: gregkh@linuxfoundation.org, nico@ngolde.de, fabs@goesec.de,
	omar.ramirez@copitl.com, pali.rohar@gmail.com, pavel@ucw.cz,
	linux-kernel@vger.kernel.org, devel@driverdev.osuosl.org,
	tony@atomide.com, felipe.contreras@gmail.com,
	Ivaylo Dimitrov <freemangordon@abv.bg>
Subject: Re: [PATCH] Staging: TIDSPBRIDGE: Use vm_iomap_memory for mmap-ing instead of remap_pfn_range
Date: Sun, 08 Dec 2013 15:01:17 +0200	[thread overview]
Message-ID: <52A46D9D.4020008@gmail.com> (raw)
In-Reply-To: <20131207234912.GA1245@steven676.net>


On 08.12.2013 01:49, Steven Luo wrote:
> This patch causes problems with DSP codecs on OMAP3 devices running
> Android -- specifically, when the decoder is cleaning up after itself,
> munmap() of the mapped area fails, leading to a memory leak which
> eventually crashes the system.
>
> As far as I can tell, the code with this patch applied reduces to
> (ignoring checks and such)
>
> remap_pfn_range(vma, vma->vm_start,
> 	(pdata->phys_mempool_base >> PAGE_SHIFT) + vma->vm_pgoff,
> 	vma->vm_end - vma->vm_start,
> 	vma->vm_page_prot);
>
> whereas the original was
>
>> -	status = remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
>> -				 vma->vm_end - vma->vm_start,
>> -				 vma->vm_page_prot);
> We're subtracting (pdata->phys_mempool_base >> PAGE_SHIFT) from
> vma->vm_pgoff before calling vm_iomap_memory() to address the issue --
> if that's satisfactory to everyone involved, I can submit the following
> patch.
>
> -Steven Luo
>
> (please cc, not subscribed)
>
> From: Steven Luo <steven@steven676.net>
> Date: Sat, 7 Dec 2013 02:11:20 -0800
> Subject: [PATCH] tidspbridge: fix last patch to map same region of physical
>   memory as before
>
> Commit 559c71fe5dc3 ("Staging: TIDSPBRIDGE: Use vm_iomap_memory for
> mmap-ing instead of remap_pfn_range") had the effect of inadvertently
> shifting the start of the physical memory area mapped by
> pdata->phys_mempool_base.  Correct this by subtracting that shift before
> calling vm_iomap_memory() and adding it back afterwards.
>
> Reported-by: Dheeraj CVR <cvr.dheeraj@gmail.com>
> Signed-off-by: Steven Luo <steven@steven676.net>
> ---
>   drivers/staging/tidspbridge/rmgr/drv_interface.c |   29 +++++++++++++++++++---
>   1 file changed, 26 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/staging/tidspbridge/rmgr/drv_interface.c b/drivers/staging/tidspbridge/rmgr/drv_interface.c
> index 83cc3a5..d7f7d04 100644
> --- a/drivers/staging/tidspbridge/rmgr/drv_interface.c
> +++ b/drivers/staging/tidspbridge/rmgr/drv_interface.c
> @@ -258,6 +258,9 @@ err:
>   /* This function maps kernel space memory to user space memory. */
>   static int bridge_mmap(struct file *filp, struct vm_area_struct *vma)
>   {
> +	unsigned long base_pgoff;
> +	int status;
> +
>   	struct omap_dsp_platform_data *pdata =
>   	    omap_dspbridge_dev->dev.platform_data;
>   	
> @@ -269,9 +272,29 @@ static int bridge_mmap(struct file *filp, struct vm_area_struct *vma)
>   		vma->vm_start, vma->vm_end, vma->vm_page_prot,
>   		vma->vm_flags);
>   
> -	return vm_iomap_memory(vma,
> -			       pdata->phys_mempool_base,
> -			       pdata->phys_mempool_size);
> +	/*
> +	 * vm_iomap_memory() expects vma->vm_pgoff to be expressed as an offset
> +	 * from the start of the physical memory pool, but we're called with
> +	 * a pfn (physical page number) stored there instead.
> +	 *
> +	 * To avoid duplicating lots of tricky overflow checking logic,
> +	 * temporarily convert vma->vm_pgoff to the offset vm_iomap_memory()
> +	 * expects, but restore the original value once the mapping has been
> +	 * created.
> +	 */
> +	base_pgoff = pdata->phys_mempool_base >> PAGE_SHIFT;
> +	if (vma->vm_pgoff < base_pgoff)
> +		return -EINVAL;
> +	vma->vm_pgoff -= base_pgoff;
> +
> +	status = vm_iomap_memory(vma,
> +				 pdata->phys_mempool_base,
> +				 pdata->phys_mempool_size);
> +
> +	/* Restore the original value of vma->vm_pgoff */
> +	vma->vm_pgoff += base_pgoff;
> +
> +	return status;
>   }
>   
>   static const struct file_operations bridge_fops = {
Tested on Nokia N900 with Maemo 5 and Harmattan codec nodes

  reply	other threads:[~2013-12-08 13:01 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-02 20:00 [PATCH] Staging: TIDSPBRIDGE: Use vm_iomap_memory for mmap-ing instead of remap_pfn_range Ivaylo DImitrov
2013-12-07 23:49 ` Steven Luo
2013-12-08 13:01   ` Ivajlo Dimitrov [this message]
2013-12-11  7:45   ` Ivajlo Dimitrov
2013-12-11  8:33     ` Dan Carpenter
2013-12-11  9:57       ` Ivaylo Dimitrov
2013-12-11 10:27         ` Dan Carpenter
2013-12-12  1:57           ` Greg KH
2013-12-11 20:51       ` [PATCH] Staging: TIDSPBRIDGE: Fix mmap to map the correct region of physical memory Ivaylo DImitrov

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=52A46D9D.4020008@gmail.com \
    --to=ivo.g.dimitrov.75@gmail.com \
    --cc=devel@driverdev.osuosl.org \
    --cc=fabs@goesec.de \
    --cc=felipe.contreras@gmail.com \
    --cc=freemangordon@abv.bg \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nico@ngolde.de \
    --cc=omar.ramirez@copitl.com \
    --cc=pali.rohar@gmail.com \
    --cc=pavel@ucw.cz \
    --cc=steven@steven676.net \
    --cc=tony@atomide.com \
    /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: link
Be 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.