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 Original line Diff line number Diff line
@@ -333,14 +333,14 @@ struct rds_message *rds_message_map_pages(unsigned long *page_addrs, unsigned in
	return rm;
	return rm;
}
}


int rds_message_copy_from_user(struct rds_message *rm, struct iov_iter *from,
int rds_message_zcopy_from_user(struct rds_message *rm, struct iov_iter *from)
			       bool zcopy)
{
{
	unsigned long to_copy, nbytes;
	unsigned long sg_off;
	unsigned long sg_off;
	struct scatterlist *sg;
	struct scatterlist *sg;
	int ret = 0;
	int ret = 0;
	int length = iov_iter_count(from);
	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));
	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 = rm->data.op_sg;
	sg_off = 0; /* Dear gcc, sg->page will be null from kzalloc. */
	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);
	skb = alloc_skb(0, GFP_KERNEL);
	if (!skb)
	if (!skb)
		return -ENOMEM;
		return -ENOMEM;
		BUILD_BUG_ON(sizeof(skb->cb) <
	BUILD_BUG_ON(sizeof(skb->cb) < max_t(int, sizeof(struct rds_znotifier),
			     max_t(int, sizeof(struct rds_znotifier),
					     sizeof(struct rds_zcopy_cookies)));
					     sizeof(struct rds_zcopy_cookies)));
	rm->data.op_mmp_znotifier = RDS_ZCOPY_SKB(skb);
	rm->data.op_mmp_znotifier = RDS_ZCOPY_SKB(skb);
	if (mm_account_pinned_pages(&rm->data.op_mmp_znotifier->z_mmp,
	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);
	consume_skb(skb);
	rm->data.op_mmp_znotifier = NULL;
	rm->data.op_mmp_znotifier = NULL;
	return ret;
	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)) {
	while (iov_iter_count(from)) {
		if (!sg_page(sg)) {
		if (!sg_page(sg)) {