Commit 384492c4 authored by Stanislav Fomichev's avatar Stanislav Fomichev Committed by David S. Miller
Browse files

net: devmem: support single IOV with sendmsg



sendmsg() with a single iov becomes ITER_UBUF, sendmsg() with multiple
iovs becomes ITER_IOVEC. iter_iov_len does not return correct
value for UBUF, so teach to treat UBUF differently.

Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Pavel Begunkov <asml.silence@gmail.com>
Cc: Mina Almasry <almasrymina@google.com>
Fixes: bd618489 ("net: devmem: Implement TX path")
Signed-off-by: default avatarStanislav Fomichev <stfomichev@gmail.com>
Acked-by: default avatarMina Almasry <almasrymina@google.com>
Reviewed-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d09a8a4a
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -99,7 +99,13 @@ static inline const struct iovec *iter_iov(const struct iov_iter *iter)
}

#define iter_iov_addr(iter)	(iter_iov(iter)->iov_base + (iter)->iov_offset)
#define iter_iov_len(iter)	(iter_iov(iter)->iov_len - (iter)->iov_offset)

static inline size_t iter_iov_len(const struct iov_iter *i)
{
	if (i->iter_type == ITER_UBUF)
		return i->count;
	return iter_iov(i)->iov_len - i->iov_offset;
}

static inline enum iter_type iov_iter_type(const struct iov_iter *i)
{
+2 −1
Original line number Diff line number Diff line
@@ -702,7 +702,8 @@ zerocopy_fill_skb_from_devmem(struct sk_buff *skb, struct iov_iter *from,
	 * iov_addrs are interpreted as an offset in bytes into the dma-buf to
	 * send from. We do not support other iter types.
	 */
	if (iov_iter_type(from) != ITER_IOVEC)
	if (iov_iter_type(from) != ITER_IOVEC &&
	    iov_iter_type(from) != ITER_UBUF)
		return -EFAULT;

	while (length && iov_iter_count(from)) {