Commit 8b77338e authored by Kuniyuki Iwashima's avatar Kuniyuki Iwashima Committed by Jakub Kicinski
Browse files

af_unix: Cache state->msg in unix_stream_read_generic().



In unix_stream_read_generic(), state->msg is fetched multiple times.

Let's cache it in a local variable.

Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@google.com>
Link: https://patch.msgid.link/20250702223606.1054680-6-kuniyu@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent f4e1fb04
Loading
Loading
Loading
Loading
+17 −16
Original line number Diff line number Diff line
@@ -2840,20 +2840,21 @@ static int unix_stream_read_skb(struct sock *sk, skb_read_actor_t recv_actor)
static int unix_stream_read_generic(struct unix_stream_read_state *state,
				    bool freezable)
{
	struct scm_cookie scm;
	int noblock = state->flags & MSG_DONTWAIT;
	struct socket *sock = state->socket;
	struct msghdr *msg = state->msg;
	struct sock *sk = sock->sk;
	struct unix_sock *u = unix_sk(sk);
	int copied = 0;
	size_t size = state->size;
	int flags = state->flags;
	int noblock = flags & MSG_DONTWAIT;
	bool check_creds = false;
	int target;
	struct scm_cookie scm;
	unsigned int last_len;
	struct unix_sock *u;
	int copied = 0;
	int err = 0;
	long timeo;
	int target;
	int skip;
	size_t size = state->size;
	unsigned int last_len;

	if (unlikely(READ_ONCE(sk->sk_state) != TCP_ESTABLISHED)) {
		err = -EINVAL;
@@ -2873,6 +2874,8 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state,

	memset(&scm, 0, sizeof(scm));

	u = unix_sk(sk);

	/* Lock the socket to prevent queue disordering
	 * while sleeps in memcpy_tomsg
	 */
@@ -2964,14 +2967,12 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state,
		}

		/* Copy address just once */
		if (state->msg && state->msg->msg_name) {
			DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr,
					 state->msg->msg_name);
			unix_copy_addr(state->msg, skb->sk);
		if (msg && msg->msg_name) {
			DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, msg->msg_name);

			BPF_CGROUP_RUN_PROG_UNIX_RECVMSG_LOCK(sk,
							      state->msg->msg_name,
							      &state->msg->msg_namelen);
			unix_copy_addr(msg, skb->sk);
			BPF_CGROUP_RUN_PROG_UNIX_RECVMSG_LOCK(sk, msg->msg_name,
							      &msg->msg_namelen);

			sunaddr = NULL;
		}
@@ -3033,8 +3034,8 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state,
	} while (size);

	mutex_unlock(&u->iolock);
	if (state->msg)
		scm_recv_unix(sock, state->msg, &scm, flags);
	if (msg)
		scm_recv_unix(sock, msg, &scm, flags);
	else
		scm_destroy(&scm);
out: