From a51c4125245bea5fafa6e55ba17d826400415bb7 Mon Sep 17 00:00:00 2001 From: Chris Lew Date: Mon, 3 Oct 2022 09:58:46 -0700 Subject: [PATCH] net: qrtr: Do not take sock lock on blocking recv Socket client's should be able to block on recv without blocking other socket operations such as sending. The qrtr core logic should also be able to operate on the sock while a client is blocked in recv. Remove the sock lock from around the recv_datagram to allow execution to continue while a client is blocked in recv. Change-Id: I6adb09b8e44c5ff3542b88db87b376a3ae5cb5ba Signed-off-by: Jay Jayanna Signed-off-by: Chris Lew --- net/qrtr/af_qrtr.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index fe5d9cb49e85..099a36887a5d 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -1140,18 +1140,15 @@ static int qrtr_recvmsg(struct socket *sock, struct msghdr *msg, struct qrtr_cb *cb; int copied, rc; - lock_sock(sk); - if (sock_flag(sk, SOCK_ZAPPED)) { - release_sock(sk); + if (sock_flag(sk, SOCK_ZAPPED)) return -EADDRNOTAVAIL; - } skb = skb_recv_datagram(sk, flags, &rc); - if (!skb) { - release_sock(sk); + if (!skb) return rc; - } + + lock_sock(sk); cb = (struct qrtr_cb *)skb->cb; copied = skb->len;