mm: mincore: use PAGE_SIZE instead of PAGE_CACHE_SIZE
Subsystems (2)
RFC PATCH 1/1 mm: mincore: use PAGE_SIZE instead of PAGE_CACHE_SIZE
This is a RFC patch, because current PAGE_SIZE is equal to PAGE_CACHE_SIZE, there isn't any difference and issue when running.
However, the current code mixes these two aligned_size inconsistently, and if they are not equal in future mincore_unmapped_range() would check more file pages than wanted.
According to man-page, mincore uses PAGE_SIZE as its size unit, so this patch uses PAGE_SIZE instead of PAGE_CACHE_SIZE.
--- mm/mincore.c | 19 +++++++++++++------ 1 files changed, 13 insertions(+), 6 deletions(-)
mm/mincore.c +13 -6
@@ -102,11 +102,18 @@ static void mincore_unmapped_range(struct vm_area_struct *vma,int i;if (vma->vm_file) { -pgoff_t pgoff; +pgoff_t pgoff, pgoff_end; +int j, count; +unsigned char res; + count =1 << (PAGE_CACHE_SHIFT -PAGE_SHIFT ); pgoff =linear_page_index (vma, addr); -for (i =0 ; i < nr; i++, pgoff++) - vec[i] =mincore_page (vma->vm_file->f_mapping, pgoff); + pgoff_end =linear_page_index (vma, end); +for (i =0 ; pgoff < pgoff_end; pgoff++) { + res =mincore_page (vma->vm_file->f_mapping, pgoff); +for (j =0 ; j < count; j++) + vec[i++] = res; + } }else {for (i =0 ; i < nr; i++) vec[i] =0 ;
@@ -258,7 +265,7 @@ static long do_mincore(unsigned long addr, unsigned long pages, unsigned char *v* return values: * zero - success * -EFAULT - vec points to an illegal address -* -EINVAL - addr is not a multiple of PAGE_CACHE_SIZE +* -EINVAL - addr is not a multiple of PAGE_SIZE * -ENOMEM - Addresses in the range [addr, addr + len] are * invalid for the address space of this process, or * specify one or more pages which are not currently
@@ -273,14 +280,14 @@ SYSCALL_DEFINE3(mincore, unsigned long, start, size_t, len,unsigned char *tmp;/* Check the start address: needs to be page-aligned.. */ -if (start & ~PAGE_CACHE_MASK ) +if (start & ~PAGE_MASK )return -EINVAL ;/* ..and we need to be passed a valid user-space range */ if (!access_ok (VERIFY_READ , (void __user *) start, len))return -ENOMEM ; -/* This also avoids any overflows on PAGE_CACHE_ALIGN */ +/* This also avoids any overflows on PAGE_ALIGN */ pages = len >>PAGE_SHIFT ; pages += (len & ~PAGE_MASK ) !=0 ;
Signature · 8 lines
1.7.0.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
ping. Any comments?
Quoted 68 lines · Weijie Yang
This is a RFC patch, because current
PAGE_SIZEis equal toPAGE_CACHE_SIZE, there isn't any difference and issue when running.However, the current code mixes these two
aligned_sizeinconsistently, and if they are not equal in futuremincore_unmapped_range()would check more file pages than wanted.According to man-page, mincore uses
PAGE_SIZEas its size unit, so this patch usesPAGE_SIZEinstead ofPAGE_CACHE_SIZE.Signed-off-by Weijie Yang <[email protected]>--- mm/mincore.c | 19 +++++++++++++------ 1 files changed, 13 insertions(+), 6 deletions(-)mm/mincore.c +13
-7@@ -102,11 +102,18 @@ static void mincore_unmapped_range(struct vm_area_struct *vma,int i;if (vma->vm_file) { -pgoff_t pgoff; +pgoff_t pgoff, pgoff_end; +int j, count; +unsigned char res; + count =1 << (PAGE_CACHE_SHIFT -PAGE_SHIFT ); pgoff =linear_page_index (vma, addr); -for (i =0 ; i < nr; i++, pgoff++) - vec[i] =mincore_page (vma->vm_file->f_mapping, pgoff); + pgoff_end =linear_page_index (vma, end); +for (i =0 ; pgoff < pgoff_end; pgoff++) { + res =mincore_page (vma->vm_file->f_mapping, pgoff); +for (j =0 ; j < count; j++) + vec[i++] = res; + } }else {for (i =0 ; i < nr; i++) vec[i] =0 ;@@ -258,7 +265,7 @@ static long do_mincore(unsigned long addr, unsigned long pages, unsigned char *v* return values: * zero - success * -EFAULT - vec points to an illegal address -* -EINVAL - addr is not a multiple of PAGE_CACHE_SIZE +* -EINVAL - addr is not a multiple of PAGE_SIZE * -ENOMEM - Addresses in the range [addr, addr + len] are * invalid for the address space of this process, or * specify one or more pages which are not currently @@ -273,14 +280,14 @@ SYSCALL_DEFINE3(mincore, unsigned long, start, size_t, len,unsigned char *tmp;/* Check the start address: needs to be page-aligned.. */ -if (start & ~PAGE_CACHE_MASK ) +if (start & ~PAGE_MASK )return -EINVAL ;/* ..and we need to be passed a valid user-space range */ if (!access_ok (VERIFY_READ , (void __user *) start, len))return -ENOMEM ; -/* This also avoids any overflows on PAGE_CACHE_ALIGN */ +/* This also avoids any overflows on PAGE_ALIGN */ pages = len >>PAGE_SHIFT ; pages += (len & ~PAGE_MASK ) !=0 ; --
Quoted 3 lines
1.7.0.4
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>