Received: by 10.223.185.116 with SMTP id b49csp4173676wrg; Mon, 26 Feb 2018 12:32:36 -0800 (PST) X-Google-Smtp-Source: AH8x226zRgXsBzjsFjDNLsl4aPZZzTUvdVoAoXwiXM5U30ljT9HjPpacdRQ5s0o4DbCnOuX8ATbp X-Received: by 10.98.34.75 with SMTP id i72mr11641116pfi.165.1519677156709; Mon, 26 Feb 2018 12:32:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519677156; cv=none; d=google.com; s=arc-20160816; b=Z3SKko0Sc+LxwVOxSZITZHHnQJ33nHUFnA1nx459JED4SmNPsiNIz8hEKacS9Bb9DG Nxa+bC/3DTlayiHaUg2QRBvdubSBnDKNPPOQl/+acmUtWTM/7gn8C1FpL0UZw+JJDJcv O04DZVyFkEuZdmMqwM9gi39OKneTd/rRj6uCCIkQL6946W1ny2ApzIB6qrJhHsmc1HHO +zrZXBE2o+RPCcbNvnxc1nWmUZUK8ePD63kyrSCVjoTO4KrioZoY8y1pSQM+uPcBfchf F9+Eq8fP1Epvkl/guajIlWDfZ81J7SGRXyEvi3VY084OMNhWcEVNV5Gck8U8CCYZt05V /GOw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=baOIid8oY2g8bNzNp7h3XsAXuw3KbA20liZJjFS00HA=; b=kU5SeT2TS7d0WFYA6e7v3zTEuJJ5A+EL3PfrKG5S5bzoRVM0+7zLJs1P4iJVgX8eVW C4ShJHBOJQXM07SFSU4PwUtMVbZJmPSK0+v3V2BUVV58zloHXuKw74ANseersOOD8k8r 9lYJEfFVq6kZkx9AStNvEvwTiYGaROeDGKhWCiKMl7wfbzDkUG6P4zU0SEfenk2OGPRJ /J/nFLd862gHjDu+pMO+HflyFGdqWTzT7OC3GZeEdXl59vp1MmYoKtUHo2ndE1wRYHLp kg2a5NnSnB7juY020f1dQr9eEjdtwuvYUHHeS2+BNSHlJrQJgGSZ/BlL8W5woAve1cOU 7H9w== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o5si2345607pfh.390.2018.02.26.12.32.19; Mon, 26 Feb 2018 12:32:36 -0800 (PST) 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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754114AbeBZUah (ORCPT + 99 others); Mon, 26 Feb 2018 15:30:37 -0500 Received: from mail.linuxfoundation.org ([140.211.169.12]:37480 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754048AbeBZU3L (ORCPT ); Mon, 26 Feb 2018 15:29:11 -0500 Received: from localhost (clnet-b04-243.ikbnet.co.at [83.175.124.243]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id AEDD7ED8; Mon, 26 Feb 2018 20:29:10 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Mika Westerberg , "David S. Miller" Subject: [PATCH 4.15 36/64] net: thunderbolt: Run disconnect flow asynchronously when logout is received Date: Mon, 26 Feb 2018 21:22:13 +0100 Message-Id: <20180226202155.000369917@linuxfoundation.org> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180226202153.453363333@linuxfoundation.org> References: <20180226202153.453363333@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.15-stable review patch. If anyone has any objections, please let me know. ------------------ From: Mika Westerberg commit 027d351c541744c0c780dd5801c63e4b90750b90 upstream. The control channel calls registered callbacks when control messages such as XDomain protocol messages are received. The control channel handling is done in a worker running on system workqueue which means the networking driver can't run tear down flow which includes sending disconnect request and waiting for a reply in the same worker. Otherwise reply is never received (as the work is already running) and the operation times out. To fix this run disconnect ThunderboltIP flow asynchronously once ThunderboltIP logout message is received. Fixes: e69b6c02b4c3 ("net: Add support for networking over Thunderbolt cable") Signed-off-by: Mika Westerberg Cc: stable@vger.kernel.org Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- drivers/net/thunderbolt.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) --- a/drivers/net/thunderbolt.c +++ b/drivers/net/thunderbolt.c @@ -166,6 +166,8 @@ struct tbnet_ring { * @connected_work: Worker that finalizes the ThunderboltIP connection * setup and enables DMA paths for high speed data * transfers + * @disconnect_work: Worker that handles tearing down the ThunderboltIP + * connection * @rx_hdr: Copy of the currently processed Rx frame. Used when a * network packet consists of multiple Thunderbolt frames. * In host byte order. @@ -190,6 +192,7 @@ struct tbnet { int login_retries; struct delayed_work login_work; struct work_struct connected_work; + struct work_struct disconnect_work; struct thunderbolt_ip_frame_header rx_hdr; struct tbnet_ring rx_ring; atomic_t frame_id; @@ -445,7 +448,7 @@ static int tbnet_handle_packet(const voi case TBIP_LOGOUT: ret = tbnet_logout_response(net, route, sequence, command_id); if (!ret) - tbnet_tear_down(net, false); + queue_work(system_long_wq, &net->disconnect_work); break; default: @@ -659,6 +662,13 @@ static void tbnet_login_work(struct work } } +static void tbnet_disconnect_work(struct work_struct *work) +{ + struct tbnet *net = container_of(work, typeof(*net), disconnect_work); + + tbnet_tear_down(net, false); +} + static bool tbnet_check_frame(struct tbnet *net, const struct tbnet_frame *tf, const struct thunderbolt_ip_frame_header *hdr) { @@ -881,6 +891,7 @@ static int tbnet_stop(struct net_device napi_disable(&net->napi); + cancel_work_sync(&net->disconnect_work); tbnet_tear_down(net, true); tb_ring_free(net->rx_ring.ring); @@ -1195,6 +1206,7 @@ static int tbnet_probe(struct tb_service net = netdev_priv(dev); INIT_DELAYED_WORK(&net->login_work, tbnet_login_work); INIT_WORK(&net->connected_work, tbnet_connected_work); + INIT_WORK(&net->disconnect_work, tbnet_disconnect_work); mutex_init(&net->connection_lock); atomic_set(&net->command_id, 0); atomic_set(&net->frame_id, 0);