All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] nommu: add page_align to mmap
@ 2011-05-06  6:03 Bob Liu
  2011-06-03  6:37 ` Greg Ungerer
  0 siblings, 1 reply; 11+ messages in thread
From: Bob Liu @ 2011-05-06  6:03 UTC (permalink / raw)
  To: akpm
  Cc: linux-mm, gerg, dhowells, lethal, gerg, walken, daniel-gl,
	vapier, geert, uclinux-dist-devel, Bob Liu

Currently on nommu arch mmap(),mremap() and munmap() doesn't do page_align()
which isn't consist with mmu arch and cause some issues.

First, some drivers' mmap() function depends on vma->vm_end - vma->start is
page aligned which is true on mmu arch but not on nommu. eg: uvc camera driver.

Second munmap() may return -EINVAL[split file] error in cases when end is not
page aligned(passed into from userspace) but vma->vm_end is aligned dure to
split or driver's mmap() ops.

This patch add page align to fix those issues.

Changelog v1->v2:
- added more commit message

Signed-off-by: Bob Liu <lliubbo@gmail.com>
---
 mm/nommu.c |   24 ++++++++++++++----------
 1 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/mm/nommu.c b/mm/nommu.c
index c4c542c..3febfd9 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -1133,7 +1133,7 @@ static int do_mmap_private(struct vm_area_struct *vma,
 			   unsigned long capabilities)
 {
 	struct page *pages;
-	unsigned long total, point, n, rlen;
+	unsigned long total, point, n;
 	void *base;
 	int ret, order;
 
@@ -1157,13 +1157,12 @@ static int do_mmap_private(struct vm_area_struct *vma,
 		 * make a private copy of the data and map that instead */
 	}
 
-	rlen = PAGE_ALIGN(len);
 
 	/* allocate some memory to hold the mapping
 	 * - note that this may not return a page-aligned address if the object
 	 *   we're allocating is smaller than a page
 	 */
-	order = get_order(rlen);
+	order = get_order(len);
 	kdebug("alloc order %d for %lx", order, len);
 
 	pages = alloc_pages(GFP_KERNEL, order);
@@ -1173,7 +1172,7 @@ static int do_mmap_private(struct vm_area_struct *vma,
 	total = 1 << order;
 	atomic_long_add(total, &mmap_pages_allocated);
 
-	point = rlen >> PAGE_SHIFT;
+	point = len >> PAGE_SHIFT;
 
 	/* we allocated a power-of-2 sized page set, so we may want to trim off
 	 * the excess */
@@ -1195,7 +1194,7 @@ static int do_mmap_private(struct vm_area_struct *vma,
 	base = page_address(pages);
 	region->vm_flags = vma->vm_flags |= VM_MAPPED_COPY;
 	region->vm_start = (unsigned long) base;
-	region->vm_end   = region->vm_start + rlen;
+	region->vm_end   = region->vm_start + len;
 	region->vm_top   = region->vm_start + (total << PAGE_SHIFT);
 
 	vma->vm_start = region->vm_start;
@@ -1211,15 +1210,15 @@ static int do_mmap_private(struct vm_area_struct *vma,
 
 		old_fs = get_fs();
 		set_fs(KERNEL_DS);
-		ret = vma->vm_file->f_op->read(vma->vm_file, base, rlen, &fpos);
+		ret = vma->vm_file->f_op->read(vma->vm_file, base, len, &fpos);
 		set_fs(old_fs);
 
 		if (ret < 0)
 			goto error_free;
 
 		/* clear the last little bit */
-		if (ret < rlen)
-			memset(base + ret, 0, rlen - ret);
+		if (ret < len)
+			memset(base + ret, 0, len - ret);
 
 	}
 
@@ -1268,6 +1267,7 @@ unsigned long do_mmap_pgoff(struct file *file,
 
 	/* we ignore the address hint */
 	addr = 0;
+	len = PAGE_ALIGN(len);
 
 	/* we've determined that we can make the mapping, now translate what we
 	 * now know into VMA flags */
@@ -1645,14 +1645,16 @@ int do_munmap(struct mm_struct *mm, unsigned long start, size_t len)
 {
 	struct vm_area_struct *vma;
 	struct rb_node *rb;
-	unsigned long end = start + len;
+	unsigned long end;
 	int ret;
 
 	kenter(",%lx,%zx", start, len);
 
-	if (len == 0)
+	if ((len = PAGE_ALIGN(len)) == 0)
 		return -EINVAL;
 
+	end = start + len;
+
 	/* find the first potentially overlapping VMA */
 	vma = find_vma(mm, start);
 	if (!vma) {
@@ -1773,6 +1775,8 @@ unsigned long do_mremap(unsigned long addr,
 	struct vm_area_struct *vma;
 
 	/* insanity checks first */
+	old_len = PAGE_ALIGN(old_len);
+	new_len = PAGE_ALIGN(new_len);
 	if (old_len == 0 || new_len == 0)
 		return (unsigned long) -EINVAL;
 
-- 
1.6.3.3


--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH v2] nommu: add page_align to mmap
  2011-05-06  6:03 [PATCH v2] nommu: add page_align to mmap Bob Liu
@ 2011-06-03  6:37 ` Greg Ungerer
  2011-06-07  6:19   ` Bob Liu
  0 siblings, 1 reply; 11+ messages in thread
From: Greg Ungerer @ 2011-06-03  6:37 UTC (permalink / raw)
  To: Bob Liu
  Cc: akpm, linux-mm, dhowells, lethal, gerg, walken, daniel-gl,
	vapier, geert, uclinux-dist-devel

Hi Bob,

On 06/05/11 16:03, Bob Liu wrote:
> Currently on nommu arch mmap(),mremap() and munmap() doesn't do page_align()
> which isn't consist with mmu arch and cause some issues.
>
> First, some drivers' mmap() function depends on vma->vm_end - vma->start is
> page aligned which is true on mmu arch but not on nommu. eg: uvc camera driver.
>
> Second munmap() may return -EINVAL[split file] error in cases when end is not
> page aligned(passed into from userspace) but vma->vm_end is aligned dure to
> split or driver's mmap() ops.
>
> This patch add page align to fix those issues.

This is actually causing me problems on head at the moment.
git bisected to this patch as the cause.

When booting on a ColdFire (m68knommu) target the init process (or
there abouts at least) fails. Last console messages are:

   ...
   VFS: Mounted root (romfs filesystem) readonly on device 31:0.
   Freeing unused kernel memory: 52k freed (0x401aa000 - 0x401b6000)
   Unable to mmap process text, errno 22

I haven't really debugged it any further yet. But that error message
comes from fs/binfmt_flat.c, it is reporting a failed do_mmap() call.

Reverting that this patch and no more problem.

Regards
Greg



> Changelog v1->v2:
> - added more commit message
>
> Signed-off-by: Bob Liu<lliubbo@gmail.com>
> ---
>   mm/nommu.c |   24 ++++++++++++++----------
>   1 files changed, 14 insertions(+), 10 deletions(-)
>
> diff --git a/mm/nommu.c b/mm/nommu.c
> index c4c542c..3febfd9 100644
> --- a/mm/nommu.c
> +++ b/mm/nommu.c
> @@ -1133,7 +1133,7 @@ static int do_mmap_private(struct vm_area_struct *vma,
>   			   unsigned long capabilities)
>   {
>   	struct page *pages;
> -	unsigned long total, point, n, rlen;
> +	unsigned long total, point, n;
>   	void *base;
>   	int ret, order;
>
> @@ -1157,13 +1157,12 @@ static int do_mmap_private(struct vm_area_struct *vma,
>   		 * make a private copy of the data and map that instead */
>   	}
>
> -	rlen = PAGE_ALIGN(len);
>
>   	/* allocate some memory to hold the mapping
>   	 * - note that this may not return a page-aligned address if the object
>   	 *   we're allocating is smaller than a page
>   	 */
> -	order = get_order(rlen);
> +	order = get_order(len);
>   	kdebug("alloc order %d for %lx", order, len);
>
>   	pages = alloc_pages(GFP_KERNEL, order);
> @@ -1173,7 +1172,7 @@ static int do_mmap_private(struct vm_area_struct *vma,
>   	total = 1<<  order;
>   	atomic_long_add(total,&mmap_pages_allocated);
>
> -	point = rlen>>  PAGE_SHIFT;
> +	point = len>>  PAGE_SHIFT;
>
>   	/* we allocated a power-of-2 sized page set, so we may want to trim off
>   	 * the excess */
> @@ -1195,7 +1194,7 @@ static int do_mmap_private(struct vm_area_struct *vma,
>   	base = page_address(pages);
>   	region->vm_flags = vma->vm_flags |= VM_MAPPED_COPY;
>   	region->vm_start = (unsigned long) base;
> -	region->vm_end   = region->vm_start + rlen;
> +	region->vm_end   = region->vm_start + len;
>   	region->vm_top   = region->vm_start + (total<<  PAGE_SHIFT);
>
>   	vma->vm_start = region->vm_start;
> @@ -1211,15 +1210,15 @@ static int do_mmap_private(struct vm_area_struct *vma,
>
>   		old_fs = get_fs();
>   		set_fs(KERNEL_DS);
> -		ret = vma->vm_file->f_op->read(vma->vm_file, base, rlen,&fpos);
> +		ret = vma->vm_file->f_op->read(vma->vm_file, base, len,&fpos);
>   		set_fs(old_fs);
>
>   		if (ret<  0)
>   			goto error_free;
>
>   		/* clear the last little bit */
> -		if (ret<  rlen)
> -			memset(base + ret, 0, rlen - ret);
> +		if (ret<  len)
> +			memset(base + ret, 0, len - ret);
>
>   	}
>
> @@ -1268,6 +1267,7 @@ unsigned long do_mmap_pgoff(struct file *file,
>
>   	/* we ignore the address hint */
>   	addr = 0;
> +	len = PAGE_ALIGN(len);
>
>   	/* we've determined that we can make the mapping, now translate what we
>   	 * now know into VMA flags */
> @@ -1645,14 +1645,16 @@ int do_munmap(struct mm_struct *mm, unsigned long start, size_t len)
>   {
>   	struct vm_area_struct *vma;
>   	struct rb_node *rb;
> -	unsigned long end = start + len;
> +	unsigned long end;
>   	int ret;
>
>   	kenter(",%lx,%zx", start, len);
>
> -	if (len == 0)
> +	if ((len = PAGE_ALIGN(len)) == 0)
>   		return -EINVAL;
>
> +	end = start + len;
> +
>   	/* find the first potentially overlapping VMA */
>   	vma = find_vma(mm, start);
>   	if (!vma) {
> @@ -1773,6 +1775,8 @@ unsigned long do_mremap(unsigned long addr,
>   	struct vm_area_struct *vma;
>
>   	/* insanity checks first */
> +	old_len = PAGE_ALIGN(old_len);
> +	new_len = PAGE_ALIGN(new_len);
>   	if (old_len == 0 || new_len == 0)
>   		return (unsigned long) -EINVAL;
>


-- 
------------------------------------------------------------------------
Greg Ungerer  --  Principal Engineer        EMAIL:     gerg@snapgear.com
SnapGear Group, McAfee                      PHONE:       +61 7 3435 2888
8 Gardner Close                             FAX:         +61 7 3217 5323
Milton, QLD, 4064, Australia                WEB: http://www.SnapGear.com

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2] nommu: add page_align to mmap
  2011-06-03  6:37 ` Greg Ungerer
@ 2011-06-07  6:19   ` Bob Liu
  2011-06-08  4:47     ` Greg Ungerer
  0 siblings, 1 reply; 11+ messages in thread
From: Bob Liu @ 2011-06-07  6:19 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: akpm, linux-mm, dhowells, lethal, gerg, walken, daniel-gl,
	vapier, geert, uclinux-dist-devel

On Fri, Jun 3, 2011 at 2:37 PM, Greg Ungerer <gerg@snapgear.com> wrote:
> Hi Bob,
>
> On 06/05/11 16:03, Bob Liu wrote:
>>
>> Currently on nommu arch mmap(),mremap() and munmap() doesn't do
>> page_align()
>> which isn't consist with mmu arch and cause some issues.
>>
>> First, some drivers' mmap() function depends on vma->vm_end - vma->start
>> is
>> page aligned which is true on mmu arch but not on nommu. eg: uvc camera
>> driver.
>>
>> Second munmap() may return -EINVAL[split file] error in cases when end is
>> not
>> page aligned(passed into from userspace) but vma->vm_end is aligned dure
>> to
>> split or driver's mmap() ops.
>>
>> This patch add page align to fix those issues.
>
> This is actually causing me problems on head at the moment.
> git bisected to this patch as the cause.
>
> When booting on a ColdFire (m68knommu) target the init process (or
> there abouts at least) fails. Last console messages are:
>
>  ...
>  VFS: Mounted root (romfs filesystem) readonly on device 31:0.
>  Freeing unused kernel memory: 52k freed (0x401aa000 - 0x401b6000)
>  Unable to mmap process text, errno 22
>

Oh, bad news. I will try to reproduce it on my board.
If you are free please enable debug in nommu.c and then we can see what
caused the problem.

Thanks!

