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

Commit 1b4e992f authored by Al Viro's avatar Al Viro Committed by Greg Kroah-Hartman
Browse files

staging: lustre: ksocknal_lib_send_kiov(): sendmsg doesn't bugger iovec...

parent 805560e8
Loading
Loading
Loading
Loading
+5 −24
Original line number Diff line number Diff line
@@ -106,10 +106,6 @@ ksocknal_lib_send_kiov(struct ksock_conn *conn, struct ksock_tx *tx)
	/* Not NOOP message */
	LASSERT(tx->tx_lnetmsg);

	/*
	 * NB we can't trust socket ops to either consume our iovs
	 * or leave them alone.
	 */
	if (tx->tx_msg.ksm_zc_cookies[0]) {
		/* Zero copy is enabled */
		struct sock *sk = sock->sk;
@@ -132,34 +128,19 @@ ksocknal_lib_send_kiov(struct ksock_conn *conn, struct ksock_tx *tx)
			rc = tcp_sendpage(sk, page, offset, fragsize, msgflg);
		}
	} else {
#if SOCKNAL_SINGLE_FRAG_TX || !SOCKNAL_RISK_KMAP_DEADLOCK
		struct kvec scratch;
		struct kvec *scratchiov = &scratch;
		unsigned int niov = 1;
#else
#ifdef CONFIG_HIGHMEM
#warning "XXX risk of kmap deadlock on multiple frags..."
#endif
		struct kvec *scratchiov = conn->ksnc_scheduler->kss_scratch_iov;
		unsigned int niov = tx->tx_nkiov;
#endif
		struct msghdr msg = {.msg_flags = MSG_DONTWAIT};
		int i;

		for (nob = i = 0; i < niov; i++) {
			scratchiov[i].iov_base = kmap(kiov[i].bv_page) +
						 kiov[i].bv_offset;
			nob += scratchiov[i].iov_len = kiov[i].bv_len;
		}
		for (nob = i = 0; i < tx->tx_nkiov; i++)
			nob += kiov[i].bv_len;

		if (!list_empty(&conn->ksnc_tx_queue) ||
		    nob < tx->tx_resid)
			msg.msg_flags |= MSG_MORE;

		rc = kernel_sendmsg(sock, &msg, (struct kvec *)scratchiov, niov, nob);

		for (i = 0; i < niov; i++)
			kunmap(kiov[i].bv_page);
		iov_iter_bvec(&msg.msg_iter, WRITE | ITER_BVEC,
			      kiov, tx->tx_nkiov, nob);
		rc = sock_sendmsg(sock, &msg);
	}
	return rc;
}