Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d838df2e authored by Al Viro's avatar Al Viro
Browse files

vmci: propagate msghdr all way down to __qp_memcpy_from_queue()



... and switch it to memcpy_to_msg()

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 56c39fb6
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <linux/uio.h>
#include <linux/wait.h>
#include <linux/vmalloc.h>
#include <linux/skbuff.h>

#include "vmci_handle_array.h"
#include "vmci_queue_pair.h"
@@ -429,11 +430,11 @@ static int __qp_memcpy_from_queue(void *dest,
			to_copy = size - bytes_copied;

		if (is_iovec) {
			struct iovec *iov = (struct iovec *)dest;
			struct msghdr *msg = dest;
			int err;

			/* The iovec will track bytes_copied internally. */
			err = memcpy_toiovec(iov, (u8 *)va + page_offset,
			err = memcpy_to_msg(msg, (u8 *)va + page_offset,
					     to_copy);
			if (err != 0) {
				if (kernel_if->host)
@@ -3264,13 +3265,13 @@ EXPORT_SYMBOL_GPL(vmci_qpair_enquev);
 * of bytes dequeued or < 0 on error.
 */
ssize_t vmci_qpair_dequev(struct vmci_qp *qpair,
			  void *iov,
			  struct msghdr *msg,
			  size_t iov_size,
			  int buf_type)
{
	ssize_t result;

	if (!qpair || !iov)
	if (!qpair)
		return VMCI_ERROR_INVALID_ARGS;

	qp_lock(qpair);
@@ -3279,7 +3280,7 @@ ssize_t vmci_qpair_dequev(struct vmci_qp *qpair,
		result = qp_dequeue_locked(qpair->produce_q,
					   qpair->consume_q,
					   qpair->consume_q_size,
					   iov, iov_size,
					   msg, iov_size,
					   qp_memcpy_from_queue_iov,
					   true);

@@ -3308,13 +3309,13 @@ EXPORT_SYMBOL_GPL(vmci_qpair_dequev);
 * of bytes peeked or < 0 on error.
 */
ssize_t vmci_qpair_peekv(struct vmci_qp *qpair,
			 void *iov,
			 struct msghdr *msg,
			 size_t iov_size,
			 int buf_type)
{
	ssize_t result;

	if (!qpair || !iov)
	if (!qpair)
		return VMCI_ERROR_INVALID_ARGS;

	qp_lock(qpair);
@@ -3323,7 +3324,7 @@ ssize_t vmci_qpair_peekv(struct vmci_qp *qpair,
		result = qp_dequeue_locked(qpair->produce_q,
					   qpair->consume_q,
					   qpair->consume_q_size,
					   iov, iov_size,
					   msg, iov_size,
					   qp_memcpy_from_queue_iov,
					   false);

+3 −2
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#define VMCI_KERNEL_API_VERSION_2 2
#define VMCI_KERNEL_API_VERSION   VMCI_KERNEL_API_VERSION_2

struct msghdr;
typedef void (vmci_device_shutdown_fn) (void *device_registration,
					void *user_data);

@@ -75,8 +76,8 @@ ssize_t vmci_qpair_peek(struct vmci_qp *qpair, void *buf, size_t buf_size,
ssize_t vmci_qpair_enquev(struct vmci_qp *qpair,
			  void *iov, size_t iov_size, int mode);
ssize_t vmci_qpair_dequev(struct vmci_qp *qpair,
			  void *iov, size_t iov_size, int mode);
ssize_t vmci_qpair_peekv(struct vmci_qp *qpair, void *iov, size_t iov_size,
			  struct msghdr *msg, size_t iov_size, int mode);
ssize_t vmci_qpair_peekv(struct vmci_qp *qpair, struct msghdr *msg, size_t iov_size,
			 int mode);

#endif /* !__VMW_VMCI_API_H__ */
+2 −2
Original line number Diff line number Diff line
@@ -1840,9 +1840,9 @@ static ssize_t vmci_transport_stream_dequeue(
	int flags)
{
	if (flags & MSG_PEEK)
		return vmci_qpair_peekv(vmci_trans(vsk)->qpair, msg->msg_iov, len, 0);
		return vmci_qpair_peekv(vmci_trans(vsk)->qpair, msg, len, 0);
	else
		return vmci_qpair_dequev(vmci_trans(vsk)->qpair, msg->msg_iov, len, 0);
		return vmci_qpair_dequev(vmci_trans(vsk)->qpair, msg, len, 0);
}

static ssize_t vmci_transport_stream_enqueue(