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

Commit 8d6f97d6 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

SUNRPC: Don't loop forever in xs_tcp_data_receive()



Ensure that we don't hog the workqueue thread by requeuing the job
every 64 loops.

Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent c89091c8
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -1526,6 +1526,7 @@ static void xs_tcp_data_receive(struct sock_xprt *transport)
		.arg.data = xprt,
	};
	unsigned long total = 0;
	int loop;
	int read = 0;

	mutex_lock(&transport->recv_mutex);
@@ -1534,20 +1535,20 @@ static void xs_tcp_data_receive(struct sock_xprt *transport)
		goto out;

	/* We use rd_desc to pass struct xprt to xs_tcp_data_recv */
	for (;;) {
	for (loop = 0; loop < 64; loop++) {
		lock_sock(sk);
		read = tcp_read_sock(sk, &rd_desc, xs_tcp_data_recv);
		if (read <= 0) {
			clear_bit(XPRT_SOCK_DATA_READY, &transport->sock_state);
			release_sock(sk);
			if (!test_bit(XPRT_SOCK_DATA_READY, &transport->sock_state))
			break;
		} else {
		}
		release_sock(sk);
		total += read;
		}
		rd_desc.count = 65536;
	}
	if (test_bit(XPRT_SOCK_DATA_READY, &transport->sock_state))
		queue_work(xprtiod_workqueue, &transport->recv_worker);
out:
	mutex_unlock(&transport->recv_mutex);
	trace_xs_tcp_data_ready(xprt, read, total);