Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp2322551rwb; Fri, 2 Dec 2022 08:16:17 -0800 (PST) X-Google-Smtp-Source: AA0mqf7aufD1g0gzdlJAnoMeLEyHuyJPWDTXbWRwCKQZ3Y2405j3FYCJF2k/cE3a9VyxVP77y4pX X-Received: by 2002:a17:906:1713:b0:7a3:fc74:7fb4 with SMTP id c19-20020a170906171300b007a3fc747fb4mr63250191eje.17.1669997777095; Fri, 02 Dec 2022 08:16:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669997777; cv=none; d=google.com; s=arc-20160816; b=N6J5yg8Q4UNbZhiGChEoLv8HDQnVCzfzFuydHuiFhxe72FPRDtvgcKis9ZMWLW4FVg zYIrDGenLVIJdeoNMQmPF4+VjaMvM01rFGUuTHX4LGuMoCjNJbeFMovaSdL/vWibjvB+ 6la1i+epqZ6KGnVJ02lovZJbyix8RNG4DaNzCDyl6YYRQmgRF7FCd4AlN3fr/tINwmV0 Z6fYJfZ3lco0bmUkreMbZ/APBK7SunatX5qWpHoJVh4mpdYaROnaurzxRkitule+ynb9 j2nDnYS8o7g1XJG7WkEPXN8qk+TAU8alHtqKcLC8q2Dsy9S4DnApmL7I+ht7U6oD5JYF Dhhg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=qAVlRIlWoY38vAX/Z4umfmvsrlF4YiQZdlywJH9sxbE=; b=kEgRayZQPDARQfOHnZrXtTfHNB95qXq5LfOZ1UF3D1OsZOoRIwRhWF9xHa26S2UrNJ QLY1+jDXqK4h8MYzGM6Oc3XC1kCpPxVL7YfK2Hxks0RL2iwZflQAaMlF/8CbOQOlCeXf VgTy7jVRL/kHEb8g0pv/0dBLo3saFHjXV3tb2/l11AbW7+GgQrjZfF8foAL/eAXVBh77 GAuc2qvSeqcnLTwDfhlLCxH+XmZIDTDkcQ/CfH2uiSKuJc/FLborV8QNxzecteVvCX8X 4FSpS0Af2xvgq6vWSo5Ig7JipVqrH1GLi8HP68hTc6gWvbGJfmR1+AHgw6bewX4XNVLY fWZA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id dp20-20020a170906c15400b007c0bc7057ddsi3215412ejc.909.2022.12.02.08.15.52; Fri, 02 Dec 2022 08:16:17 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233834AbiLBQEw (ORCPT + 83 others); Fri, 2 Dec 2022 11:04:52 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42310 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233824AbiLBQE3 (ORCPT ); Fri, 2 Dec 2022 11:04:29 -0500 Received: from mail.enpas.org (zhong.enpas.org [IPv6:2a03:4000:2:537::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id CBBCDA9590; Fri, 2 Dec 2022 08:03:29 -0800 (PST) Received: from [127.0.0.1] (localhost [127.0.0.1]) by mail.enpas.org (Postfix) with ESMTPSA id 284FCFF9B7; Fri, 2 Dec 2022 16:03:23 +0000 (UTC) From: Max Staudt To: Wolfgang Grandegger , Marc Kleine-Budde Cc: Vincent Mailhol , Oliver Neukum , linux-kernel@vger.kernel.org, Max Staudt , "Jiri Slaby (SUSE)" , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , linux-can@vger.kernel.org, netdev@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH] can: can327: Flush tx_work on ldisc .close() Date: Sat, 3 Dec 2022 01:01:48 +0900 Message-Id: <20221202160148.282564-1-max@enpas.org> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Additionally, remove it from .ndo_stop(). This ensures that the worker is not called after being freed, and that the UART TX queue remains active to send final commands when the netdev is stopped. Thanks to Jiri Slaby for finding this in slcan: https://lore.kernel.org/linux-can/20221201073426.17328-1-jirislaby@kernel.org/ A variant of this patch for slcan, with the flush in .ndo_stop() still present, has been tested successfully on physical hardware: https://bugzilla.suse.com/show_bug.cgi?id=1205597 Fixes: 43da2f07622f ("can: can327: CAN/ldisc driver for ELM327 based OBD-II adapters") Cc: "Jiri Slaby (SUSE)" Cc: Max Staudt Cc: Wolfgang Grandegger Cc: Marc Kleine-Budde Cc: "David S. Miller" Cc: Eric Dumazet Cc: Jakub Kicinski Cc: Paolo Abeni Cc: linux-can@vger.kernel.org Cc: netdev@vger.kernel.org Cc: stable@vger.kernel.org Signed-off-by: Max Staudt --- drivers/net/can/can327.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/net/can/can327.c b/drivers/net/can/can327.c index ed3d0b8989a0..dc7192ecb001 100644 --- a/drivers/net/can/can327.c +++ b/drivers/net/can/can327.c @@ -796,9 +796,9 @@ static int can327_netdev_close(struct net_device *dev) netif_stop_queue(dev); - /* Give UART one final chance to flush. */ - clear_bit(TTY_DO_WRITE_WAKEUP, &elm->tty->flags); - flush_work(&elm->tx_work); + /* We don't flush the UART TX queue here, as we want final stop + * commands (like the above dummy char) to be flushed out. + */ can_rx_offload_disable(&elm->offload); elm->can.state = CAN_STATE_STOPPED; @@ -1069,12 +1069,15 @@ static void can327_ldisc_close(struct tty_struct *tty) { struct can327 *elm = (struct can327 *)tty->disc_data; - /* unregister_netdev() calls .ndo_stop() so we don't have to. - * Our .ndo_stop() also flushes the TTY write wakeup handler, - * so we can safely set elm->tty = NULL after this. - */ + /* unregister_netdev() calls .ndo_stop() so we don't have to. */ unregister_candev(elm->dev); + /* Give UART one final chance to flush. + * No need to clear TTY_DO_WRITE_WAKEUP since .write_wakeup() is + * serialised against .close() and will not be called once we return. + */ + flush_work(&elm->tx_work); + /* Mark channel as dead */ spin_lock_bh(&elm->lock); tty->disc_data = NULL; -- 2.30.2