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: Kuniyuki Iwashima <kuniyu@google.com> Link: https://patch.msgid.link/20250702223606.1054680-6-kuniyu@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
f4e1fb04c1
commit
8b77338eb2
+17
-16
@@ -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 @@ unlock:
|
||||
}
|
||||
|
||||
/* 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 @@ unlock:
|
||||
} 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:
|
||||
|
||||
Reference in New Issue
Block a user