mirror of https://gitee.com/openkylin/linux.git
filesystem-dax: convert to dax_copy_from_iter()
Now that all possible providers of the dax_operations copy_from_iter method are implemented, switch filesytem-dax to call the driver rather than copy_to_iter_pmem. Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
7e026c8c0a
commit
fec53774fd
|
@ -65,56 +65,6 @@ static inline void arch_wb_cache_pmem(void *addr, size_t size)
|
||||||
clwb(p);
|
clwb(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* arch_copy_from_iter_pmem - copy data from an iterator to PMEM
|
|
||||||
* @addr: PMEM destination address
|
|
||||||
* @bytes: number of bytes to copy
|
|
||||||
* @i: iterator with source data
|
|
||||||
*
|
|
||||||
* Copy data from the iterator 'i' to the PMEM buffer starting at 'addr'.
|
|
||||||
*/
|
|
||||||
static inline size_t arch_copy_from_iter_pmem(void *addr, size_t bytes,
|
|
||||||
struct iov_iter *i)
|
|
||||||
{
|
|
||||||
size_t len;
|
|
||||||
|
|
||||||
/* TODO: skip the write-back by always using non-temporal stores */
|
|
||||||
len = copy_from_iter_nocache(addr, bytes, i);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* In the iovec case on x86_64 copy_from_iter_nocache() uses
|
|
||||||
* non-temporal stores for the bulk of the transfer, but we need
|
|
||||||
* to manually flush if the transfer is unaligned. A cached
|
|
||||||
* memory copy is used when destination or size is not naturally
|
|
||||||
* aligned. That is:
|
|
||||||
* - Require 8-byte alignment when size is 8 bytes or larger.
|
|
||||||
* - Require 4-byte alignment when size is 4 bytes.
|
|
||||||
*
|
|
||||||
* In the non-iovec case the entire destination needs to be
|
|
||||||
* flushed.
|
|
||||||
*/
|
|
||||||
if (iter_is_iovec(i)) {
|
|
||||||
unsigned long flushed, dest = (unsigned long) addr;
|
|
||||||
|
|
||||||
if (bytes < 8) {
|
|
||||||
if (!IS_ALIGNED(dest, 4) || (bytes != 4))
|
|
||||||
arch_wb_cache_pmem(addr, bytes);
|
|
||||||
} else {
|
|
||||||
if (!IS_ALIGNED(dest, 8)) {
|
|
||||||
dest = ALIGN(dest, boot_cpu_data.x86_clflush_size);
|
|
||||||
arch_wb_cache_pmem(addr, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
flushed = dest - (unsigned long) addr;
|
|
||||||
if (bytes > flushed && !IS_ALIGNED(bytes - flushed, 8))
|
|
||||||
arch_wb_cache_pmem(addr + bytes - 1, 1);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
arch_wb_cache_pmem(addr, bytes);
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* arch_clear_pmem - zero a PMEM memory range
|
* arch_clear_pmem - zero a PMEM memory range
|
||||||
* @addr: virtual start address
|
* @addr: virtual start address
|
||||||
|
|
3
fs/dax.c
3
fs/dax.c
|
@ -1054,7 +1054,8 @@ dax_iomap_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
|
||||||
map_len = end - pos;
|
map_len = end - pos;
|
||||||
|
|
||||||
if (iov_iter_rw(iter) == WRITE)
|
if (iov_iter_rw(iter) == WRITE)
|
||||||
map_len = copy_from_iter_pmem(kaddr, map_len, iter);
|
map_len = dax_copy_from_iter(dax_dev, pgoff, kaddr,
|
||||||
|
map_len, iter);
|
||||||
else
|
else
|
||||||
map_len = copy_to_iter(kaddr, map_len, iter);
|
map_len = copy_to_iter(kaddr, map_len, iter);
|
||||||
if (map_len <= 0) {
|
if (map_len <= 0) {
|
||||||
|
|
|
@ -31,13 +31,6 @@ static inline void arch_memcpy_to_pmem(void *dst, const void *src, size_t n)
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline size_t arch_copy_from_iter_pmem(void *addr, size_t bytes,
|
|
||||||
struct iov_iter *i)
|
|
||||||
{
|
|
||||||
BUG();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void arch_clear_pmem(void *addr, size_t size)
|
static inline void arch_clear_pmem(void *addr, size_t size)
|
||||||
{
|
{
|
||||||
BUG();
|
BUG();
|
||||||
|
@ -79,23 +72,6 @@ static inline void memcpy_to_pmem(void *dst, const void *src, size_t n)
|
||||||
memcpy(dst, src, n);
|
memcpy(dst, src, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* copy_from_iter_pmem - copy data from an iterator to PMEM
|
|
||||||
* @addr: PMEM destination address
|
|
||||||
* @bytes: number of bytes to copy
|
|
||||||
* @i: iterator with source data
|
|
||||||
*
|
|
||||||
* Copy data from the iterator 'i' to the PMEM buffer starting at 'addr'.
|
|
||||||
* See blkdev_issue_flush() note for memcpy_to_pmem().
|
|
||||||
*/
|
|
||||||
static inline size_t copy_from_iter_pmem(void *addr, size_t bytes,
|
|
||||||
struct iov_iter *i)
|
|
||||||
{
|
|
||||||
if (arch_has_pmem_api())
|
|
||||||
return arch_copy_from_iter_pmem(addr, bytes, i);
|
|
||||||
return copy_from_iter_nocache(addr, bytes, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* clear_pmem - zero a PMEM memory range
|
* clear_pmem - zero a PMEM memory range
|
||||||
* @addr: virtual start address
|
* @addr: virtual start address
|
||||||
|
|
Loading…
Reference in New Issue