Message ID | 20210205232304.1670522-2-ira.weiny@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: Convert kmaps to core page calls | expand |
On 2/5/21 18:35, ira.weiny@intel.com wrote: > +static inline void memmove_page(struct page *dst_page, size_t dst_off, > + struct page *src_page, size_t src_off, > + size_t len) > +{ > + char *dst = kmap_local_page(dst_page); > + char *src = kmap_local_page(src_page); > + > + BUG_ON(dst_off + len > PAGE_SIZE || src_off + len > PAGE_SIZE); > + memmove(dst + dst_off, src + src_off, len); > + kunmap_local(src); > + kunmap_local(dst); > +} > + > +static inline void memcpy_from_page(char *to, struct page *page, size_t offset, size_t len) How about following ? static inline void memcpy_from_page(char *to, struct page *page, size_t offset, size_t len) > +{ > + char *from = kmap_local_page(page); > + > + BUG_ON(offset + len > PAGE_SIZE); > + memcpy(to, from + offset, len); > + kunmap_local(from); > +} > + > +static inline void memcpy_to_page(struct page *page, size_t offset, const char *from, size_t len) How about following ? static inline void memcpy_to_page(struct page *page, size_t offset, const char *from, size_t len) > +{ > + char *to = kmap_local_page(page); > + > + BUG_ON(offset + len > PAGE_SIZE); > + memcpy(to + offset, from, len); > + kunmap_local(to); > +} > + > +static inline void memset_page(struct page *page, size_t offset, int val, size_t len) How about following ? static inline void memset_page(struct page *page, size_t offset, int val, size_t len) > +{ > + char *addr = kmap_local_page(page); > + > + BUG_ON(offset + len > PAGE_SIZE); > + memset(addr + offset, val, len); > + kunmap_local(addr); > +} > +
On Sun, Feb 07, 2021 at 01:46:47AM +0000, Chaitanya Kulkarni wrote: > On 2/5/21 18:35, ira.weiny@intel.com wrote: > > +static inline void memmove_page(struct page *dst_page, size_t dst_off, > > + struct page *src_page, size_t src_off, > > + size_t len) > > +{ > > + char *dst = kmap_local_page(dst_page); > > + char *src = kmap_local_page(src_page); > > + > > + BUG_ON(dst_off + len > PAGE_SIZE || src_off + len > PAGE_SIZE); > > + memmove(dst + dst_off, src + src_off, len); > > + kunmap_local(src); > > + kunmap_local(dst); > > +} > > + > > +static inline void memcpy_from_page(char *to, struct page *page, size_t offset, size_t len) > How about following ? > static inline void memcpy_from_page(char *to, struct page *page, size_t > offset, > size_t len) It is an easy change and It is up to Andrew. But I thought we were making the line length limit longer now. Ira > > +{ > > + char *from = kmap_local_page(page); > > + > > + BUG_ON(offset + len > PAGE_SIZE); > > + memcpy(to, from + offset, len); > > + kunmap_local(from); > > +} > > + > > +static inline void memcpy_to_page(struct page *page, size_t offset, const char *from, size_t len) > How about following ? > static inline void memcpy_to_page(struct page *page, size_t offset, > const char *from, size_t len) > > +{ > > + char *to = kmap_local_page(page); > > + > > + BUG_ON(offset + len > PAGE_SIZE); > > + memcpy(to + offset, from, len); > > + kunmap_local(to); > > +} > > + > > +static inline void memset_page(struct page *page, size_t offset, int val, size_t len) > How about following ? > static inline void memset_page(struct page *page, size_t offset, int val, > size_t len) > > +{ > > + char *addr = kmap_local_page(page); > > + > > + BUG_ON(offset + len > PAGE_SIZE); > > + memset(addr + offset, val, len); > > + kunmap_local(addr); > > +} > > +
On 2/7/21 19:13, Ira Weiny wrote: >>> +static inline void memcpy_from_page(char *to, struct page *page, size_t offset, size_t len) >> How about following ? >> static inline void memcpy_from_page(char *to, struct page *page, size_t >> offset, >> size_t len) > It is an easy change and It is up to Andrew. But I thought we were making the > line length limit longer now. > > Ira > True, not sure what is the right thing going forward especially when new changes are mixed with the old ones, I'll leave it to the maintainer to decide.
diff --git a/include/linux/highmem.h b/include/linux/highmem.h index d2c70d3772a3..c642dd64ea3f 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -276,4 +276,57 @@ static inline void copy_highpage(struct page *to, struct page *from) #endif +static inline void memcpy_page(struct page *dst_page, size_t dst_off, + struct page *src_page, size_t src_off, + size_t len) +{ + char *dst = kmap_local_page(dst_page); + char *src = kmap_local_page(src_page); + + BUG_ON(dst_off + len > PAGE_SIZE || src_off + len > PAGE_SIZE); + memcpy(dst + dst_off, src + src_off, len); + kunmap_local(src); + kunmap_local(dst); +} + +static inline void memmove_page(struct page *dst_page, size_t dst_off, + struct page *src_page, size_t src_off, + size_t len) +{ + char *dst = kmap_local_page(dst_page); + char *src = kmap_local_page(src_page); + + BUG_ON(dst_off + len > PAGE_SIZE || src_off + len > PAGE_SIZE); + memmove(dst + dst_off, src + src_off, len); + kunmap_local(src); + kunmap_local(dst); +} + +static inline void memcpy_from_page(char *to, struct page *page, size_t offset, size_t len) +{ + char *from = kmap_local_page(page); + + BUG_ON(offset + len > PAGE_SIZE); + memcpy(to, from + offset, len); + kunmap_local(from); +} + +static inline void memcpy_to_page(struct page *page, size_t offset, const char *from, size_t len) +{ + char *to = kmap_local_page(page); + + BUG_ON(offset + len > PAGE_SIZE); + memcpy(to + offset, from, len); + kunmap_local(to); +} + +static inline void memset_page(struct page *page, size_t offset, int val, size_t len) +{ + char *addr = kmap_local_page(page); + + BUG_ON(offset + len > PAGE_SIZE); + memset(addr + offset, val, len); + kunmap_local(addr); +} + #endif /* _LINUX_HIGHMEM_H */ diff --git a/lib/iov_iter.c b/lib/iov_iter.c index a21e6a5792c5..aa0d03b33a1e 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -5,6 +5,7 @@ #include <linux/fault-inject-usercopy.h> #include <linux/uio.h> #include <linux/pagemap.h> +#include <linux/highmem.h> #include <linux/slab.h> #include <linux/vmalloc.h> #include <linux/splice.h> @@ -466,27 +467,6 @@ void iov_iter_init(struct iov_iter *i, unsigned int direction, } EXPORT_SYMBOL(iov_iter_init); -static void memcpy_from_page(char *to, struct page *page, size_t offset, size_t len) -{ - char *from = kmap_atomic(page); - memcpy(to, from + offset, len); - kunmap_atomic(from); -} - -static void memcpy_to_page(struct page *page, size_t offset, const char *from, size_t len) -{ - char *to = kmap_atomic(page); - memcpy(to + offset, from, len); - kunmap_atomic(to); -} - -static void memzero_page(struct page *page, size_t offset, size_t len) -{ - char *addr = kmap_atomic(page); - memset(addr + offset, 0, len); - kunmap_atomic(addr); -} - static inline bool allocated(struct pipe_buffer *buf) { return buf->ops == &default_pipe_buf_ops; @@ -964,7 +944,7 @@ static size_t pipe_zero(size_t bytes, struct iov_iter *i) do { size_t chunk = min_t(size_t, n, PAGE_SIZE - off); - memzero_page(pipe->bufs[i_head & p_mask].page, off, chunk); + zero_user(pipe->bufs[i_head & p_mask].page, off, chunk); i->head = i_head; i->iov_offset = off + chunk; n -= chunk; @@ -981,7 +961,7 @@ size_t iov_iter_zero(size_t bytes, struct iov_iter *i) return pipe_zero(bytes, i); iterate_and_advance(i, bytes, v, clear_user(v.iov_base, v.iov_len), - memzero_page(v.bv_page, v.bv_offset, v.bv_len), + zero_user(v.bv_page, v.bv_offset, v.bv_len), memset(v.iov_base, 0, v.iov_len) )