> I haven't really debugged it any further yet. But that error message
> comes from fs/binfmt_flat.c, it is reporting a failed do_mmap() call.
>
> Reverting that this patch and no more problem.
>
> Regards
> Greg
>
>
>
>> Changelog v1->v2:
>> - added more commit message
>>
>> Signed-off-by: Bob Liu<lliubbo@gmail.com>
>> ---
>>  mm/nommu.c |   24 ++++++++++++++----------
>>  1 files changed, 14 insertions(+), 10 deletions(-)
>>
>> diff --git a/mm/nommu.c b/mm/nommu.c
>> index c4c542c..3febfd9 100644
>> --- a/mm/nommu.c
>> +++ b/mm/nommu.c
>> @@ -1133,7 +1133,7 @@ static int do_mmap_private(struct vm_area_struct
>> *vma,
>>                           unsigned long capabilities)
>>  {
>>        struct page *pages;
>> -       unsigned long total, point, n, rlen;
>> +       unsigned long total, point, n;
>>        void *base;
>>        int ret, order;
>>
>> @@ -1157,13 +1157,12 @@ static int do_mmap_private(struct vm_area_struct
>> *vma,
>>                 * make a private copy of the data and map that instead */
>>        }
>>
>> -       rlen = PAGE_ALIGN(len);
>>
>>        /* allocate some memory to hold the mapping
>>         * - note that this may not return a page-aligned address if the
>> object
>>         *   we're allocating is smaller than a page
>>         */
>> -       order = get_order(rlen);
>> +       order = get_order(len);
>>        kdebug("alloc order %d for %lx", order, len);
>>
>>        pages = alloc_pages(GFP_KERNEL, order);
>> @@ -1173,7 +1172,7 @@ static int do_mmap_private(struct vm_area_struct
>> *vma,
>>        total = 1<<  order;
>>        atomic_long_add(total,&mmap_pages_allocated);
>>
>> -       point = rlen>>  PAGE_SHIFT;
>> +       point = len>>  PAGE_SHIFT;
>>
>>        /* we allocated a power-of-2 sized page set, so we may want to trim
>> off
>>         * the excess */
>> @@ -1195,7 +1194,7 @@ static int do_mmap_private(struct vm_area_struct
>> *vma,
>>        base = page_address(pages);
>>        region->vm_flags = vma->vm_flags |= VM_MAPPED_COPY;
>>        region->vm_start = (unsigned long) base;
>> -       region->vm_end   = region->vm_start + rlen;
>> +       region->vm_end   = region->vm_start + len;
>>        region->vm_top   = region->vm_start + (total<<  PAGE_SHIFT);
>>
>>        vma->vm_start = region->vm_start;
>> @@ -1211,15 +1210,15 @@ static int do_mmap_private(struct vm_area_struct
>> *vma,
>>
>>                old_fs = get_fs();
>>                set_fs(KERNEL_DS);
>> -               ret = vma->vm_file->f_op->read(vma->vm_file, base,
>> rlen,&fpos);
>> +               ret = vma->vm_file->f_op->read(vma->vm_file, base,
>> len,&fpos);
>>                set_fs(old_fs);
>>
>>                if (ret<  0)
>>                        goto error_free;
>>
>>                /* clear the last little bit */
>> -               if (ret<  rlen)
>> -                       memset(base + ret, 0, rlen - ret);
>> +               if (ret<  len)
>> +                       memset(base + ret, 0, len - ret);
>>
>>        }
>>
>> @@ -1268,6 +1267,7 @@ unsigned long do_mmap_pgoff(struct file *file,
>>
>>        /* we ignore the address hint */
>>        addr = 0;
>> +       len = PAGE_ALIGN(len);
>>
>>        /* we've determined that we can make the mapping, now translate
>> what we
>>         * now know into VMA flags */
>> @@ -1645,14 +1645,16 @@ int do_munmap(struct mm_struct *mm, unsigned long
>> start, size_t len)
>>  {
>>        struct vm_area_struct *vma;
>>        struct rb_node *rb;
>> -       unsigned long end = start + len;
>> +       unsigned long end;
>>        int ret;
>>
>>        kenter(",%lx,%zx", start, len);
>>
>> -       if (len == 0)
>> +       if ((len = PAGE_ALIGN(len)) == 0)
>>                return -EINVAL;
>>
>> +       end = start + len;
>> +
>>        /* find the first potentially overlapping VMA */
>>        vma = find_vma(mm, start);
>>        if (!vma) {
>> @@ -1773,6 +1775,8 @@ unsigned long do_mremap(unsigned long addr,
>>        struct vm_area_struct *vma;
>>
>>        /* insanity checks first */
>> +       old_len = PAGE_ALIGN(old_len);
>> +       new_len = PAGE_ALIGN(new_len);
>>        if (old_len == 0 || new_len == 0)
>>                return (unsigned long) -EINVAL;
>>
>
>
> --
> ------------------------------------------------------------------------
> Greg Ungerer  --  Principal Engineer        EMAIL:     gerg@snapgear.com
> SnapGear Group, McAfee                      PHONE:       +61 7 3435 2888
> 8 Gardner Close                             FAX:         +61 7 3217 5323
> Milton, QLD, 4064, Australia                WEB: http://www.SnapGear.com
>

-- 
Regards,
--Bob

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2] nommu: add page_align to mmap
  2011-06-07  6:19   ` Bob Liu
@ 2011-06-08  4:47     ` Greg Ungerer
  2011-06-08  7:18       ` Bob Liu
  0 siblings, 1 reply; 11+ messages in thread
From: Greg Ungerer @ 2011-06-08  4:47 UTC (permalink / raw)
  To: Bob Liu
  Cc: akpm, linux-mm, dhowells, lethal, gerg, walken, daniel-gl,
	vapier, geert, uclinux-dist-devel

Hi Bob,

On 07/06/11 16:19, Bob Liu wrote:
> On Fri, Jun 3, 2011 at 2:37 PM, Greg Ungerer<gerg@snapgear.com>  wrote:
>> Hi Bob,
>>
>> On 06/05/11 16:03, Bob Liu wrote:
>>>
>>> Currently on nommu arch mmap(),mremap() and munmap() doesn't do
>>> page_align()
>>> which isn't consist with mmu arch and cause some issues.
>>>
>>> First, some drivers' mmap() function depends on vma->vm_end - vma->start
>>> is
>>> page aligned which is true on mmu arch but not on nommu. eg: uvc camera
>>> driver.
>>>
>>> Second munmap() may return -EINVAL[split file] error in cases when end is
>>> not
>>> page aligned(passed into from userspace) but vma->vm_end is aligned dure
>>> to
>>> split or driver's mmap() ops.
>>>
>>> This patch add page align to fix those issues.
>>
>> This is actually causing me problems on head at the moment.
>> git bisected to this patch as the cause.
>>
>> When booting on a ColdFire (m68knommu) target the init process (or
>> there abouts at least) fails. Last console messages are:
>>
>> á...
>> áVFS: Mounted root (romfs filesystem) readonly on device 31:0.
>> áFreeing unused kernel memory: 52k freed (0x401aa000 - 0x401b6000)
>> áUnable to mmap process text, errno 22
>>
>
> Oh, bad news. I will try to reproduce it on my board.
> If you are free please enable debug in nommu.c and then we can see what
> caused the problem.

Yep, with debug on:

   ...
   VFS: Mounted root (romfs filesystem) readonly on device 31:0.
   Freeing unused kernel memory: 52k freed (0x4018c000 - 0x40198000)
   ==> do_mmap_pgoff(,0,6780,5,1002,0)
   <== do_mmap_pgoff() = -22
   Unable to mmap process text, errno 22

I can confirm that the PAGE_ALIGN(len) change in do_mmap_pgoff()
is enough to cause this too.

Regards
Greg




>> I haven't really debugged it any further yet. But that error message
>> comes from fs/binfmt_flat.c, it is reporting a failed do_mmap() call.
>>
>> Reverting that this patch and no more problem.
>>
>> Regards
>> Greg
>>

------------------------------------------------------------------------
Greg Ungerer  --  Principal Engineer        EMAIL:     gerg@snapgear.com
SnapGear Group, McAfee                      PHONE:       +61 7 3435 2888
8 Gardner Close                             FAX:         +61 7 3217 5323
Milton, QLD, 4064, Australia                WEB: http://www.SnapGear.com

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2] nommu: add page_align to mmap
  2011-06-08  4:47     ` Greg Ungerer
@ 2011-06-08  7:18       ` Bob Liu
  2011-06-08 10:19         ` Greg Ungerer
  0 siblings, 1 reply; 11+ messages in thread
From: Bob Liu @ 2011-06-08  7:18 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: akpm, linux-mm, dhowells, lethal, gerg, walken, daniel-gl,
	vapier, geert, uclinux-dist-devel

Hi, Greg

On Wed, Jun 8, 2011 at 12:47 PM, Greg Ungerer <gerg@snapgear.com> wrote:
> Hi Bob,
>
> On 07/06/11 16:19, Bob Liu wrote:
>>
>> On Fri, Jun 3, 2011 at 2:37 PM, Greg Ungerer<gerg@snapgear.com>  wrote:
>>>
>>> Hi Bob,
>>>
>>> On 06/05/11 16:03, Bob Liu wrote:
>>>>
>>>> Currently on nommu arch mmap(),mremap() and munmap() doesn't do
>>>> page_align()
>>>> which isn't consist with mmu arch and cause some issues.
>>>>
>>>> First, some drivers' mmap() function depends on vma->vm_end - vma->start
>>>> is
>>>> page aligned which is true on mmu arch but not on nommu. eg: uvc camera
>>>> driver.
>>>>
>>>> Second munmap() may return -EINVAL[split file] error in cases when end
>>>> is
>>>> not
>>>> page aligned(passed into from userspace) but vma->vm_end is aligned dure
>>>> to
>>>> split or driver's mmap() ops.
>>>>
>>>> This patch add page align to fix those issues.
>>>
>>> This is actually causing me problems on head at the moment.
>>> git bisected to this patch as the cause.
>>>
>>> When booting on a ColdFire (m68knommu) target the init process (or
>>> there abouts at least) fails. Last console messages are:
>>>
>>> á...
>>> áVFS: Mounted root (romfs filesystem) readonly on device 31:0.
>>> áFreeing unused kernel memory: 52k freed (0x401aa000 - 0x401b6000)
>>> áUnable to mmap process text, errno 22
>>>
>>
>> Oh, bad news. I will try to reproduce it on my board.
>> If you are free please enable debug in nommu.c and then we can see what
>> caused the problem.
>
> Yep, with debug on:
>
>  ...
>  VFS: Mounted root (romfs filesystem) readonly on device 31:0.
>  Freeing unused kernel memory: 52k freed (0x4018c000 - 0x40198000)
>  ==> do_mmap_pgoff(,0,6780,5,1002,0)
>  <== do_mmap_pgoff() = -22
>  Unable to mmap process text, errno 22
>

Since I can't reproduce this problem, could you please attach the
whole dmesg log with nommu debug on or
you can step into to see why errno 22 is returned, is it returned by
do_mmap_private()?

Thanks!

> I can confirm that the PAGE_ALIGN(len) change in do_mmap_pgoff()
> is enough to cause this too.
>
> Regards
> Greg
>
>
>
>
>>> I haven't really debugged it any further yet. But that error message
>>> comes from fs/binfmt_flat.c, it is reporting a failed do_mmap() call.
>>>
>>> Reverting that this patch and no more problem.
>>>
>>> Regards
>>> Greg
>>>
>
> ------------------------------------------------------------------------
> Greg Ungerer  --  Principal Engineer        EMAIL:     gerg@snapgear.com
> SnapGear Group, McAfee                      PHONE:       +61 7 3435 2888
> 8 Gardner Close                             FAX:         +61 7 3217 5323
> Milton, QLD, 4064, Australia                WEB: http://www.SnapGear.com
>

-- 
Regards,
--Bob

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2] nommu: add page_align to mmap
  2011-06-08  7:18       ` Bob Liu
@ 2011-06-08 10:19         ` Greg Ungerer
  2011-06-09 10:30           ` Bob Liu
  0 siblings, 1 reply; 11+ messages in thread
From: Greg Ungerer @ 2011-06-08 10:19 UTC (permalink / raw)
  To: Bob Liu
  Cc: akpm, linux-mm, dhowells, lethal, gerg, walken, daniel-gl,
	vapier, geert, uclinux-dist-devel


Hi Bob,

On 08/06/11 17:18, Bob Liu wrote:
> Hi, Greg
>
> On Wed, Jun 8, 2011 at 12:47 PM, Greg Ungerer<gerg@snapgear.com>  wrote:
>> Hi Bob,
>>
>> On 07/06/11 16:19, Bob Liu wrote:
>>>
>>> On Fri, Jun 3, 2011 at 2:37 PM, Greg Ungerer<gerg@snapgear.com>  áwrote:
>>>>
>>>> Hi Bob,
>>>>
>>>> On 06/05/11 16:03, Bob Liu wrote:
>>>>>
>>>>> Currently on nommu arch mmap(),mremap() and munmap() doesn't do
>>>>> page_align()
>>>>> which isn't consist with mmu arch and cause some issues.
>>>>>
>>>>> First, some drivers' mmap() function depends on vma->vm_end - vma->start
>>>>> is
>>>>> page aligned which is true on mmu arch but not on nommu. eg: uvc camera
>>>>> driver.
>>>>>
>>>>> Second munmap() may return -EINVAL[split file] error in cases when end
>>>>> is
>>>>> not
>>>>> page aligned(passed into from userspace) but vma->vm_end is aligned dure
>>>>> to
>>>>> split or driver's mmap() ops.
>>>>>
>>>>> This patch add page align to fix those issues.
>>>>
>>>> This is actually causing me problems on head at the moment.
>>>> git bisected to this patch as the cause.
>>>>
>>>> When booting on a ColdFire (m68knommu) target the init process (or
>>>> there abouts at least) fails. Last console messages are:
>>>>
>>>> á...
>>>> áVFS: Mounted root (romfs filesystem) readonly on device 31:0.
>>>> áFreeing unused kernel memory: 52k freed (0x401aa000 - 0x401b6000)
>>>> áUnable to mmap process text, errno 22
>>>>
>>>
>>> Oh, bad news. I will try to reproduce it on my board.
>>> If you are free please enable debug in nommu.c and then we can see what
>>> caused the problem.
>>
>> Yep, with debug on:
>>
>> á...
>> áVFS: Mounted root (romfs filesystem) readonly on device 31:0.
>> áFreeing unused kernel memory: 52k freed (0x4018c000 - 0x40198000)
>> á==>  do_mmap_pgoff(,0,6780,5,1002,0)
>> á<== do_mmap_pgoff() = -22
>> áUnable to mmap process text, errno 22
>>
>
> Since I can't reproduce this problem, could you please attach the
> whole dmesg log with nommu debug on or
> you can step into to see why errno 22 is returned, is it returned by
> do_mmap_private()?

There was no other debug messages with debug turned on in nommu.c.
(I can give you the boot msgs before this if you want, but there
was no nommu.c debug in it).

But I did trace it into do_mmap_pgoff() to see what was failing.
It fails based on the return value from:

           addr = file->f_op->get_unmapped_area(file, addr, len,
                                                       pgoff, flags);


Theres only one call of this inside do_mmap_pgoff() so you its
easy to find.

Regards
Greg



>> I can confirm that the PAGE_ALIGN(len) change in do_mmap_pgoff()
>> is enough to cause this too.
>>
>> Regards
>> Greg
>>
>>
>>
>>
>>>> I haven't really debugged it any further yet. But that error message
>>>> comes from fs/binfmt_flat.c, it is reporting a failed do_mmap() call.
>>>>
>>>> Reverting that this patch and no more problem.
>>>>
>>>> Regards
>>>> Greg
>>>>
>>
>> ------------------------------------------------------------------------
>> Greg Ungerer á-- áPrincipal Engineer á á á áEMAIL: á á gerg@snapgear.com
>> SnapGear Group, McAfee á á á á á á á á á á áPHONE: á á á +61 7 3435 2888
>> 8 Gardner Close á á á á á á á á á á á á á á FAX: á á á á +61 7 3217 5323
>> Milton, QLD, 4064, Australia á á á á á á á áWEB: http://www.SnapGear.com
>>
>

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2] nommu: add page_align to mmap
  2011-06-08 10:19         ` Greg Ungerer
@ 2011-06-09 10:30           ` Bob Liu
  2011-06-10  3:51             ` Greg Ungerer
  0 siblings, 1 reply; 11+ messages in thread
From: Bob Liu @ 2011-06-09 10:30 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: akpm, linux-mm, dhowells, lethal, gerg, walken, daniel-gl,
	vapier, geert, uclinux-dist-devel

On Wed, Jun 8, 2011 at 6:19 PM, Greg Ungerer <gerg@snapgear.com> wrote:
>
> Hi Bob,
>
> On 08/06/11 17:18, Bob Liu wrote:
>>
>> Hi, Greg
>>
>> On Wed, Jun 8, 2011 at 12:47 PM, Greg Ungerer<gerg@snapgear.com>  wrote:
>>>
>>> Hi Bob,
>>>
>>> On 07/06/11 16:19, Bob Liu wrote:
>>>>
>>>> On Fri, Jun 3, 2011 at 2:37 PM, Greg Ungerer<gerg@snapgear.com>
>>>>  Ã¡wrote:
>>>>>
>>>>> Hi Bob,
>>>>>
>>>>> On 06/05/11 16:03, Bob Liu wrote:
>>>>>>
>>>>>> Currently on nommu arch mmap(),mremap() and munmap() doesn't do
>>>>>> page_align()
>>>>>> which isn't consist with mmu arch and cause some issues.
>>>>>>
>>>>>> First, some drivers' mmap() function depends on vma->vm_end -
>>>>>> vma->start
>>>>>> is
>>>>>> page aligned which is true on mmu arch but not on nommu. eg: uvc
>>>>>> camera
>>>>>> driver.
>>>>>>
>>>>>> Second munmap() may return -EINVAL[split file] error in cases when end
>>>>>> is
>>>>>> not
>>>>>> page aligned(passed into from userspace) but vma->vm_end is aligned
>>>>>> dure
>>>>>> to
>>>>>> split or driver's mmap() ops.
>>>>>>
>>>>>> This patch add page align to fix those issues.
>>>>>
>>>>> This is actually causing me problems on head at the moment.
>>>>> git bisected to this patch as the cause.
>>>>>
>>>>> When booting on a ColdFire (m68knommu) target the init process (or
>>>>> there abouts at least) fails. Last console messages are:
>>>>>
>>>>> á...
>>>>> áVFS: Mounted root (romfs filesystem) readonly on device 31:0.
>>>>> áFreeing unused kernel memory: 52k freed (0x401aa000 - 0x401b6000)
>>>>> áUnable to mmap process text, errno 22
>>>>>
>>>>
>>>> Oh, bad news. I will try to reproduce it on my board.
>>>> If you are free please enable debug in nommu.c and then we can see what
>>>> caused the problem.
>>>
>>> Yep, with debug on:
>>>
>>> á...
>>> áVFS: Mounted root (romfs filesystem) readonly on device 31:0.
>>> áFreeing unused kernel memory: 52k freed (0x4018c000 - 0x40198000)
>>> á==>  do_mmap_pgoff(,0,6780,5,1002,0)
>>> á<== do_mmap_pgoff() = -22
>>> áUnable to mmap process text, errno 22
>>>
>>
>> Since I can't reproduce this problem, could you please attach the
>> whole dmesg log with nommu debug on or
>> you can step into to see why errno 22 is returned, is it returned by
>> do_mmap_private()?
>
> There was no other debug messages with debug turned on in nommu.c.
> (I can give you the boot msgs before this if you want, but there
> was no nommu.c debug in it).
>
> But I did trace it into do_mmap_pgoff() to see what was failing.
> It fails based on the return value from:
>
>          addr = file->f_op->get_unmapped_area(file, addr, len,
>                                                      pgoff, flags);
>

Thanks for this information.
But it's a callback function. I still can't know what's the problem maybe.
Would you do me a favor to do more trace to see where it callback to,
fs or some driver etc..?

>
> Theres only one call of this inside do_mmap_pgoff() so you its
> easy to find.
>
> Regards
> Greg
>
>
>
>>> I can confirm that the PAGE_ALIGN(len) change in do_mmap_pgoff()
>>> is enough to cause this too.
>>>
>>> Regards
>>> Greg
>>>
>>>
>>>
>>>
>>>>> I haven't really debugged it any further yet. But that error message
>>>>> comes from fs/binfmt_flat.c, it is reporting a failed do_mmap() call.
>>>>>
>>>>> Reverting that this patch and no more problem.
>>>>>
>>>>> Regards
>>>>> Greg
>>>>>

-- 
Regards,
--Bob

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2] nommu: add page_align to mmap
  2011-06-09 10:30           ` Bob Liu
@ 2011-06-10  3:51             ` Greg Ungerer
  2011-06-10  5:39               ` Bob Liu
  0 siblings, 1 reply; 11+ messages in thread
From: Greg Ungerer @ 2011-06-10  3:51 UTC (permalink / raw)
  To: Bob Liu
  Cc: akpm, linux-mm, dhowells, lethal, gerg, walken, daniel-gl,
	vapier, geert, uclinux-dist-devel

Hi Bob,

On 09/06/11 20:30, Bob Liu wrote:
> On Wed, Jun 8, 2011 at 6:19 PM, Greg Ungerer<gerg@snapgear.com>  wrote:
>>>>>> When booting on a ColdFire (m68knommu) target the init process (or
>>>>>> there abouts at least) fails. Last console messages are:
>>>>>>
>>>>>> ...
>>>>>> VFS: Mounted root (romfs filesystem) readonly on device 31:0.
>>>>>> Freeing unused kernel memory: 52k freed (0x401aa000 - 0x401b6000)
>>>>>> Unable to mmap process text, errno 22
>>>>>>
>>>>>
>>>>> Oh, bad news. I will try to reproduce it on my board.
>>>>> If you are free please enable debug in nommu.c and then we can see what
>>>>> caused the problem.
>>>>
>>>> Yep, with debug on:
>>>>
>>>> ­...
>>>> VFS: Mounted root (romfs filesystem) readonly on device 31:0.
>>>> Freeing unused kernel memory: 52k freed (0x4018c000 - 0x40198000)
>>>> ==>  ádo_mmap_pgoff(,0,6780,5,1002,0)
>>>> <== do_mmap_pgoff() = -22
>>>> Unable to mmap process text, errno 22
>>>>
>>>
>>> Since I can't reproduce this problem, could you please attach the
>>> whole dmesg log with nommu debug on or
>>> you can step into to see why errno 22 is returned, is it returned by
>>> do_mmap_private()?
>>
>> There was no other debug messages with debug turned on in nommu.c.
>> (I can give you the boot msgs before this if you want, but there
>> was no nommu.c debug in it).
>>
>> But I did trace it into do_mmap_pgoff() to see what was failing.
>> It fails based on the return value from:
>>
>> addr = file->f_op->get_unmapped_area(file, addr, len,
>>                                            ¡pgoff, flags);
>>
>
> Thanks for this information.
> But it's a callback function. I still can't know what's the problem maybe.
> Would you do me a favor to do more trace to see where it callback to,
> fs or some driver etc..?

Its calling to romfs_get_unmapped_area() [fs/romfs/mmap-nommu.c]. It is
being called with:

   romfs_get_unmapped_area(addr=0,len=7000,pgoff=0,flags=1002)

This is failing the first size check because isize comes back
as 0x6ca8, and this is smaller then len (0x7000). Thus returning
-EINVAL.

That code is trying to map the contents of the file /bin/init
directly from the romfs filesystem (which is in RAM). The init
binary is 0x6ca8 bytes in size (that is the isize above).

Regards
Greg


------------------------------------------------------------------------
Greg Ungerer  --  Principal Engineer        EMAIL:     gerg@snapgear.com
SnapGear Group, McAfee                      PHONE:       +61 7 3435 2888
8 Gardner Close                             FAX:         +61 7 3217 5323
Milton, QLD, 4064, Australia                WEB: http://www.SnapGear.com

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2] nommu: add page_align to mmap
  2011-06-10  3:51             ` Greg Ungerer
@ 2011-06-10  5:39               ` Bob Liu
  2011-06-10 12:24                 ` Greg Ungerer
  2011-06-14  1:32                 ` Greg Ungerer
  0 siblings, 2 replies; 11+ messages in thread
From: Bob Liu @ 2011-06-10  5:39 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: akpm, linux-mm, dhowells, lethal, gerg, walken, daniel-gl,
	vapier, geert, uclinux-dist-devel

Hi, Greg

On Fri, Jun 10, 2011 at 11:51 AM, Greg Ungerer <gerg@snapgear.com> wrote:
> Hi Bob,
>
> On 09/06/11 20:30, Bob Liu wrote:
>>
>> On Wed, Jun 8, 2011 at 6:19 PM, Greg Ungerer<gerg@snapgear.com>  wrote:
>>>>>>>
>>>>>>> When booting on a ColdFire (m68knommu) target the init process (or
>>>>>>> there abouts at least) fails. Last console messages are:
>>>>>>>
>>>>>>> ...
>>>>>>> VFS: Mounted root (romfs filesystem) readonly on device 31:0.
>>>>>>> Freeing unused kernel memory: 52k freed (0x401aa000 - 0x401b6000)
>>>>>>> Unable to mmap process text, errno 22
>>>>>>>
>>>>>>
>>>>>> Oh, bad news. I will try to reproduce it on my board.
>>>>>> If you are free please enable debug in nommu.c and then we can see
>>>>>> what
>>>>>> caused the problem.
>>>>>
>>>>> Yep, with debug on:
>>>>>
>>>>> ­...
>>>>> VFS: Mounted root (romfs filesystem) readonly on device 31:0.
>>>>> Freeing unused kernel memory: 52k freed (0x4018c000 - 0x40198000)
>>>>> ==>  Ã¡do_mmap_pgoff(,0,6780,5,1002,0)
>>>>> <== do_mmap_pgoff() = -22
>>>>> Unable to mmap process text, errno 22
>>>>>
>>>>
>>>> Since I can't reproduce this problem, could you please attach the
>>>> whole dmesg log with nommu debug on or
>>>> you can step into to see why errno 22 is returned, is it returned by
>>>> do_mmap_private()?
>>>
>>> There was no other debug messages with debug turned on in nommu.c.
>>> (I can give you the boot msgs before this if you want, but there
>>> was no nommu.c debug in it).
>>>
>>> But I did trace it into do_mmap_pgoff() to see what was failing.
>>> It fails based on the return value from:
>>>
>>> addr = file->f_op->get_unmapped_area(file, addr, len,
>>>                                           ¡pgoff, flags);
>>>
>>
>> Thanks for this information.
>> But it's a callback function. I still can't know what's the problem maybe.
>> Would you do me a favor to do more trace to see where it callback to,
>> fs or some driver etc..?
>
> Its calling to romfs_get_unmapped_area() [fs/romfs/mmap-nommu.c]. It is
> being called with:
>
>  romfs_get_unmapped_area(addr=0,len=7000,pgoff=0,flags=1002)
>
> This is failing the first size check because isize comes back
> as 0x6ca8, and this is smaller then len (0x7000). Thus returning
> -EINVAL.
>

I look into file fs/romfs/mmap-nommu.c based on your trace.
In my opinion, romfs_get_unmapped_area() in mmap-nommu.c is buggy.
Would you please try below commit.
Thanks a lot.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2] nommu: add page_align to mmap
  2011-06-10  5:39               ` Bob Liu
@ 2011-06-10 12:24                 ` Greg Ungerer
  2011-06-14  1:32                 ` Greg Ungerer
  1 sibling, 0 replies; 11+ messages in thread
From: Greg Ungerer @ 2011-06-10 12:24 UTC (permalink / raw)
  To: Bob Liu
  Cc: akpm, linux-mm, dhowells, lethal, gerg, walken, daniel-gl,
	vapier, geert, uclinux-dist-devel


Hi Bob,

On 06/10/2011 03:39 PM, Bob Liu wrote:
> Hi, Greg
>
> On Fri, Jun 10, 2011 at 11:51 AM, Greg Ungerer<gerg@snapgear.com>  wrote:
>> Hi Bob,
>>
>> On 09/06/11 20:30, Bob Liu wrote:
>>>
>>> On Wed, Jun 8, 2011 at 6:19 PM, Greg Ungerer<gerg@snapgear.com>  A!wrote:
>>>>>>>>
>>>>>>>> When booting on a ColdFire (m68knommu) target the init process (or
>>>>>>>> there abouts at least) fails. Last console messages are:
>>>>>>>>
>>>>>>>> ...
>>>>>>>> VFS: Mounted root (romfs filesystem) readonly on device 31:0.
>>>>>>>> Freeing unused kernel memory: 52k freed (0x401aa000 - 0x401b6000)
>>>>>>>> Unable to mmap process text, errno 22
>>>>>>>>
>>>>>>>
>>>>>>> Oh, bad news. I will try to reproduce it on my board.
>>>>>>> If you are free please enable debug in nommu.c and then we can see
>>>>>>> what
>>>>>>> caused the problem.
>>>>>>
>>>>>> Yep, with debug on:
>>>>>>
>>>>>> A!...
>>>>>> VFS: Mounted root (romfs filesystem) readonly on device 31:0.
>>>>>> Freeing unused kernel memory: 52k freed (0x4018c000 - 0x40198000)
>>>>>> ==>  A!a??A-do_mmap_pgoff(,0,6780,5,1002,0)
>>>>>> <== do_mmap_pgoff() = -22
>>>>>> Unable to mmap process text, errno 22
>>>>>>
>>>>>
>>>>> Since I can't reproduce this problem, could you please attach the
>>>>> whole dmesg log with nommu debug on or
>>>>> you can step into to see why errno 22 is returned, is it returned by
>>>>> do_mmap_private()?
>>>>
>>>> There was no other debug messages with debug turned on in nommu.c.
>>>> (I can give you the boot msgs before this if you want, but there
>>>> was no nommu.c debug in it).
>>>>
>>>> But I did trace it into do_mmap_pgoff() to see what was failing.
>>>> It fails based on the return value from:
>>>>
>>>> addr = file->f_op->get_unmapped_area(file, addr, len,
>>>>                                               pgoff, flags);
>>>>
>>>
>>> Thanks for this information.
>>> But it's a callback function. I still can't know what's the problem maybe.
>>> Would you do me a favor to do more trace to see where it callback to,
>>> fs or some driver etc..?
>>
>> Its calling to romfs_get_unmapped_area() [fs/romfs/mmap-nommu.c]. It is
>> being called with:
>>
>> A!romfs_get_unmapped_area(addr=0,len=7000,pgoff=0,flags=1002)
>>
>> This is failing the first size check because isize comes back
>> as 0x6ca8, and this is smaller then len (0x7000). Thus returning
>> -EINVAL.
>>
>
> I look into file fs/romfs/mmap-nommu.c based on your trace.
> In my opinion, romfs_get_unmapped_area() in mmap-nommu.c is buggy.
> Would you please try below commit.

Sure thing. I am away for the next couple of days, so I am
not going to be able to try it until Tuesday. I'll let you
know how it goes then.

Regards
Greg



> Thanks a lot.
>
> from 786add5286ffb476807cb198d7b2c5455e9fb533 Mon Sep 17 00:00:00 2001
> From: Bob Liu<lliubbo@gmail.com>
> Date: Fri, 10 Jun 2011 13:34:48 +0800
> Subject: [PATCH] romfs: fix romfs_get_unmapped_area() param check
>
> romfs_get_unmapped_area() check len param without considering PAGE_ALIGN which
> will cause do_mmap_pgoff() return -EINVAL error after commit f67d9b1576c.
>
> This patch fix the param check by changing it to the same way as function
> ramfs_nommu_get_unmapped_area() did in ramfs/file-nommu.c.
>
> Signed-off-by: Bob Liu<lliubbo@gmail.com>
> ---
>   fs/romfs/mmap-nommu.c |    8 ++++++--
>   1 files changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/fs/romfs/mmap-nommu.c b/fs/romfs/mmap-nommu.c
> index f0511e8..eed9942 100644
> --- a/fs/romfs/mmap-nommu.c
> +++ b/fs/romfs/mmap-nommu.c
> @@ -27,14 +27,18 @@ static unsigned long
> romfs_get_unmapped_area(struct file *file,
>   {
>          struct inode *inode = file->f_mapping->host;
>          struct mtd_info *mtd = inode->i_sb->s_mtd;
> -       unsigned long isize, offset;
> +       unsigned long isize, offset, maxpages, lpages;
>
>          if (!mtd)
>                  goto cant_map_directly;
>
> +       /* the mapping mustn't extend beyond the EOF */
> +       lpages = (len + PAGE_SIZE - 1)>>  PAGE_SHIFT;
>          isize = i_size_read(inode);
>          offset = pgoff<<  PAGE_SHIFT;
> -       if (offset>  isize || len>  isize || offset>  isize - len)
> +
> +       maxpages = (isize + PAGE_SIZE - 1)>>  PAGE_SHIFT;
> +       if ((pgoff>= maxpages) || (maxpages - pgoff<  lpages))
>                  return (unsigned long) -EINVAL;
>
>          /* we need to call down to the MTD layer to do the actual mapping */
> --
> 1.6.3.3
>
>> That code is trying to map the contents of the file /bin/init
>> directly from the romfs filesystem (which is in RAM). The init
>> binary is 0x6ca8 bytes in size (that is the isize above).
>>
>


-- 
------------------------------------------------------------------------
Greg Ungerer  --  Principal Engineer        EMAIL:     gerg@snapgear.com
SnapGear Group, McAfee                      PHONE:       +61 7 3435 2888
8 Gardner Close,                            FAX:         +61 7 3891 3630
Milton, QLD, 4064, Australia                WEB: http://www.SnapGear.com

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2] nommu: add page_align to mmap
  2011-06-10  5:39               ` Bob Liu
  2011-06-10 12:24                 ` Greg Ungerer
@ 2011-06-14  1:32                 ` Greg Ungerer
  1 sibling, 0 replies; 11+ messages in thread
From: Greg Ungerer @ 2011-06-14  1:32 UTC (permalink / raw)
  To: Bob Liu
  Cc: akpm, linux-mm, dhowells, lethal, gerg, walken, daniel-gl,
	vapier, geert, uclinux-dist-devel

Hi Bob,

On 10/06/11 15:39, Bob Liu wrote:
> Hi, Greg
>
> On Fri, Jun 10, 2011 at 11:51 AM, Greg Ungerer<gerg@snapgear.com>  wrote:
>> Hi Bob,
>>
>> On 09/06/11 20:30, Bob Liu wrote:
>>>
>>> On Wed, Jun 8, 2011 at 6:19 PM, Greg Ungerer<gerg@snapgear.com>  áwrote:
>>>>>>>>
>>>>>>>> When booting on a ColdFire (m68knommu) target the init process (or
>>>>>>>> there abouts at least) fails. Last console messages are:
>>>>>>>>
>>>>>>>> ...
>>>>>>>> VFS: Mounted root (romfs filesystem) readonly on device 31:0.
>>>>>>>> Freeing unused kernel memory: 52k freed (0x401aa000 - 0x401b6000)
>>>>>>>> Unable to mmap process text, errno 22
>>>>>>>>
>>>>>>>
>>>>>>> Oh, bad news. I will try to reproduce it on my board.
>>>>>>> If you are free please enable debug in nommu.c and then we can see
>>>>>>> what
>>>>>>> caused the problem.
>>>>>>
>>>>>> Yep, with debug on:
>>>>>>
>>>>>> ¡...
>>>>>> VFS: Mounted root (romfs filesystem) readonly on device 31:0.
>>>>>> Freeing unused kernel memory: 52k freed (0x4018c000 - 0x40198000)
>>>>>> ==>  á├ído_mmap_pgoff(,0,6780,5,1002,0)
>>>>>> <== do_mmap_pgoff() = -22
>>>>>> Unable to mmap process text, errno 22
>>>>>>
>>>>>
>>>>> Since I can't reproduce this problem, could you please attach the
>>>>> whole dmesg log with nommu debug on or
>>>>> you can step into to see why errno 22 is returned, is it returned by
>>>>> do_mmap_private()?
>>>>
>>>> There was no other debug messages with debug turned on in nommu.c.
>>>> (I can give you the boot msgs before this if you want, but there
>>>> was no nommu.c debug in it).
>>>>
>>>> But I did trace it into do_mmap_pgoff() to see what was failing.
>>>> It fails based on the return value from:
>>>>
>>>> addr = file->f_op->get_unmapped_area(file, addr, len,
>>>> á á á á á á á á á á á á á á á á á á á á á ípgoff, flags);
>>>>
>>>
>>> Thanks for this information.
>>> But it's a callback function. I still can't know what's the problem maybe.
>>> Would you do me a favor to do more trace to see where it callback to,
>>> fs or some driver etc..?
>>
>> Its calling to romfs_get_unmapped_area() [fs/romfs/mmap-nommu.c]. It is
>> being called with:
>>
>> áromfs_get_unmapped_area(addr=0,len=7000,pgoff=0,flags=1002)
>>
>> This is failing the first size check because isize comes back
>> as 0x6ca8, and this is smaller then len (0x7000). Thus returning
>> -EINVAL.
>>
>
> I look into file fs/romfs/mmap-nommu.c based on your trace.
> In my opinion, romfs_get_unmapped_area() in mmap-nommu.c is buggy.
> Would you please try below commit.

Yep, this fixes it. I think David (Howells) originally made
those changes, not sure if he wants to add anything here.

Thanks
Greg



> Thanks a lot.
>
> from 786add5286ffb476807cb198d7b2c5455e9fb533 Mon Sep 17 00:00:00 2001
> From: Bob Liu<lliubbo@gmail.com>
> Date: Fri, 10 Jun 2011 13:34:48 +0800
> Subject: [PATCH] romfs: fix romfs_get_unmapped_area() param check
>
> romfs_get_unmapped_area() check len param without considering PAGE_ALIGN which
> will cause do_mmap_pgoff() return -EINVAL error after commit f67d9b1576c.
>
> This patch fix the param check by changing it to the same way as function
> ramfs_nommu_get_unmapped_area() did in ramfs/file-nommu.c.
>
> Signed-off-by: Bob Liu<lliubbo@gmail.com>
> ---
>   fs/romfs/mmap-nommu.c |    8 ++++++--
>   1 files changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/fs/romfs/mmap-nommu.c b/fs/romfs/mmap-nommu.c
> index f0511e8..eed9942 100644
> --- a/fs/romfs/mmap-nommu.c
> +++ b/fs/romfs/mmap-nommu.c
> @@ -27,14 +27,18 @@ static unsigned long
> romfs_get_unmapped_area(struct file *file,
>   {
>          struct inode *inode = file->f_mapping->host;
>          struct mtd_info *mtd = inode->i_sb->s_mtd;
> -       unsigned long isize, offset;
> +       unsigned long isize, offset, maxpages, lpages;
>
>          if (!mtd)
>                  goto cant_map_directly;
>
> +       /* the mapping mustn't extend beyond the EOF */
> +       lpages = (len + PAGE_SIZE - 1)>>  PAGE_SHIFT;
>          isize = i_size_read(inode);
>          offset = pgoff<<  PAGE_SHIFT;
> -       if (offset>  isize || len>  isize || offset>  isize - len)
> +
> +       maxpages = (isize + PAGE_SIZE - 1)>>  PAGE_SHIFT;
> +       if ((pgoff>= maxpages) || (maxpages - pgoff<  lpages))
>                  return (unsigned long) -EINVAL;
>
>          /* we need to call down to the MTD layer to do the actual mapping */
> --
> 1.6.3.3
>
>> That code is trying to map the contents of the file /bin/init
>> directly from the romfs filesystem (which is in RAM). The init
>> binary is 0x6ca8 bytes in size (that is the isize above).
>>
>


-- 
------------------------------------------------------------------------
Greg Ungerer  --  Principal Engineer        EMAIL:     gerg@snapgear.com
SnapGear Group, McAfee                      PHONE:       +61 7 3435 2888
8 Gardner Close                             FAX:         +61 7 3217 5323
Milton, QLD, 4064, Australia                WEB: http://www.SnapGear.com

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2011-06-14  1:32 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-05-06  6:03 [PATCH v2] nommu: add page_align to mmap Bob Liu
2011-06-03  6:37 ` Greg Ungerer
2011-06-07  6:19   ` Bob Liu
2011-06-08  4:47     ` Greg Ungerer
2011-06-08  7:18       ` Bob Liu
2011-06-08 10:19         ` Greg Ungerer
2011-06-09 10:30           ` Bob Liu
2011-06-10  3:51             ` Greg Ungerer
2011-06-10  5:39               ` Bob Liu
2011-06-10 12:24                 ` Greg Ungerer
2011-06-14  1:32                 ` Greg Ungerer

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.