From cdb150a51573d238a3a46b49072ffc03c5035847 Mon Sep 17 00:00:00 2001 From: Chris Lew Date: Tue, 7 Apr 2020 17:46:26 -0700 Subject: [PATCH] net: qrtr: Check for exisiting waiters Some non-blocking clients may not wait for the OUT event from select or poll before resending to a flow controlled port. Check for exisiting waiters before allocating a new one so these clients do not exhaust the memory pool. Change-Id: I5fc40d5b1d1819ea5bf94438c04ee42b42639ebc Signed-off-by: Chris Lew --- net/qrtr/qrtr.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index 361c5a8f8837..f413384bcccf 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c @@ -500,6 +500,12 @@ static int qrtr_tx_wait(struct qrtr_node *node, struct sockaddr_qrtr *to, break; } if (!ret) { + list_for_each_entry(waiter, &flow->waiters, node) { + if (waiter->sk == sk) { + mutex_unlock(&node->qrtr_tx_lock); + return -EAGAIN; + } + } waiter = kzalloc(sizeof(*waiter), GFP_KERNEL); if (!waiter) { mutex_unlock(&node->qrtr_tx_lock); @@ -508,6 +514,8 @@ static int qrtr_tx_wait(struct qrtr_node *node, struct sockaddr_qrtr *to, waiter->sk = sk; sock_hold(sk); list_add_tail(&waiter->node, &flow->waiters); + QRTR_INFO(node->ilc, "new waiter for [0x%x:0x%x]\n", + to->sq_node, to->sq_port); mutex_unlock(&node->qrtr_tx_lock); return -EAGAIN; }