Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp2089273pxb; Fri, 25 Mar 2022 10:53:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwsFp/B83EHAYAeOlK8NQ+PA5CaJVb1lmbjoC6ggnWWjDtFJXlMVQ1TdWY26BkAw+sNVm2u X-Received: by 2002:a63:ba07:0:b0:382:4739:8941 with SMTP id k7-20020a63ba07000000b0038247398941mr581275pgf.293.1648230836928; Fri, 25 Mar 2022 10:53:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648230836; cv=none; d=google.com; s=arc-20160816; b=UUh2iZZkVdsTQn32g1YSTcraya7A6amjXld/6zFodprHj8dtu9KMYVGyyQ7DYJxrv9 ztT8OP/ZYyCkuzyrIHqS9kRFb8q4VOxRUxpwr+FHZbHEfxskijc4ROx1/YyLGdqMxG79 gWaOiB+vPCD1tq49/0w27ZThpY4cfuukygHuQjQL5UqyD0LkBQBfij/Fq49m9UQ8Rzdq 4msMyrDns3mhHkzvPHqZWhE9iRBZs/99hsC1BTrWGQEWMFR8ZeSCCrlgtzrRzJ8dU4xy ZXObiInLo2969jyqpqoV+jQjCog+Rqz1CN06KGgMmqdte0o1YMGf8iQREvSxDRZ8abYd Ez2w== 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 :organization:references:in-reply-to:date:cc:to:reply-to:from :subject:message-id; bh=9eKnxw87P9yMSWo1qTibzcNMXRwtUJrRrkGqajWNURA=; b=Ldnpo2cMef310cIybc56yx+Bvw/gxTNxgyeALxWUFzufiIUuo0mBgWGJJCJ88tipNk N8j0lSAuMJsPAkFbkwuBaGnuPe5CZW61kUwv7igXToKI+oOsdjc9ERH980F3h262Bti2 a3V1Z/QzPAvyEp5K3IjGOD2OoGNYTTbNP1X2RcRHs7kHIQvEOJPrIe+HAVs8k2SH2Fnw Czbf8SmIHp77lsbvJyQ+vSK982j+X5z8POHIZYqmrQhZbkbKRtMrOjzCYiz7vkYLZREB 75guAHpInc/o54BKuRhHu1MLVCA8mpjUxdxKYtDGRr1ZQXLpNS4aTqVkg6yVt/M3rm99 2fUg== ARC-Authentication-Results: i=1; mx.google.com; spf=softfail (google.com: domain of transitioning linux-wireless-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id b14-20020a631b4e000000b003816043ee1fsi2843524pgm.20.2022.03.25.10.53.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 10:53:56 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-wireless-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; spf=softfail (google.com: domain of transitioning linux-wireless-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 384DA6F4B1; Fri, 25 Mar 2022 10:34:09 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1358889AbiCYKf5 (ORCPT + 70 others); Fri, 25 Mar 2022 06:35:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42018 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237250AbiCYKfy (ORCPT ); Fri, 25 Mar 2022 06:35:54 -0400 X-Greylist: delayed 530 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Fri, 25 Mar 2022 03:34:17 PDT Received: from ns.iliad.fr (ns.iliad.fr [212.27.33.1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F2479A88B1; Fri, 25 Mar 2022 03:34:17 -0700 (PDT) Received: from ns.iliad.fr (localhost [127.0.0.1]) by ns.iliad.fr (Postfix) with ESMTP id 498C720383; Fri, 25 Mar 2022 11:25:25 +0100 (CET) Received: from sakura (freebox.vlq16.iliad.fr [213.36.7.13]) by ns.iliad.fr (Postfix) with ESMTP id 3BA7320338; Fri, 25 Mar 2022 11:25:25 +0100 (CET) Message-ID: <31434708dcad126a8334c99ee056dcce93e507f1.camel@freebox.fr> Subject: Re: [REGRESSION] Recent swiotlb DMA_FROM_DEVICE fixes break ath9k-based AP From: Maxime Bizon Reply-To: mbizon@freebox.fr To: Linus Torvalds , Toke =?ISO-8859-1?Q?H=F8iland-J=F8rgensen?= Cc: Robin Murphy , Christoph Hellwig , Oleksandr Natalenko , Halil Pasic , Marek Szyprowski , Kalle Valo , "David S. Miller" , Jakub Kicinski , Paolo Abeni , Olha Cherevyk , iommu , linux-wireless , Netdev , Linux Kernel Mailing List , Greg Kroah-Hartman , stable Date: Fri, 25 Mar 2022 11:25:25 +0100 In-Reply-To: References: <1812355.tdWV9SEqCh@natalenko.name> <20220324055732.GB12078@lst.de> <4386660.LvFx2qVVIh@natalenko.name> <81ffc753-72aa-6327-b87b-3f11915f2549@arm.com> <878rsza0ih.fsf@toke.dk> <4be26f5d8725cdb016c6fdd9d05cfeb69cdd9e09.camel@freebox.fr> <20220324163132.GB26098@lst.de> <871qyr9t4e.fsf@toke.dk> Organization: Freebox Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.28.5-0ubuntu0.18.04.2 Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV using ClamSMTP ; ns.iliad.fr ; Fri Mar 25 11:25:25 2022 +0100 (CET) X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no 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-wireless@vger.kernel.org On Thu, 2022-03-24 at 12:26 -0700, Linus Torvalds wrote: > > It's actually very natural in that situation to flush the caches from > the CPU side again. And so dma_sync_single_for_device() is a fairly > reasonable thing to do in that situation. > In the non-cache-coherent scenario, and assuming dma_map() did an initial cache invalidation, you can write this: rx_buffer_complete_1(buf) { invalidate_cache(buf, size) if (!is_ready(buf)) return; } or rx_buffer_complete_2(buf) { if (!is_ready(buf)) { invalidate_cache(buf, size) return; } } The latter is preferred for performance because dma_map() did the initial invalidate. Of course you could write: rx_buffer_complete_3(buf) { invalidate_cache(buf, size) if (!is_ready(buf)) { invalidate_cache(buf, size) return; } } but it's a waste of CPU cycles So I'd be very cautious assuming sync_for_cpu() and sync_for_device() are both doing invalidation in existing implementation of arch DMA ops, implementers may have taken some liberty around DMA-API to avoid unnecessary cache operation (not to blame them). For example looking at arch/arm/mm/dma-mapping.c, for DMA_FROM_DEVICE sync_single_for_device() => __dma_page_cpu_to_dev() => dma_cache_maint_page(op=dmac_map_area) => cpu_cache.dma_map_area() sync_single_for_cpu() => __dma_page_dev_to_cpu() => __dma_page_cpu_to_dev(op=dmac_unmap_area) => cpu_cache.dma_unmap_area() dma_map_area() always does cache invalidate. But for a couple of CPU variant, dma_unmap_area() is a noop, so sync_for_cpu() does nothing. Toke's patch will break ath9k on those platforms (mostly silent breakage, rx corruption leading to bad performance) > There's a fair number of those dma_sync_single_for_device() things > all over. Could we find mis-uses and warn about them some way? It > seems to be a very natural thing to do in this context, but bounce > buffering does make them very fragile. At least in network drivers, there are at least two patterns: 1) The issue at hand, hardware mixing rx_status and data inside the same area. Usually very old hardware, very quick grep in network drivers only revealed slicoss.c. Probably would have gone unnoticed if ath9k hardware wasn't so common. 2) The very common "copy break" pattern. If a received packet is smaller than a certain threshold, the driver rx path is changed to do: sync_for_cpu() alloc_small_skb() memcpy(small_skb, rx_buffer_data) sync_for_device() Original skb is left in the hardware, this reduces memory wasted. This pattern is completely valid wrt DMA-API, the buffer is always either owned by CPU or device. -- Maxime