Commit 788c7df4 authored by Hugh Dickins's avatar Hugh Dickins Committed by Linus Torvalds
Browse files

hugetlb: fault flags instead of write_access



handle_mm_fault() is now passing fault flags rather than write_access
down to hugetlb_fault(), so better recognize that in hugetlb_fault(),
and in hugetlb_no_page().
Signed-off-by: default avatarHugh Dickins <hugh.dickins@tiscali.co.uk>
Acked-by: default avatarWu Fengguang <fengguang.wu@intel.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent a800faec
...@@ -33,7 +33,7 @@ void hugetlb_report_meminfo(struct seq_file *); ...@@ -33,7 +33,7 @@ void hugetlb_report_meminfo(struct seq_file *);
int hugetlb_report_node_meminfo(int, char *); int hugetlb_report_node_meminfo(int, char *);
unsigned long hugetlb_total_pages(void); unsigned long hugetlb_total_pages(void);
int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
unsigned long address, int write_access); unsigned long address, unsigned int flags);
int hugetlb_reserve_pages(struct inode *inode, long from, long to, int hugetlb_reserve_pages(struct inode *inode, long from, long to,
struct vm_area_struct *vma, struct vm_area_struct *vma,
int acctflags); int acctflags);
...@@ -98,7 +98,7 @@ static inline void hugetlb_report_meminfo(struct seq_file *m) ...@@ -98,7 +98,7 @@ static inline void hugetlb_report_meminfo(struct seq_file *m)
#define pud_huge(x) 0 #define pud_huge(x) 0
#define is_hugepage_only_range(mm, addr, len) 0 #define is_hugepage_only_range(mm, addr, len) 0
#define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) ({BUG(); 0; }) #define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) ({BUG(); 0; })
#define hugetlb_fault(mm, vma, addr, write) ({ BUG(); 0; }) #define hugetlb_fault(mm, vma, addr, flags) ({ BUG(); 0; })
#define hugetlb_change_protection(vma, address, end, newprot) #define hugetlb_change_protection(vma, address, end, newprot)
......
...@@ -1985,7 +1985,7 @@ static struct page *hugetlbfs_pagecache_page(struct hstate *h, ...@@ -1985,7 +1985,7 @@ static struct page *hugetlbfs_pagecache_page(struct hstate *h,
} }
static int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma, static int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma,
unsigned long address, pte_t *ptep, int write_access) unsigned long address, pte_t *ptep, unsigned int flags)
{ {
struct hstate *h = hstate_vma(vma); struct hstate *h = hstate_vma(vma);
int ret = VM_FAULT_SIGBUS; int ret = VM_FAULT_SIGBUS;
...@@ -2053,7 +2053,7 @@ retry: ...@@ -2053,7 +2053,7 @@ retry:
* any allocations necessary to record that reservation occur outside * any allocations necessary to record that reservation occur outside
* the spinlock. * the spinlock.
*/ */
if (write_access && !(vma->vm_flags & VM_SHARED)) if ((flags & FAULT_FLAG_WRITE) && !(vma->vm_flags & VM_SHARED))
if (vma_needs_reservation(h, vma, address) < 0) { if (vma_needs_reservation(h, vma, address) < 0) {
ret = VM_FAULT_OOM; ret = VM_FAULT_OOM;
goto backout_unlocked; goto backout_unlocked;
...@@ -2072,7 +2072,7 @@ retry: ...@@ -2072,7 +2072,7 @@ retry:
&& (vma->vm_flags & VM_SHARED))); && (vma->vm_flags & VM_SHARED)));
set_huge_pte_at(mm, address, ptep, new_pte); set_huge_pte_at(mm, address, ptep, new_pte);
if (write_access && !(vma->vm_flags & VM_SHARED)) { if ((flags & FAULT_FLAG_WRITE) && !(vma->vm_flags & VM_SHARED)) {
/* Optimization, do the COW without a second fault */ /* Optimization, do the COW without a second fault */
ret = hugetlb_cow(mm, vma, address, ptep, new_pte, page); ret = hugetlb_cow(mm, vma, address, ptep, new_pte, page);
} }
...@@ -2091,7 +2091,7 @@ backout_unlocked: ...@@ -2091,7 +2091,7 @@ backout_unlocked:
} }
int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
unsigned long address, int write_access) unsigned long address, unsigned int flags)
{ {
pte_t *ptep; pte_t *ptep;
pte_t entry; pte_t entry;
...@@ -2112,7 +2112,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, ...@@ -2112,7 +2112,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
mutex_lock(&hugetlb_instantiation_mutex); mutex_lock(&hugetlb_instantiation_mutex);
entry = huge_ptep_get(ptep); entry = huge_ptep_get(ptep);
if (huge_pte_none(entry)) { if (huge_pte_none(entry)) {
ret = hugetlb_no_page(mm, vma, address, ptep, write_access); ret = hugetlb_no_page(mm, vma, address, ptep, flags);
goto out_mutex; goto out_mutex;
} }
...@@ -2126,7 +2126,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, ...@@ -2126,7 +2126,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
* page now as it is used to determine if a reservation has been * page now as it is used to determine if a reservation has been
* consumed. * consumed.
*/ */
if (write_access && !pte_write(entry)) { if ((flags & FAULT_FLAG_WRITE) && !pte_write(entry)) {
if (vma_needs_reservation(h, vma, address) < 0) { if (vma_needs_reservation(h, vma, address) < 0) {
ret = VM_FAULT_OOM; ret = VM_FAULT_OOM;
goto out_mutex; goto out_mutex;
...@@ -2143,7 +2143,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, ...@@ -2143,7 +2143,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
goto out_page_table_lock; goto out_page_table_lock;
if (write_access) { if (flags & FAULT_FLAG_WRITE) {
if (!pte_write(entry)) { if (!pte_write(entry)) {
ret = hugetlb_cow(mm, vma, address, ptep, entry, ret = hugetlb_cow(mm, vma, address, ptep, entry,
pagecache_page); pagecache_page);
...@@ -2152,7 +2152,8 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, ...@@ -2152,7 +2152,8 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
entry = pte_mkdirty(entry); entry = pte_mkdirty(entry);
} }
entry = pte_mkyoung(entry); entry = pte_mkyoung(entry);
if (huge_ptep_set_access_flags(vma, address, ptep, entry, write_access)) if (huge_ptep_set_access_flags(vma, address, ptep, entry,
flags & FAULT_FLAG_WRITE))
update_mmu_cache(vma, address, entry); update_mmu_cache(vma, address, entry);
out_page_table_lock: out_page_table_lock:
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment