From 9f4ad55602210f68e5628f18246bee649fbfb241 Mon Sep 17 00:00:00 2001 From: Chris Lew Date: Mon, 4 May 2020 11:33:56 -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: Chris Lew --- net/qrtr/qrtr.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index f413384bcccf..57469f4898b9 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c @@ -1656,19 +1656,16 @@ 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 & ~MSG_DONTWAIT, flags & MSG_DONTWAIT, &rc); - if (!skb) { - release_sock(sk); + if (!skb) return rc; - } + + lock_sock(sk); cb = (struct qrtr_cb *)skb->cb; copied = skb->len;