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

Commit d40a126b authored by Sowmini Varadhan's avatar Sowmini Varadhan Committed by David S. Miller
Browse files

rds: refactor zcopy code into rds_message_zcopy_from_user



Move the large block of code predicated on zcopy from
rds_message_copy_from_user into a new function,
rds_message_zcopy_from_user()

Signed-off-by: default avatarSowmini Varadhan <sowmini.varadhan@oracle.com>
Acked-by: default avatarWillem de Bruijn <willemb@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c33b3b9f
Loading
Loading
Loading
Loading
+60 −48
Original line number Diff line number Diff line
@@ -333,14 +333,14 @@ struct rds_message *rds_message_map_pages(unsigned long *page_addrs, unsigned in
	return rm;
}

int rds_message_copy_from_user(struct rds_message *rm, struct iov_iter *from,
			       bool zcopy)
int rds_message_zcopy_from_user(struct rds_message *rm, struct iov_iter *from)
{
	unsigned long to_copy, nbytes;
	unsigned long sg_off;
	struct scatterlist *sg;
	int ret = 0;
	int length = iov_iter_count(from);
	int total_copied = 0;
	struct sk_buff *skb;

	rm->m_inc.i_hdr.h_len = cpu_to_be32(iov_iter_count(from));

@@ -350,15 +350,10 @@ int rds_message_copy_from_user(struct rds_message *rm, struct iov_iter *from,
	sg = rm->data.op_sg;
	sg_off = 0; /* Dear gcc, sg->page will be null from kzalloc. */

	if (zcopy) {
		int total_copied = 0;
		struct sk_buff *skb;

	skb = alloc_skb(0, GFP_KERNEL);
	if (!skb)
		return -ENOMEM;
		BUILD_BUG_ON(sizeof(skb->cb) <
			     max_t(int, sizeof(struct rds_znotifier),
	BUILD_BUG_ON(sizeof(skb->cb) < max_t(int, sizeof(struct rds_znotifier),
					     sizeof(struct rds_zcopy_cookies)));
	rm->data.op_mmp_znotifier = RDS_ZCOPY_SKB(skb);
	if (mm_account_pinned_pages(&rm->data.op_mmp_znotifier->z_mmp,
@@ -397,7 +392,24 @@ int rds_message_copy_from_user(struct rds_message *rm, struct iov_iter *from,
	consume_skb(skb);
	rm->data.op_mmp_znotifier = NULL;
	return ret;
	} /* zcopy */
}

int rds_message_copy_from_user(struct rds_message *rm, struct iov_iter *from,
			       bool zcopy)
{
	unsigned long to_copy, nbytes;
	unsigned long sg_off;
	struct scatterlist *sg;
	int ret = 0;

	rm->m_inc.i_hdr.h_len = cpu_to_be32(iov_iter_count(from));

	/* now allocate and copy in the data payload.  */
	sg = rm->data.op_sg;
	sg_off = 0; /* Dear gcc, sg->page will be null from kzalloc. */

	if (zcopy)
		return rds_message_zcopy_from_user(rm, from);

	while (iov_iter_count(from)) {
		if (!sg_page(sg)) {