From patchwork Fri Nov 6 17:33:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Loic Poulain X-Patchwork-Id: 320809 Delivered-To: patch@linaro.org Received: by 2002:a17:906:d156:0:0:0:0 with SMTP id br22csp634199ejb; Fri, 6 Nov 2020 09:27:18 -0800 (PST) X-Google-Smtp-Source: ABdhPJyr4KfrdBJn/Zj+w0HFfex6LR/vOXcvjn/Sx5DZJl5dPF8uQ2maQOCZEE6PuUSnl/wibsgE X-Received: by 2002:a17:906:cd0f:: with SMTP id oz15mr3106081ejb.200.1604683638462; Fri, 06 Nov 2020 09:27:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1604683638; cv=none; d=google.com; s=arc-20160816; b=I52Ln+5Yy5WDjAyRz3MU3/gr8HmRaMB7t8tuCUWlmqdq1VrwCpeFk5Yl84Dr9b6nHm H36ZO3IbW6HyYGIWrySmgx9k7skWAqWvfRCiLcEyCj+DmhZmgmEnqOBc0/guKoleke+P 77DmuUdRIBjPdZUEH+lpAEXwrY/vvVGtAdumDiViBL2jql8FRVRurz9gSP1xplJUYrnb 0KhSrE6SXOw5sV8qTBHzo/kswc2x6doJPgMO4hj4IefMDP1/G/4ji5P7Yc2ozw1KF+bk hQiPs4SY/uldsfXRkktydaY1GwGg0ZHtkSMxGZCEAMJEckzPK4bh3QHiT0MiKfVjlWON 0AqA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=ROEzAe/sLPA5fA0hNij4++X8IvwRuse1DwhhV1dL1IA=; b=SwgXnnP3LFCgLzlI/FmRXPFAKHnIWyMriACKiPnuQ0+21YAbDfQuKWMc3ThOHdp1o0 Tm4nzal3JQvnHfkYq5sli/yAB/3sq9joitk/e88sTe5wscsjkLwYsAPkEjEzwhL3bKmf dycqu8wA7uyVikDtDJlA4+SZPxJdU6YEVCSU0DNusJWMxP+d3Q9Y7714CxexIn6pQ/Gv 4Kq6KPGKUokis0Eovh8QThWdAnrBVXoxOrrOZGrw8mZttwhDDsBdj4bN6h164/PbS/fP Q8uI5+7G5qCXvYIGt6R7qrOS6zhpFN7BnoT7THmPn1dUWOo3QRsNhRcBlq9buwt9t17H +2QQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Aj9sCfru; spf=pass (google.com: domain of netdev-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=netdev-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. [23.128.96.18]) by mx.google.com with ESMTP id o17si1467882ejg.500.2020.11.06.09.27.18; Fri, 06 Nov 2020 09:27:18 -0800 (PST) Received-SPF: pass (google.com: domain of netdev-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Aj9sCfru; spf=pass (google.com: domain of netdev-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=netdev-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 S1727661AbgKFR1R (ORCPT + 8 others); Fri, 6 Nov 2020 12:27:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44090 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727628AbgKFR1P (ORCPT ); Fri, 6 Nov 2020 12:27:15 -0500 Received: from mail-wm1-x342.google.com (mail-wm1-x342.google.com [IPv6:2a00:1450:4864:20::342]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 82F11C0613D2 for ; Fri, 6 Nov 2020 09:27:13 -0800 (PST) Received: by mail-wm1-x342.google.com with SMTP id p19so1388015wmg.0 for ; Fri, 06 Nov 2020 09:27:13 -0800 (PST) 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=ROEzAe/sLPA5fA0hNij4++X8IvwRuse1DwhhV1dL1IA=; b=Aj9sCfruDoiES8GbsFf3IAZxh1VNH05bnur/n1+XPUrNn7HQK4qP8Sq8oQq5hDua1G 9HyNdX6AuIZEZ4EzQP0uxFqiq59l3y5T/8KpPB3fZhEmXYwHfKWs7pamBs2o59tlAsHY sCApK67aOF98E7qqDgR8ucKnO1SwTR0mzDaT8KZ3L12sNYCEHItK0L1ZCi/7WN2f5Xqw BFYi/gGp+BV61KKIjwwCrMM6XS058VT3zvweyjCZbU5U+vqnBOA67OOddsNMkAykQfnj DCrMQy0hCKOTY5hh7174HdzpkjP7FWmKZMnULjtyn9XJsPbhOVG0RJ1yxanR6XmfD3uO sVwg== 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=ROEzAe/sLPA5fA0hNij4++X8IvwRuse1DwhhV1dL1IA=; b=djq1d2VCe5H4FGLW28tfLNEm7P4f1bxLH7p+0DV3gTwFPjXM2kD7k9uz1put3eddet AP1i5hCeFzAnKUJL2zVn6IlWqHYK2llEyehUVzKxoar+ONCAk8uJ162/289aDsH9/eDI OrZ1FecJr7aU6Awfk1bPABu7wiy1FeH2SxeJwaPN55W6yOhxfrAI0how21dp6Xk9fmSp BOtgFmE+feO8T2UxMK/O5mp5r1D5i/pGCTRa0c5IB0ZzyaZCRCzR50XKwA8J/LVZy8Gl iDI7/n9T8VpBGcO8tytWN+ViTsI+H3+m22ei6QIJRDUwefbCHUiiJw9bZi0XUVa9fmgb nmJQ== X-Gm-Message-State: AOAM531Foo9ys42eYGycDnIi3XfoAOrRrkTik2zoBcYCijc6LNHuWiOa wec+b5kZXOSWCTkO4PF4vN/X0w== X-Received: by 2002:a1c:ba0b:: with SMTP id k11mr642838wmf.37.1604683632161; Fri, 06 Nov 2020 09:27:12 -0800 (PST) Received: from localhost.localdomain ([88.122.66.28]) by smtp.gmail.com with ESMTPSA id z191sm3183266wme.30.2020.11.06.09.27.10 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 06 Nov 2020 09:27:11 -0800 (PST) From: Loic Poulain To: davem@davemloft.net, kuba@kernel.org Cc: bjorn.andersson@linaro.org, manivannan.sadhasivam@linaro.org, cjhuang@codeaurora.org, netdev@vger.kernel.org, Loic Poulain Subject: [PATCH v2 5/5] net: qrtr: Release distant nodes along the bridge node Date: Fri, 6 Nov 2020 18:33:30 +0100 Message-Id: <1604684010-24090-6-git-send-email-loic.poulain@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1604684010-24090-1-git-send-email-loic.poulain@linaro.org> References: <1604684010-24090-1-git-send-email-loic.poulain@linaro.org> Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Distant QRTR nodes can be accessed via an other node that acts as a bridge. When the a QRTR endpoint associated to a bridge node is released, all the linked distant nodes should also be released. This patch fixes endpoint release by: - Submitting QRTR BYE message locally on behalf of all the nodes accessible through the endpoint. - Removing all the routable node IDs from radix tree pointing to the released node endpoint. Signed-off-by: Loic Poulain --- net/qrtr/qrtr.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) -- 2.7.4 diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index a05d01e..e361de5 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c @@ -171,8 +171,13 @@ static void __qrtr_node_release(struct kref *kref) void __rcu **slot; spin_lock_irqsave(&qrtr_nodes_lock, flags); - if (node->nid != QRTR_EP_NID_AUTO) - radix_tree_delete(&qrtr_nodes, node->nid); + /* If the node is a bridge for other nodes, there are possibly + * multiple entries pointing to our released node, delete them all. + */ + radix_tree_for_each_slot(slot, &qrtr_nodes, &iter, 0) { + if (*slot == node) + radix_tree_iter_delete(&qrtr_nodes, &iter, slot); + } spin_unlock_irqrestore(&qrtr_nodes_lock, flags); list_del(&node->item); @@ -601,6 +606,7 @@ void qrtr_endpoint_unregister(struct qrtr_endpoint *ep) struct qrtr_ctrl_pkt *pkt; struct qrtr_tx_flow *flow; struct sk_buff *skb; + unsigned long flags; void __rcu **slot; mutex_lock(&node->ep_lock); @@ -608,11 +614,18 @@ void qrtr_endpoint_unregister(struct qrtr_endpoint *ep) mutex_unlock(&node->ep_lock); /* Notify the local controller about the event */ - skb = qrtr_alloc_ctrl_packet(&pkt, GFP_KERNEL); - if (skb) { - pkt->cmd = cpu_to_le32(QRTR_TYPE_BYE); - qrtr_local_enqueue(NULL, skb, QRTR_TYPE_BYE, &src, &dst); + spin_lock_irqsave(&qrtr_nodes_lock, flags); + radix_tree_for_each_slot(slot, &qrtr_nodes, &iter, 0) { + if (*slot != node) + continue; + src.sq_node = iter.index; + skb = qrtr_alloc_ctrl_packet(&pkt, GFP_ATOMIC); + if (skb) { + pkt->cmd = cpu_to_le32(QRTR_TYPE_BYE); + qrtr_local_enqueue(NULL, skb, QRTR_TYPE_BYE, &src, &dst); + } } + spin_unlock_irqrestore(&qrtr_nodes_lock, flags); /* Wake up any transmitters waiting for resume-tx from the node */ mutex_lock(&node->qrtr_tx_lock);