[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <160596815051.154728.15434909811290333829.stgit@warthog.procyon.org.uk>
Date: Sat, 21 Nov 2020 14:15:50 +0000
From: David Howells <dhowells@...hat.com>
To: Pavel Begunkov <asml.silence@...il.com>,
Matthew Wilcox <willy@...radead.org>,
Jens Axboe <axboe@...nel.dk>,
Alexander Viro <viro@...iv.linux.org.uk>
Cc: dhowells@...hat.com,
Linus Torvalds <torvalds@...ux-foundation.org>,
linux-fsdevel@...r.kernel.org, linux-block@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: [PATCH 19/29] iov_iter: Split iov_iter_alignment()
Split iov_iter_alignment() by type.
Signed-off-by: David Howells <dhowells@...hat.com>
---
lib/iov_iter.c | 59 ++++++++++++++++++++++++++++++++++++++++----------------
1 file changed, 42 insertions(+), 17 deletions(-)
diff --git a/lib/iov_iter.c b/lib/iov_iter.c
index 90291188ace5..d2a66e951995 100644
--- a/lib/iov_iter.c
+++ b/lib/iov_iter.c
@@ -1497,26 +1497,51 @@ void iov_iter_discard(struct iov_iter *i, unsigned int direction, size_t count)
}
EXPORT_SYMBOL(iov_iter_discard);
-static unsigned long xxx_alignment(const struct iov_iter *i)
+static unsigned long iovec_alignment(const struct iov_iter *i)
{
unsigned long res = 0;
size_t size = i->count;
- if (unlikely(iov_iter_is_pipe(i))) {
- unsigned int p_mask = i->pipe->ring_size - 1;
+ iterate_over_iovec(i, size, v,
+ (res |= (unsigned long)v.iov_base | v.iov_len, 0));
+ return res;
+}
- if (size && i->iov_offset && allocated(&i->pipe->bufs[i->head & p_mask]))
- return size | i->iov_offset;
- return size;
- }
- iterate_all_kinds(i, size, v,
- (res |= (unsigned long)v.iov_base | v.iov_len, 0),
- res |= v.bv_offset | v.bv_len,
- res |= (unsigned long)v.iov_base | v.iov_len
- )
+static unsigned long bvec_alignment(const struct iov_iter *i)
+{
+ unsigned long res = 0;
+ size_t size = i->count;
+
+ iterate_over_bvec(i, size, v,
+ res |= v.bv_offset | v.bv_len);
return res;
}
+static unsigned long kvec_alignment(const struct iov_iter *i)
+{
+ unsigned long res = 0;
+ size_t size = i->count;
+
+ iterate_over_kvec(i, size, v,
+ res |= (unsigned long)v.iov_base | v.iov_len);
+ return res;
+}
+
+static unsigned long pipe_alignment(const struct iov_iter *i)
+{
+ size_t size = i->count;
+ unsigned int p_mask = i->pipe->ring_size - 1;
+
+ if (size && i->iov_offset && allocated(&i->pipe->bufs[i->head & p_mask]))
+ return size | i->iov_offset;
+ return size;
+}
+
+static unsigned long no_alignment(const struct iov_iter *i)
+{
+ return 0;
+}
+
static unsigned long xxx_gap_alignment(const struct iov_iter *i)
{
unsigned long res = 0;
@@ -2134,7 +2159,7 @@ static const struct iov_iter_ops iovec_iter_ops = {
.csum_and_copy_from_iter_full = xxx_csum_and_copy_from_iter_full,
.zero = iovec_zero,
- .alignment = xxx_alignment,
+ .alignment = iovec_alignment,
.gap_alignment = xxx_gap_alignment,
.get_pages = xxx_get_pages,
.get_pages_alloc = xxx_get_pages_alloc,
@@ -2168,7 +2193,7 @@ static const struct iov_iter_ops kvec_iter_ops = {
.csum_and_copy_from_iter_full = xxx_csum_and_copy_from_iter_full,
.zero = kvec_zero,
- .alignment = xxx_alignment,
+ .alignment = kvec_alignment,
.gap_alignment = xxx_gap_alignment,
.get_pages = xxx_get_pages,
.get_pages_alloc = xxx_get_pages_alloc,
@@ -2202,7 +2227,7 @@ static const struct iov_iter_ops bvec_iter_ops = {
.csum_and_copy_from_iter_full = xxx_csum_and_copy_from_iter_full,
.zero = bvec_zero,
- .alignment = xxx_alignment,
+ .alignment = bvec_alignment,
.gap_alignment = xxx_gap_alignment,
.get_pages = xxx_get_pages,
.get_pages_alloc = xxx_get_pages_alloc,
@@ -2236,7 +2261,7 @@ static const struct iov_iter_ops pipe_iter_ops = {
.csum_and_copy_from_iter_full = xxx_csum_and_copy_from_iter_full,
.zero = pipe_zero,
- .alignment = xxx_alignment,
+ .alignment = pipe_alignment,
.gap_alignment = xxx_gap_alignment,
.get_pages = xxx_get_pages,
.get_pages_alloc = xxx_get_pages_alloc,
@@ -2270,7 +2295,7 @@ static const struct iov_iter_ops discard_iter_ops = {
.csum_and_copy_from_iter_full = xxx_csum_and_copy_from_iter_full,
.zero = discard_zero,
- .alignment = xxx_alignment,
+ .alignment = no_alignment,
.gap_alignment = xxx_gap_alignment,
.get_pages = xxx_get_pages,
.get_pages_alloc = xxx_get_pages_alloc,
Powered by blists - more mailing lists