projects
/
powerpc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge head 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/shaggy/jfs-2.6
[powerpc.git]
/
mm
/
memory.c
diff --git
a/mm/memory.c
b/mm/memory.c
index
c256175
..
6fe77ac
100644
(file)
--- a/
mm/memory.c
+++ b/
mm/memory.c
@@
-776,8
+776,8
@@
unsigned long zap_page_range(struct vm_area_struct *vma, unsigned long address,
* Do a quick page-table lookup for a single page.
* mm->page_table_lock must be held.
*/
* Do a quick page-table lookup for a single page.
* mm->page_table_lock must be held.
*/
-static struct page *
-
__follow_page(struct mm_struct *mm, unsigned long address, int read, int write
)
+static struct page *
__follow_page(struct mm_struct *mm, unsigned long address,
+
int read, int write, int accessed
)
{
pgd_t *pgd;
pud_t *pud;
{
pgd_t *pgd;
pud_t *pud;
@@
-818,9
+818,11
@@
__follow_page(struct mm_struct *mm, unsigned long address, int read, int write)
pfn = pte_pfn(pte);
if (pfn_valid(pfn)) {
page = pfn_to_page(pfn);
pfn = pte_pfn(pte);
if (pfn_valid(pfn)) {
page = pfn_to_page(pfn);
- if (write && !pte_dirty(pte) && !PageDirty(page))
- set_page_dirty(page);
- mark_page_accessed(page);
+ if (accessed) {
+ if (write && !pte_dirty(pte) &&!PageDirty(page))
+ set_page_dirty(page);
+ mark_page_accessed(page);
+ }
return page;
}
}
return page;
}
}
@@
-829,16
+831,19
@@
out:
return NULL;
}
return NULL;
}
-struct page *
+
inline
struct page *
follow_page(struct mm_struct *mm, unsigned long address, int write)
{
follow_page(struct mm_struct *mm, unsigned long address, int write)
{
- return __follow_page(mm, address,
/*read*/0, write
);
+ return __follow_page(mm, address,
0, write, 1
);
}
}
-int
-check_user_page_readable(struct mm_struct *mm, unsigned long address)
+/*
+ * check_user_page_readable() can be called frm niterrupt context by oprofile,
+ * so we need to avoid taking any non-irq-safe locks
+ */
+int check_user_page_readable(struct mm_struct *mm, unsigned long address)
{
{
- return __follow_page(mm, address,
/*read*/1, /*write*/
0) != NULL;
+ return __follow_page(mm, address,
1, 0,
0) != NULL;
}
EXPORT_SYMBOL(check_user_page_readable);
}
EXPORT_SYMBOL(check_user_page_readable);
@@
-1139,7
+1144,7
@@
int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr,
{
pgd_t *pgd;
unsigned long next;
{
pgd_t *pgd;
unsigned long next;
- unsigned long end = addr +
size
;
+ unsigned long end = addr +
PAGE_ALIGN(size)
;
struct mm_struct *mm = vma->vm_mm;
int err;
struct mm_struct *mm = vma->vm_mm;
int err;