From patchwork Wed May 8 06:06:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bjorn Andersson X-Patchwork-Id: 163620 Delivered-To: patch@linaro.org Received: by 2002:a05:6e02:81:0:0:0:0 with SMTP id l1csp2259756ilm; Tue, 7 May 2019 23:06:51 -0700 (PDT) X-Google-Smtp-Source: APXvYqxZAIFMZFuRc5l+IUfjGTaVpDr0QWrO2fM1fmDobN5YhkQ/OwL/pjhKY7wvztqXZxMmvmGw X-Received: by 2002:a63:6981:: with SMTP id e123mr44540521pgc.28.1557295611780; Tue, 07 May 2019 23:06:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1557295611; cv=none; d=google.com; s=arc-20160816; b=EyKE0cBwuWE/rZVULK63WzwwTobhG8OceUcD7y6vrr2DVpa8IMCvcjE4Zl2xz7Ri8s NVNBJY8O8xTZ9D1RZDT5ymyWQs07D3+KJ1tHtEmaO6UHc4cPHHNg+k+DpcfqzvWiC/hL WwQHFqGmBDGn6DK5CxdC/JuYeRBZUWCUxU2hTHJ7hBdOK+AoaElnC0iyROGWGBtk5gPJ MIlhy/VZHQ/o+JJAx7ygW3zFcKQ0WYLl79/DN/Z9rTuOJkuCPUyfWGPeFEjIM9ZCAG0u RM8vL06X275qGDm6xEEWcgPeOoou9RCxOIdrw4F10mQtWwZq7QMoWLw3Y7m53kCusyNQ /clw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=e6SrybXQBzQ/pQVF99s2mcphn7kgLGBW4wNCs7GR8pQ=; b=NFtMirvt50xwsuuiIiNaMAq4WYoZtVqKdhz0DSyRH1Va9LddKj4yVCQZmmvv9++k/w jKThr3nSdWIf4FPUFPWZ3JuTJwQFTv3oM2QHqGTDrMUBbZRtpxHL6HyFSbh5yeS+a0TB gdfxWnCmMFBawM4LYromEfhoqvkdQ7Ute3ANX7aKnkDdg6dNWL6KPbZqyW2+VSodm+f7 Enui4IgFhe2McV+qPiByZoiLkH9Qw1no34V6Dqnnkl8p7gSTh80C5W/t/QtTqITlBMtL Gk3GrKce8QtBy2+yUIW3rJPv87GexKW1kH8ypico9G4zIYtrDX7gRyWITm930oq451KO iTPQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=mnVP4QJs; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b13si11535643pgk.500.2019.05.07.23.06.51; Tue, 07 May 2019 23:06:51 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=mnVP4QJs; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728629AbfEHGGu (ORCPT + 30 others); Wed, 8 May 2019 02:06:50 -0400 Received: from mail-pg1-f193.google.com ([209.85.215.193]:33731 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726858AbfEHGGt (ORCPT ); Wed, 8 May 2019 02:06:49 -0400 Received: by mail-pg1-f193.google.com with SMTP id h17so3573094pgv.0 for ; Tue, 07 May 2019 23:06:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=e6SrybXQBzQ/pQVF99s2mcphn7kgLGBW4wNCs7GR8pQ=; b=mnVP4QJsmIS3xsrRwE0Oyy7T8OIVzjRrDafg0KhMdBVUdYpXBLZFy/TupNd2N9NMNz upHa/EiNFZmErX+Yaguhkr2Zsv6wf/vhmy8UdCqaFWsxWwOBYNi8X2+jl73r3epkoSwW NmSV4DMbfMJdcHEQTZ6uY3r1yvbHtke4jQCuIUOPuNbuQ58ER0LvNSrt5V5CCFKD1sFO 4+qa0O10hUQE40dCmaUltBFdNbSY7UFDkQrBBsYKbE79TfMNGG4IHk58ctqN2NlYU7mv DG4XmEY0Phvyr33d1YGONqxxMhYCWhUUyXtK15WMdv5lVujEiVZoiLW/h1oIskrGs+K5 sKxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=e6SrybXQBzQ/pQVF99s2mcphn7kgLGBW4wNCs7GR8pQ=; b=k5EdCH7sYXmVFPD0HpsH0g/6E5QbTEfS16M3JsdBAJgh1LWVkGlHV81VvXV37M73M5 Bc+YFGHYyguzRn5wm0vwZNBy8FFXr9ZxYOqbbjK+wz7U6DCETeR7FC628DqS4EbPdi5e +LVzyNA2+QI3lXmR6sGrGIFMKV4MrzWV+InlemMRWNc53khXh71IsWvNcH/QsHWodg74 uG6K6xhVg/eUqLPbissqT5MqZhLCF3FNrWcoGKntQOjrHrCGs4qSnO/CY8dnavjt2alu Q/+Hfb2cU7ie6M0iB+yA6Vu36/C8LyM+FqSq9m2+ooNS8XWhByfXv8OeLF2eETCBzwBC cpNQ== X-Gm-Message-State: APjAAAUj2LmKlIfl1Tu4B3xoavMrdF2DCQQHsXgS3COGUFE3+o+dezXO IDPEbrNjGjlWawFpnoyIcta5Aw== X-Received: by 2002:a62:e101:: with SMTP id q1mr46510709pfh.160.1557295608349; Tue, 07 May 2019 23:06:48 -0700 (PDT) Received: from localhost.localdomain (104-188-17-28.lightspeed.sndgca.sbcglobal.net. [104.188.17.28]) by smtp.gmail.com with ESMTPSA id t5sm2756130pgn.80.2019.05.07.23.06.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 07 May 2019 23:06:47 -0700 (PDT) From: Bjorn Andersson To: "David S. Miller" , Arun Kumar Neelakantam , Chris Lew Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org Subject: [PATCH 1/5] net: qrtr: Move resume-tx transmission to recvmsg Date: Tue, 7 May 2019 23:06:39 -0700 Message-Id: <20190508060643.30936-2-bjorn.andersson@linaro.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190508060643.30936-1-bjorn.andersson@linaro.org> References: <20190508060643.30936-1-bjorn.andersson@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The confirm-rx bit is used to implement a per port flow control, in order to make sure that no messages are dropped due to resource exhaustion. Move the resume-tx transmission to recvmsg to only confirm messages as they are consumed by the application. Signed-off-by: Bjorn Andersson --- net/qrtr/qrtr.c | 60 +++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 27 deletions(-) -- 2.18.0 diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index dd0e97f4f6c0..07a35362fba2 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c @@ -369,22 +369,11 @@ static void qrtr_port_put(struct qrtr_sock *ipc); static void qrtr_node_rx_work(struct work_struct *work) { struct qrtr_node *node = container_of(work, struct qrtr_node, work); - struct qrtr_ctrl_pkt *pkt; - struct sockaddr_qrtr dst; - struct sockaddr_qrtr src; struct sk_buff *skb; while ((skb = skb_dequeue(&node->rx_queue)) != NULL) { struct qrtr_sock *ipc; - struct qrtr_cb *cb; - int confirm; - - cb = (struct qrtr_cb *)skb->cb; - src.sq_node = cb->src_node; - src.sq_port = cb->src_port; - dst.sq_node = cb->dst_node; - dst.sq_port = cb->dst_port; - confirm = !!cb->confirm_rx; + struct qrtr_cb *cb = (struct qrtr_cb *)skb->cb; qrtr_node_assign(node, cb->src_node); @@ -397,20 +386,6 @@ static void qrtr_node_rx_work(struct work_struct *work) qrtr_port_put(ipc); } - - if (confirm) { - skb = qrtr_alloc_ctrl_packet(&pkt); - if (!skb) - break; - - pkt->cmd = cpu_to_le32(QRTR_TYPE_RESUME_TX); - pkt->client.node = cpu_to_le32(dst.sq_node); - pkt->client.port = cpu_to_le32(dst.sq_port); - - if (qrtr_node_enqueue(node, skb, QRTR_TYPE_RESUME_TX, - &dst, &src)) - break; - } } } @@ -822,6 +797,34 @@ static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) return rc; } +static int qrtr_resume_tx(struct qrtr_cb *cb) +{ + struct sockaddr_qrtr remote = { AF_QIPCRTR, cb->src_node, cb->src_port }; + struct sockaddr_qrtr local = { AF_QIPCRTR, cb->dst_node, cb->dst_port }; + struct qrtr_ctrl_pkt *pkt; + struct qrtr_node *node; + struct sk_buff *skb; + int ret; + + node = qrtr_node_lookup(remote.sq_node); + if (!node) + return -EINVAL; + + skb = qrtr_alloc_ctrl_packet(&pkt); + if (!skb) + return -ENOMEM; + + pkt->cmd = cpu_to_le32(QRTR_TYPE_RESUME_TX); + pkt->client.node = cpu_to_le32(cb->dst_node); + pkt->client.port = cpu_to_le32(cb->dst_port); + + ret = qrtr_node_enqueue(node, skb, QRTR_TYPE_RESUME_TX, &local, &remote); + + qrtr_node_release(node); + + return ret; +} + static int qrtr_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, int flags) { @@ -844,6 +847,7 @@ static int qrtr_recvmsg(struct socket *sock, struct msghdr *msg, release_sock(sk); return rc; } + cb = (struct qrtr_cb *)skb->cb; copied = skb->len; if (copied > size) { @@ -857,7 +861,6 @@ static int qrtr_recvmsg(struct socket *sock, struct msghdr *msg, rc = copied; if (addr) { - cb = (struct qrtr_cb *)skb->cb; addr->sq_family = AF_QIPCRTR; addr->sq_node = cb->src_node; addr->sq_port = cb->src_port; @@ -865,6 +868,9 @@ static int qrtr_recvmsg(struct socket *sock, struct msghdr *msg, } out: + if (cb->confirm_rx) + qrtr_resume_tx(cb); + skb_free_datagram(sk, skb); release_sock(sk); From patchwork Wed May 8 06:06:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bjorn Andersson X-Patchwork-Id: 163623 Delivered-To: patch@linaro.org Received: by 2002:a05:6e02:81:0:0:0:0 with SMTP id l1csp2259925ilm; Tue, 7 May 2019 23:07:05 -0700 (PDT) X-Google-Smtp-Source: APXvYqytq7wffKEy63RBEn2RRVnSg2LEXfU1/FDDhTPiGt5ciBKb/l8rNhj3sq2XU/+xAs5tXGaW X-Received: by 2002:a65:48ca:: with SMTP id o10mr45048382pgs.136.1557295625088; Tue, 07 May 2019 23:07:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1557295625; cv=none; d=google.com; s=arc-20160816; b=d3omgNHmMpF2cNxlO4AIPNyjUqQLvo9BjTxIcP3abDnWkXv+n5R1vcu0SRpk6YSwVp L7CKeyYhRcDynSBeMJCdtaCRU2ZcxEaH/eOAP8uQwYUceAx8BCql2OQKRebTWHuPA6v8 Jk2+5TPP1Q/7W2Mhd/2u/P4Ip8MB81JPRdRSqsx1nNbI24Mh+hufkkcUpwldZxYdXHn3 moNdBC5HOeSSrIrIpArxhOVS7Wcxlwrmtn1KumyvaKv5Rd4R51GquKHVcjeY8qaGfp7X P13K4u6YeUUMr+GRMx1SX2ywOCB5LhnhPZlFgBNQDbza/gnGosL5Qewk+6m5oD1/SJzW swhA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=weXR0ozFuBouXZ8KcycdlER5X3DNpYZdQnnp0CK/2lg=; b=LJGprOTCc5wWa/D3NtaX/iWczFcpIhhWth0eWAaA/z6s4yNie0Zb8bYefVP1LBGNkd xR9B24iPpXC9xROT4dUeX/W2QdyziXOdxqZtbWxKDGYsXxmuwsUnMBx2QV+p6m3GXSYK sk3H6fyfBIqhwC+YxOaNP9pUHeusqjt8Rh8x4fmxVdm+PsYSOkvfIcSGvwsxCMvH2MZw iFoEukhKzM9IfC5sl/afabnepExem3e7AUkUObwRBQephgWy7/stqiipZBKQMXgMQtPO y/8qsergATWk2x/20uGD1Z57d1sEruEUZHFSEyclKLDP64x8kO7AMzAxKSDXBP/edQjp COiw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=mkdN9syq; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u1si21190664pgr.347.2019.05.07.23.07.04; Tue, 07 May 2019 23:07:05 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=mkdN9syq; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728655AbfEHGGx (ORCPT + 30 others); Wed, 8 May 2019 02:06:53 -0400 Received: from mail-pf1-f193.google.com ([209.85.210.193]:40322 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728623AbfEHGGu (ORCPT ); Wed, 8 May 2019 02:06:50 -0400 Received: by mail-pf1-f193.google.com with SMTP id u17so9933109pfn.7 for ; Tue, 07 May 2019 23:06:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=weXR0ozFuBouXZ8KcycdlER5X3DNpYZdQnnp0CK/2lg=; b=mkdN9syqvzlVse/daNYDUR2HnLOM2uWwamfO2Rkh/MYGR7TrSw8ugaxkCSPV9+txEO NlExxcgbG0l5RS7Vx2hbALWM/4AyUox0g961hWsrTFmAzj2IEyXyo9U/rhqITPH1aLgJ E8MBFBmPeP9b84aYf9SDPc43NyVN1J7sZKIdYLRAI9OGmcW9KJrpUhOw2Tw8hfyXhl+k TnE4ASpsvGE01ZQablbcwc6/NIzqCb9nxeLXtrqz88RTuEpv70GzUSoC3cQPyHVzKKbw u/CfnhCbVlkhRZPZkITk5g4dvvtE9woC9Aox5upOuuuwHmWQoFVgd8a4kYgssHterYQX bdBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=weXR0ozFuBouXZ8KcycdlER5X3DNpYZdQnnp0CK/2lg=; b=YfQiqg5Arkj+BI1dM/YXrecrRfvJna6L5cn8oVHR2ucqhOpC3AXus90ivBYu+UdPke sUfBygJL9Cmzu6uFzO73MpvX2UkUW+ELv6mKQc5OJl2Gb6ImzAX/SCSss1jgPXvAAsoH 8kogOUx4Gygv6Kt6ut5ISCK6QrejhDZLeLcaCFgj6n7iuUzDSX8RmsYH2cCPmoQZQB29 0K2sZGrrY/wP6+EsxEFVp3xdMeEZJvyhUGweBuD34eBb0UunpZ+eBpqLnfu61qQd1LAA Dwfd/yfigU7gMoln5K3cgFfsIe4dz3ZtXEg5ImjfA0gcx/3JrS5vf8uaam1ZH8WP7mZ5 4+uA== X-Gm-Message-State: APjAAAWHMYqWp5by8K7hS6zJS7XbhjF3fFSBG8XYnTIhI2mSo9yTdKDm 0UmtwT0K+162l9xtYiwAEXuHDQ== X-Received: by 2002:a63:c24c:: with SMTP id l12mr29315720pgg.173.1557295609480; Tue, 07 May 2019 23:06:49 -0700 (PDT) Received: from localhost.localdomain (104-188-17-28.lightspeed.sndgca.sbcglobal.net. [104.188.17.28]) by smtp.gmail.com with ESMTPSA id t5sm2756130pgn.80.2019.05.07.23.06.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 07 May 2019 23:06:48 -0700 (PDT) From: Bjorn Andersson To: "David S. Miller" , Arun Kumar Neelakantam , Chris Lew Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org Subject: [PATCH 2/5] net: qrtr: Implement outgoing flow control Date: Tue, 7 May 2019 23:06:40 -0700 Message-Id: <20190508060643.30936-3-bjorn.andersson@linaro.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190508060643.30936-1-bjorn.andersson@linaro.org> References: <20190508060643.30936-1-bjorn.andersson@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In order to prevent overconsumption of resources on the remote side QRTR implements a flow control mechanism. The mechanism works by the sender keeping track of the number of outstanding unconfirmed messages that has been transmitted to a particular node/port pair. Upon count reaching a low watermark (L) the confirm_rx bit is set in the outgoing message and when the count reaching a high watermark (H) transmission will be blocked upon the reception of a resume_tx message from the remote, that resets the counter to 0. This guarantees that there will be at most 2H - L messages in flight. Values chosen for L and H are 5 and 10 respectively. Signed-off-by: Bjorn Andersson --- net/qrtr/qrtr.c | 143 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 136 insertions(+), 7 deletions(-) -- 2.18.0 diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index 07a35362fba2..62abd622618d 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c @@ -16,6 +16,7 @@ #include #include /* For TIOCINQ/OUTQ */ #include +#include #include @@ -121,6 +122,9 @@ static DEFINE_MUTEX(qrtr_port_lock); * @ep: endpoint * @ref: reference count for node * @nid: node id + * @qrtr_tx_flow: tree with tx counts per flow + * @resume_tx: waiters for a resume tx from the remote + * @qrtr_tx_lock: lock for qrtr_tx_flow * @rx_queue: receive queue * @work: scheduled work struct for recv work * @item: list item for broadcast list @@ -131,11 +135,26 @@ struct qrtr_node { struct kref ref; unsigned int nid; + struct radix_tree_root qrtr_tx_flow; + struct wait_queue_head resume_tx; + struct mutex qrtr_tx_lock; /* for qrtr_tx_flow */ + struct sk_buff_head rx_queue; struct work_struct work; struct list_head item; }; +/** + * struct qrtr_tx_flow - tx flow control + * @pending: number of waiting senders + */ +struct qrtr_tx_flow { + atomic_t pending; +}; + +#define QRTR_TX_FLOW_HIGH 10 +#define QRTR_TX_FLOW_LOW 5 + static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb, int type, struct sockaddr_qrtr *from, struct sockaddr_qrtr *to); @@ -150,7 +169,9 @@ static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb, */ static void __qrtr_node_release(struct kref *kref) { + struct radix_tree_iter iter; struct qrtr_node *node = container_of(kref, struct qrtr_node, ref); + void __rcu **slot; if (node->nid != QRTR_EP_NID_AUTO) radix_tree_delete(&qrtr_nodes, node->nid); @@ -158,6 +179,12 @@ static void __qrtr_node_release(struct kref *kref) list_del(&node->item); mutex_unlock(&qrtr_node_lock); + /* Free tx flow counters */ + radix_tree_for_each_slot(slot, &node->qrtr_tx_flow, &iter, 0) { + radix_tree_iter_delete(&node->qrtr_tx_flow, &iter, slot); + kfree(*slot); + } + skb_queue_purge(&node->rx_queue); kfree(node); } @@ -178,15 +205,106 @@ static void qrtr_node_release(struct qrtr_node *node) kref_put_mutex(&node->ref, __qrtr_node_release, &qrtr_node_lock); } +/** + * qrtr_tx_resume() - reset flow control counter + * @node: qrtr_node that the QRTR_TYPE_RESUME_TX packet arrived on + * @skb: resume_tx packet + */ +static void qrtr_tx_resume(struct qrtr_node *node, struct sk_buff *skb) +{ + struct qrtr_ctrl_pkt *pkt = (struct qrtr_ctrl_pkt *)skb->data; + struct qrtr_tx_flow *flow; + unsigned long key; + u64 remote_node = le32_to_cpu(pkt->client.node); + u32 remote_port = le32_to_cpu(pkt->client.port); + + key = remote_node << 32 | remote_port; + + flow = radix_tree_lookup(&node->qrtr_tx_flow, key); + if (flow) + atomic_set(&flow->pending, 0); + + wake_up_interruptible_all(&node->resume_tx); + + consume_skb(skb); +} + +/** + * qrtr_tx_wait() - flow control for outgoing packets + * @node: qrtr_node that the packet is to be send to + * @dest_node: node id of the destination + * @dest_port: port number of the destination + * @type: type of message + * + * The flow control scheme is based around the low and high "watermarks". When + * the low watermark is passed the confirm_rx flag is set on the outgoing + * message, which will trigger the remote to send a control message of the type + * QRTR_TYPE_RESUME_TX to reset the counter. If the high watermark is hit + * further transmision should be paused. + * + * Return: 1 if confirm_rx should be set, 0 otherwise or errno failure + */ +static int qrtr_tx_wait(struct qrtr_node *node, int dest_node, int dest_port, + int type) +{ + struct qrtr_tx_flow *flow; + unsigned long key = (u64)dest_node << 32 | dest_port; + int confirm_rx = 0; + int ret; + + /* Never set confirm_rx on non-data packets */ + if (type != QRTR_TYPE_DATA) + return 0; + + mutex_lock(&node->qrtr_tx_lock); + flow = radix_tree_lookup(&node->qrtr_tx_flow, key); + if (!flow) { + flow = kzalloc(sizeof(*flow), GFP_KERNEL); + if (!flow) + confirm_rx = 1; + else + radix_tree_insert(&node->qrtr_tx_flow, key, flow); + } + mutex_unlock(&node->qrtr_tx_lock); + + for (;;) { + ret = wait_event_interruptible(node->resume_tx, + atomic_read(&flow->pending) < QRTR_TX_FLOW_HIGH || + !node->ep); + if (ret) + return ret; + + if (!node->ep) + return -EPIPE; + + mutex_lock(&node->qrtr_tx_lock); + if (atomic_read(&flow->pending) < QRTR_TX_FLOW_HIGH) { + confirm_rx = atomic_inc_return(&flow->pending) == QRTR_TX_FLOW_LOW; + mutex_unlock(&node->qrtr_tx_lock); + break; + } + mutex_unlock(&node->qrtr_tx_lock); + } + + return confirm_rx; +} + /* Pass an outgoing packet socket buffer to the endpoint driver. */ static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb, int type, struct sockaddr_qrtr *from, struct sockaddr_qrtr *to) { struct qrtr_hdr_v1 *hdr; + int confirm_rx; size_t len = skb->len; int rc = -ENODEV; + confirm_rx = qrtr_tx_wait(node, to->sq_node, to->sq_port, type); + if (confirm_rx < 0) { + kfree_skb(skb); + return confirm_rx; + } + hdr = skb_push(skb, sizeof(*hdr)); hdr->version = cpu_to_le32(QRTR_PROTO_VER_1); hdr->type = cpu_to_le32(type); @@ -201,7 +319,7 @@ static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb, } hdr->size = cpu_to_le32(len); - hdr->confirm_rx = 0; + hdr->confirm_rx = !!confirm_rx; skb_put_padto(skb, ALIGN(len, 4)); @@ -318,7 +436,8 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len) if (len != ALIGN(size, 4) + hdrlen) goto err; - if (cb->dst_port != QRTR_PORT_CTRL && cb->type != QRTR_TYPE_DATA) + if (cb->dst_port != QRTR_PORT_CTRL && cb->type != QRTR_TYPE_DATA && + cb->type != QRTR_TYPE_RESUME_TX) goto err; skb_put_data(skb, data + hdrlen, size); @@ -377,14 +496,18 @@ static void qrtr_node_rx_work(struct work_struct *work) qrtr_node_assign(node, cb->src_node); - ipc = qrtr_port_lookup(cb->dst_port); - if (!ipc) { - kfree_skb(skb); + if (cb->type == QRTR_TYPE_RESUME_TX) { + qrtr_tx_resume(node, skb); } else { - if (sock_queue_rcv_skb(&ipc->sk, skb)) + ipc = qrtr_port_lookup(cb->dst_port); + if (!ipc) { kfree_skb(skb); + } else { + if (sock_queue_rcv_skb(&ipc->sk, skb)) + kfree_skb(skb); - qrtr_port_put(ipc); + qrtr_port_put(ipc); + } } } } @@ -415,6 +538,9 @@ int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int nid) node->nid = QRTR_EP_NID_AUTO; node->ep = ep; + INIT_RADIX_TREE(&node->qrtr_tx_flow, GFP_KERNEL); + init_waitqueue_head(&node->resume_tx); + qrtr_node_assign(node, nid); mutex_lock(&qrtr_node_lock); @@ -449,6 +575,9 @@ void qrtr_endpoint_unregister(struct qrtr_endpoint *ep) qrtr_local_enqueue(NULL, skb, QRTR_TYPE_BYE, &src, &dst); } + /* Wake up any transmitters waiting for resume-tx from the node */ + wake_up_interruptible_all(&node->resume_tx); + qrtr_node_release(node); ep->node = NULL; } From patchwork Wed May 8 06:06:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bjorn Andersson X-Patchwork-Id: 163624 Delivered-To: patch@linaro.org Received: by 2002:a05:6e02:81:0:0:0:0 with SMTP id l1csp2259988ilm; Tue, 7 May 2019 23:07:09 -0700 (PDT) X-Google-Smtp-Source: APXvYqzBBD5dIiLgNKlQC8RRxuKEx1DLSlKLBFdb5f6WhLT68QSocnozREIxt6R28FGx6Rqcx7eC X-Received: by 2002:a63:c509:: with SMTP id f9mr22937716pgd.143.1557295629727; Tue, 07 May 2019 23:07:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1557295629; cv=none; d=google.com; s=arc-20160816; b=0V4lQ66PCvbFovvqyvDUjxO9Stp17prceaVeLIrQAcfcSvmlH+jLI0kLGX1DbtmAyX +4UMXLqLoPkJxsuz5P6d7dVF5F3Qi903Vo7JRl7AQZAbN1xOM7oE1/BN1pVzAVEvT7Tn 4oZGT6HwzhCd02Lk2U3LS6CD8G1v2/J037Vy2oPp5PzQ0pMgZuGPcIqOXn8KWJ0GDDz0 LqDnoVYz2flOJeazbFGGwIDJ7NecGXS2NBbeW4Svo9qaiQf4p6uu33WDKfLPhEJJf7b5 AYi83Hi0w8MgES90bk5ORUZ3800e2ZR+ovLiw3TBDk60e+SiQfdbwhJya1cXEQT/PmoV 4tgw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=5IgbbTEWxx9612vWZb+A6P+LPisYaMkTp+oYoBjVljQ=; b=HbLs+YVikSWDKnymhRXbwCWJOejNaBnpKjVQ59o2u35os9eBi6od+WOByX3jEBxu+2 wpEVK8hqJfnSjMi51NwfqCRGt0V1qtpe0ewZndjJHFXNFCEUlEvYNINhLeScpkOeBDvf zqrsHg3HmDh0UkSB48yup6/NL2CnyhDV4gDd3E6xKDgMXqeh8cUh8qKWQ9jO3GPnisLc pqYqkhMXvxJ9JT015qgtz8Jj0siJCBeOcLp4kCJD0zmwhO5yqJqDtFhcHI18nGfl/mOI 0ZQgyoihkSdZtFbPJVkPxEs/FD0zgbKWEXTs2XsGv1ojx8MA2vX8rZuZBBr9vp4RBKBg P+9g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="L/bxrM+J"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f5si20113540pgs.86.2019.05.07.23.07.09; Tue, 07 May 2019 23:07:09 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="L/bxrM+J"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728700AbfEHGHI (ORCPT + 30 others); Wed, 8 May 2019 02:07:08 -0400 Received: from mail-pl1-f193.google.com ([209.85.214.193]:40547 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728630AbfEHGGv (ORCPT ); Wed, 8 May 2019 02:06:51 -0400 Received: by mail-pl1-f193.google.com with SMTP id b3so9382162plr.7 for ; Tue, 07 May 2019 23:06:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=5IgbbTEWxx9612vWZb+A6P+LPisYaMkTp+oYoBjVljQ=; b=L/bxrM+JHPq69ydLVroJHc6ezcUZtRdVhf8h5c+uTnt5DKqt1RUtVh2oS3D7/r5B1H KFjM/EMJ6gZqR6GRjMPALRLwQc5h9sCopFUYQj2XRNFTvy/tHj17VkppsfdskI8iBq/C i2AQmfR0Rzrmzsy89Hwwf7wbo2TpP9hHNyA9qzzxhnFAYeV1ouBVauOx40r/6+IPTt2A LJMMBerTq6n4+jaAmbXexhvnKYmVU660ABRSAUngUJE5/rC8cpU7TZP0zLDNFPXHoDEX +nT4FJF9HEls18UXmV60PR/kQDqAUNkmKPkOVG6RFCO1IovVSjRfTyIHXQVZbCROmuPR 63WQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=5IgbbTEWxx9612vWZb+A6P+LPisYaMkTp+oYoBjVljQ=; b=cSRJsqjNUUQr1J20YjPINaPpGkFCtO4nQcSWW7ynz0T3bAJk/JiUi2vupb8l1cvGuB CkDZB1X7EY4KmAYeUqZJ0iXKOIb2+uVbTCdT/k63BjMmOft6fbPHHtnZzixDdayAd2p9 Xoh3hNfgt8ALGlTIzmhWsYccyIcBM+bATJ1u0S1YvaHyMTnOWLrOvvmvtuH8WjriJaDg scf8B3RtJ7MTJ2TZrfmiwd8wWc/TArS3tzrqHjttfz241tYWj4wXlx0mED7aZ4KkptFX wEBMVv+YgnNuLiCKsKPdk882qS5WqK5hEWmL4ppGCXkMLIgR2E/DZtIkSosO/4jmY83y AiGw== X-Gm-Message-State: APjAAAXaWk0cpb+bY0dr8uY/JFFLURL4AHfoWb4GhKrnZo9wDODjTQvB JJPZmmFW7mCazEZUjPnxltx2Qq91s6U= X-Received: by 2002:a17:902:8ec6:: with SMTP id x6mr43914309plo.123.1557295610614; Tue, 07 May 2019 23:06:50 -0700 (PDT) Received: from localhost.localdomain (104-188-17-28.lightspeed.sndgca.sbcglobal.net. [104.188.17.28]) by smtp.gmail.com with ESMTPSA id t5sm2756130pgn.80.2019.05.07.23.06.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 07 May 2019 23:06:49 -0700 (PDT) From: Bjorn Andersson To: "David S. Miller" , Arun Kumar Neelakantam , Chris Lew Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org Subject: [PATCH 3/5] net: qrtr: Migrate node lookup tree to spinlock Date: Tue, 7 May 2019 23:06:41 -0700 Message-Id: <20190508060643.30936-4-bjorn.andersson@linaro.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190508060643.30936-1-bjorn.andersson@linaro.org> References: <20190508060643.30936-1-bjorn.andersson@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Move operations on the qrtr_nodes radix tree under a separate spinlock and make the qrtr_nodes tree GFP_ATOMIC, to allow operation from atomic context in a subsequent patch. Signed-off-by: Bjorn Andersson --- net/qrtr/qrtr.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) -- 2.18.0 diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index 62abd622618d..9075751028a2 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c @@ -16,6 +16,7 @@ #include #include /* For TIOCINQ/OUTQ */ #include +#include #include #include @@ -106,10 +107,11 @@ static inline struct qrtr_sock *qrtr_sk(struct sock *sk) static unsigned int qrtr_local_nid = NUMA_NO_NODE; /* for node ids */ -static RADIX_TREE(qrtr_nodes, GFP_KERNEL); +static RADIX_TREE(qrtr_nodes, GFP_ATOMIC); +static DEFINE_SPINLOCK(qrtr_nodes_lock); /* broadcast list */ static LIST_HEAD(qrtr_all_nodes); -/* lock for qrtr_nodes, qrtr_all_nodes and node reference */ +/* lock for qrtr_all_nodes and node reference */ static DEFINE_MUTEX(qrtr_node_lock); /* local port allocation management */ @@ -171,10 +173,13 @@ static void __qrtr_node_release(struct kref *kref) { struct radix_tree_iter iter; struct qrtr_node *node = container_of(kref, struct qrtr_node, ref); + unsigned long flags; void __rcu **slot; + spin_lock_irqsave(&qrtr_nodes_lock, flags); if (node->nid != QRTR_EP_NID_AUTO) radix_tree_delete(&qrtr_nodes, node->nid); + spin_unlock_irqrestore(&qrtr_nodes_lock, flags); list_del(&node->item); mutex_unlock(&qrtr_node_lock); @@ -340,11 +345,12 @@ static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb, static struct qrtr_node *qrtr_node_lookup(unsigned int nid) { struct qrtr_node *node; + unsigned long flags; - mutex_lock(&qrtr_node_lock); + spin_lock_irqsave(&qrtr_nodes_lock, flags); node = radix_tree_lookup(&qrtr_nodes, nid); node = qrtr_node_acquire(node); - mutex_unlock(&qrtr_node_lock); + spin_unlock_irqrestore(&qrtr_nodes_lock, flags); return node; } @@ -356,13 +362,15 @@ static struct qrtr_node *qrtr_node_lookup(unsigned int nid) */ static void qrtr_node_assign(struct qrtr_node *node, unsigned int nid) { + unsigned long flags; + if (node->nid != QRTR_EP_NID_AUTO || nid == QRTR_EP_NID_AUTO) return; - mutex_lock(&qrtr_node_lock); + spin_lock_irqsave(&qrtr_nodes_lock, flags); radix_tree_insert(&qrtr_nodes, nid, node); node->nid = nid; - mutex_unlock(&qrtr_node_lock); + spin_unlock_irqrestore(&qrtr_nodes_lock, flags); } /** From patchwork Wed May 8 06:06:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bjorn Andersson X-Patchwork-Id: 163622 Delivered-To: patch@linaro.org Received: by 2002:a05:6e02:81:0:0:0:0 with SMTP id l1csp2259853ilm; Tue, 7 May 2019 23:07:00 -0700 (PDT) X-Google-Smtp-Source: APXvYqxFoYwBN316EEzOp9AFn9KD0eDg9dFU8EB1Yet0e7GvvdbKZRFcnsETUVYXwS1w9jxx1q5y X-Received: by 2002:a17:902:8bc7:: with SMTP id r7mr22338353plo.74.1557295620172; Tue, 07 May 2019 23:07:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1557295620; cv=none; d=google.com; s=arc-20160816; b=Icrs4IbYw14X/caf6NUAZdjIW6/58etN3pTqRV0oV2QMO7bad270TnuwGZiz+PucZJ YRfGCEQW/50SfZW08RQOP7FYDIWCMEy6H/bWxxQi0egshi366v7hjm3gwCIeZa42RgmY ppnRr/Hi9sDVUG3gbJ2l3chBWK9TbMJVV78q2C+XI9vXkBP+h6eTZ9LIhcZdXAKImAoq E7YKgZ5RkszuglME7r0luk3HsGe0Dg0dfNZ4oMoeUF+2uBm9kkYX49btZQA9BNlhDGNY XSXAKtuE5g/ylGne+qN1jnUCqVUFzcSgZu0iqX5GV2r7Z4aXDjqrWRDolFomtT9dwZuE 5Sgw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=5QvIkqbGDWQGjQdB0qAWbmXE/7oiAphBuUP129NNJWE=; b=zcdw0tk+8ITxVdYe/zk+Y94GZpy0CWW64V0SGJfYIHAIS9u/qvMY5wCSEKBlI3S8Zs pfKULZF/7ZEe/uN0CXLQiHsuAb2ToGu9wMCAlh+GiFL/HopmV6XgyqKv+6D1pBTRn498 3zvLqnmPBdCO7oyWgHLdl2ZJZ0tnnuzm0Jix4zfo/inTubWRssyo2ZJoyaaZ6x3Jf5/J uMhh9kFzfRWQ1ZoCjbZYzRUP9bkS1f/US0r1WcbepJiLtb8Q35KT0VHpeKDuRu6dcvp7 lw+bF0LgLHwvKTB1ZC6E4KCSG/RRPY3sGnl26amVBPl5WA3kdfl1Ht68g+aXgN62QXdg qfPQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=XlyYvX0t; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s2si14650241pge.237.2019.05.07.23.06.58; Tue, 07 May 2019 23:07:00 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=XlyYvX0t; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728681AbfEHGG6 (ORCPT + 30 others); Wed, 8 May 2019 02:06:58 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:44886 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728656AbfEHGGx (ORCPT ); Wed, 8 May 2019 02:06:53 -0400 Received: by mail-pg1-f195.google.com with SMTP id z16so9536200pgv.11 for ; Tue, 07 May 2019 23:06:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=5QvIkqbGDWQGjQdB0qAWbmXE/7oiAphBuUP129NNJWE=; b=XlyYvX0tNDttRdrX9Y56BXVlXB+gkmyxJXfc2/BRsx+beiWJQjcRC/0Rd971GPHLi+ oH8Rx2zMq46kxdWEeuN5mz5tAEolSZ/ESm0UgIjEsxdeoVZvs3oJLeiVJkHg8W9wBuaW YmWBLtX3pA96S+nSWGrh5bKMgetnNbAf4VKMpoHJCynFwIuQKZ5m4GTgiKEnzduJ0wM6 mDpUSpotslyr/9KdLEntdOICFYnuTxxCfIeQl0ib270QMtYBrHp1eeNZbpQ5BYBez8gw Z4+gNmwvFGHR3mRT687M2M3ReUiLN9seiY0yi3Z5QdMfbAKM1w47s/bxtCApOGHlZ8Ss Ilkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=5QvIkqbGDWQGjQdB0qAWbmXE/7oiAphBuUP129NNJWE=; b=uCi9MlYLvc6clbNt1MD8+0QYEljhRut6XDMTMj6b4OYBYCWDawLbKd4bVgNBB2BiRc B+pYGQ3ZhXdTn831DgKGXQ68zKCQX+pcsBVtXKt/JGCcBm7lnc5lsH+lxMHmT3XuXnYd dtp88pnT/mUnc/SnDyxwDptSlkDt6IksNWiaYZh0aodCO3mjlu4SaAN0HRzjylSNImBr 4R4e5gUzUt8j9EtU26gGJ5J86+WsD3bNN9Ln5wZjkPu4OubCmqcoCeF+gc7SARmvcuMQ sPRdiYnIK0aOmFsCim32F1pqjSiSrvLyzEvFt1x/6vUyL9JyCyie34zrg/xQt4vgr+nb Zy7w== X-Gm-Message-State: APjAAAWv+lQPHb/Jy5E3ieKg7gx5w2xUfG7pkAT3k4Z8kPmiJBm+uNbk APRkUt40kFNS9bb+2mAZVBCFhw== X-Received: by 2002:a63:7c6:: with SMTP id 189mr44184260pgh.247.1557295612735; Tue, 07 May 2019 23:06:52 -0700 (PDT) Received: from localhost.localdomain (104-188-17-28.lightspeed.sndgca.sbcglobal.net. [104.188.17.28]) by smtp.gmail.com with ESMTPSA id t5sm2756130pgn.80.2019.05.07.23.06.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 07 May 2019 23:06:52 -0700 (PDT) From: Bjorn Andersson To: "David S. Miller" , Arun Kumar Neelakantam , Chris Lew Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org Subject: [PATCH 5/5] net: qrtr: Remove receive worker Date: Tue, 7 May 2019 23:06:43 -0700 Message-Id: <20190508060643.30936-6-bjorn.andersson@linaro.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190508060643.30936-1-bjorn.andersson@linaro.org> References: <20190508060643.30936-1-bjorn.andersson@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Rather than enqueuing messages and scheduling a worker to deliver them to the individual sockets we can now, thanks to the previous work, move this directly into the endpoint callback. This saves us a context switch per incoming message and removes the possibility of an opportunistic suspend to happen between the message is coming from the endpoint until it ends up in the socket's receive buffer. Signed-off-by: Bjorn Andersson --- net/qrtr/qrtr.c | 54 ++++++++++++++++--------------------------------- 1 file changed, 17 insertions(+), 37 deletions(-) -- 2.18.0 diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index d2eef43a3124..25cd5ddce5b9 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c @@ -163,6 +163,8 @@ static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb, static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb, int type, struct sockaddr_qrtr *from, struct sockaddr_qrtr *to); +static struct qrtr_sock *qrtr_port_lookup(int port); +static void qrtr_port_put(struct qrtr_sock *ipc); /* Release node resources and free the node. * @@ -386,6 +388,7 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len) struct qrtr_node *node = ep->node; const struct qrtr_hdr_v1 *v1; const struct qrtr_hdr_v2 *v2; + struct qrtr_sock *ipc; struct sk_buff *skb; struct qrtr_cb *cb; unsigned int size; @@ -450,8 +453,20 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len) skb_put_data(skb, data + hdrlen, size); - skb_queue_tail(&node->rx_queue, skb); - schedule_work(&node->work); + qrtr_node_assign(node, cb->src_node); + + if (cb->type == QRTR_TYPE_RESUME_TX) { + qrtr_tx_resume(node, skb); + } else { + ipc = qrtr_port_lookup(cb->dst_port); + if (!ipc) + goto err; + + if (sock_queue_rcv_skb(&ipc->sk, skb)) + goto err; + + qrtr_port_put(ipc); + } return 0; @@ -486,40 +501,6 @@ static struct sk_buff *qrtr_alloc_ctrl_packet(struct qrtr_ctrl_pkt **pkt) return skb; } -static struct qrtr_sock *qrtr_port_lookup(int port); -static void qrtr_port_put(struct qrtr_sock *ipc); - -/* Handle and route a received packet. - * - * This will auto-reply with resume-tx packet as necessary. - */ -static void qrtr_node_rx_work(struct work_struct *work) -{ - struct qrtr_node *node = container_of(work, struct qrtr_node, work); - struct sk_buff *skb; - - while ((skb = skb_dequeue(&node->rx_queue)) != NULL) { - struct qrtr_sock *ipc; - struct qrtr_cb *cb = (struct qrtr_cb *)skb->cb; - - qrtr_node_assign(node, cb->src_node); - - if (cb->type == QRTR_TYPE_RESUME_TX) { - qrtr_tx_resume(node, skb); - } else { - ipc = qrtr_port_lookup(cb->dst_port); - if (!ipc) { - kfree_skb(skb); - } else { - if (sock_queue_rcv_skb(&ipc->sk, skb)) - kfree_skb(skb); - - qrtr_port_put(ipc); - } - } - } -} - /** * qrtr_endpoint_register() - register a new endpoint * @ep: endpoint to register @@ -539,7 +520,6 @@ int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int nid) if (!node) return -ENOMEM; - INIT_WORK(&node->work, qrtr_node_rx_work); kref_init(&node->ref); mutex_init(&node->ep_lock); skb_queue_head_init(&node->rx_queue);