dax: update PMD fault handler with PMEM API
As part of the v4.3 merge window the DAX code was updated by Matthew and
Kirill to handle PMD pages. Also as part of the v4.3 merge window we
updated the DAX code to do proper PMEM flushing (commit 2765cfbb34
:
"dax: update I/O path to do proper PMEM flushing").
The additional code added by the DAX PMD patches also needs to be
updated to properly use the PMEM API. This ensures that after a PMD
fault is handled the zeros written to the newly allocated pages are
durable on the DIMMs.
linux/dax.h is included to get rid of a bunch of sparse warnings.
Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com>
Cc: Matthew Wilcox <willy@linux.intel.com>,
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Kirill Shutemov <kirill@shutemov.name>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
26d2177e97
commit
d77e92e270
1 changed files with 4 additions and 2 deletions
6
fs/dax.c
6
fs/dax.c
|
@ -17,6 +17,7 @@
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
#include <linux/buffer_head.h>
|
#include <linux/buffer_head.h>
|
||||||
|
#include <linux/dax.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/genhd.h>
|
#include <linux/genhd.h>
|
||||||
#include <linux/highmem.h>
|
#include <linux/highmem.h>
|
||||||
|
@ -527,7 +528,7 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
|
||||||
unsigned long pmd_addr = address & PMD_MASK;
|
unsigned long pmd_addr = address & PMD_MASK;
|
||||||
bool write = flags & FAULT_FLAG_WRITE;
|
bool write = flags & FAULT_FLAG_WRITE;
|
||||||
long length;
|
long length;
|
||||||
void *kaddr;
|
void __pmem *kaddr;
|
||||||
pgoff_t size, pgoff;
|
pgoff_t size, pgoff;
|
||||||
sector_t block, sector;
|
sector_t block, sector;
|
||||||
unsigned long pfn;
|
unsigned long pfn;
|
||||||
|
@ -570,7 +571,8 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
|
||||||
if (buffer_unwritten(&bh) || buffer_new(&bh)) {
|
if (buffer_unwritten(&bh) || buffer_new(&bh)) {
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < PTRS_PER_PMD; i++)
|
for (i = 0; i < PTRS_PER_PMD; i++)
|
||||||
clear_page(kaddr + i * PAGE_SIZE);
|
clear_pmem(kaddr + i * PAGE_SIZE, PAGE_SIZE);
|
||||||
|
wmb_pmem();
|
||||||
count_vm_event(PGMAJFAULT);
|
count_vm_event(PGMAJFAULT);
|
||||||
mem_cgroup_count_vm_event(vma->vm_mm, PGMAJFAULT);
|
mem_cgroup_count_vm_event(vma->vm_mm, PGMAJFAULT);
|
||||||
result |= VM_FAULT_MAJOR;
|
result |= VM_FAULT_MAJOR;
|
||||||
|
|
Loading…
Reference in a new issue