[PATCH 19/29] iov_iter: Split iov_iter_alignment()

From: David Howells
Date: Sat Nov 21 2020 - 09:16:27 EST


Split iov_iter_alignment() by type.

Signed-off-by: David Howells <dhowells@xxxxxxxxxx>
---

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,