From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 323B4ECE58B for ; Wed, 2 Oct 2019 12:05:31 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id E486821A4A for ; Wed, 2 Oct 2019 12:05:30 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E486821A4A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=linux-m68k.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 75D3F6B0005; Wed, 2 Oct 2019 08:05:30 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 70D0E6B0006; Wed, 2 Oct 2019 08:05:30 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 623ED6B0007; Wed, 2 Oct 2019 08:05:30 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0229.hostedemail.com [216.40.44.229]) by kanga.kvack.org (Postfix) with ESMTP id 423A96B0005 for ; Wed, 2 Oct 2019 08:05:30 -0400 (EDT) Received: from smtpin15.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with SMTP id C26298143 for ; Wed, 2 Oct 2019 12:05:29 +0000 (UTC) X-FDA: 75998714778.15.nose75_873c5b8bdda2d X-HE-Tag: nose75_873c5b8bdda2d X-Filterd-Recvd-Size: 9211 Received: from mail-ot1-f65.google.com (mail-ot1-f65.google.com [209.85.210.65]) by imf03.hostedemail.com (Postfix) with ESMTP for ; Wed, 2 Oct 2019 12:05:29 +0000 (UTC) Received: by mail-ot1-f65.google.com with SMTP id 41so14407315oti.12 for ; Wed, 02 Oct 2019 05:05:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=wcJuYz8ap/PAa28X22SqN7rL8kWlSbf642LPdR37bT4=; b=Onfsj2Nu4Vp2SRFjBEtrBcs1Pm1RAUjNDsBCYdzbrnan0mjqWM4ZQvWhVomdvDWqUp pur+OYLTtzdlFbSWKJcZMJ6qImj94y/e+Wv11Zz5lzJQqIa0pXPM39C/kozL+YE1nTzS r3qIpG2filwuOr63qyBRBO8hnBMrWuTCZA2K+9AKG+ZfgDuw9cBdhp6Z2vgQUYRxLoSc iYUlTRqHFaTtlFNEKBW8sLuigoBh2UfimeFa0gtsMK748GEFPMIgI1kmeC2h9kR2Mga8 A00MfyjxE3UEMN3Pk9bzCK5mwhnkgNCRu5NtJ0AweucO9ht/kW3T2b2yO2jCMMBuhhzg fOMw== X-Gm-Message-State: APjAAAURhFV4GhCHo6jonYcNLaCWwgDogWdApMowLVKucxnu98OSYjl9 LVXYlDyTdH/1MoTj4/2cYnP0C7zBJlFBnMAhE/0= X-Google-Smtp-Source: APXvYqwlK3863lE2oH5kjnCtTsezs0gzi/uTSEHNnzTjlEZSZoMVYwNhQ0XeB42ghRAjqgTuNjHx2QzBQQTWVXkBvVI= X-Received: by 2002:a9d:404d:: with SMTP id o13mr2433193oti.39.1570017928452; Wed, 02 Oct 2019 05:05:28 -0700 (PDT) MIME-Version: 1.0 References: <20190830062924.21714-1-hch@lst.de> <20190830062924.21714-4-hch@lst.de> In-Reply-To: <20190830062924.21714-4-hch@lst.de> From: Geert Uytterhoeven Date: Wed, 2 Oct 2019 14:05:17 +0200 Message-ID: Subject: Re: [PATCH 3/4] dma-mapping: introduce a dma_common_find_pages helper To: Christoph Hellwig Cc: Linux IOMMU , linux-xtensa@linux-xtensa.org, Linux Kernel Mailing List , Russell King , Linux MM , Robin Murphy , Linux ARM , Linux-Renesas Content-Type: text/plain; charset="UTF-8" X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Hi Christoph, On Fri, Aug 30, 2019 at 8:30 AM Christoph Hellwig wrote: > A helper to find the backing page array based on a virtual address. > This also ensures we do the same vm_flags check everywhere instead > of slightly different or missing ones in a few places. > > Signed-off-by: Christoph Hellwig This is now commit 5cf4537975bbd569 ("dma-mapping: introduce a dma_common_find_pages helper") in v5.4-rc1, and causes the following warning during s2ram on r8a7740/armadillo, r7s72100/rskrza1, and r7s9210/rza2mevb: sh-eth e9a00000.ethernet eth0: Link is Down +------------[ cut here ]------------ +WARNING: CPU: 0 PID: 556 at kernel/dma/remap.c:93 remap_allocator_free+0x20/0x30 +trying to free invalid coherent area: 6909579a +Modules linked in: +CPU: 0 PID: 556 Comm: s2ram Not tainted 5.3.0-rc6-armadillo-00027-g5cf4537975bbd569-dirty #113 +Hardware name: Generic R8A7740 (Flattened Device Tree) +[] (unwind_backtrace) from [] (show_stack+0x10/0x14) +[] (show_stack) from [] (__warn+0xec/0x104) +[] (__warn) from [] (warn_slowpath_fmt+0x44/0x6c) +[] (warn_slowpath_fmt) from [] (remap_allocator_free+0x20/0x30) +[] (remap_allocator_free) from [] (__arm_dma_free.constprop.2+0x114/0x144) +[] (__arm_dma_free.constprop.2) from [] (sh_eth_ring_free+0xb8/0x114) +[] (sh_eth_ring_free) from [] (sh_eth_close+0x68/0x8c) +[] (sh_eth_close) from [] (sh_eth_resume+0x44/0x90) +[] (sh_eth_resume) from [] (dpm_run_callback+0x64/0xdc) +[] (dpm_run_callback) from [] (device_resume+0xbc/0x180) +[] (device_resume) from [] (dpm_resume+0x124/0x1b0) +[] (dpm_resume) from [] (dpm_resume_end+0xc/0x18) +[] (dpm_resume_end) from [] (suspend_devices_and_enter+0x15c/0x5ac) +[] (suspend_devices_and_enter) from [] (pm_suspend+0x240/0x2f4) +[] (pm_suspend) from [] (state_store+0x54/0x8c) +[] (state_store) from [] (kernfs_fop_write+0x154/0x1c8) +[] (kernfs_fop_write) from [] (__vfs_write+0x28/0xe0) +[] (__vfs_write) from [] (vfs_write+0x98/0xbc) +[] (vfs_write) from [] (ksys_write+0x68/0xb4) +[] (ksys_write) from [] (ret_fast_syscall+0x0/0x28) +Exception stack(0xdd74dfa8 to 0xdd74dff0) +dfa0: 00000004 000e2408 00000001 000e2408 00000004 00000000 +dfc0: 00000004 000e2408 b6f36d60 00000004 000e2408 00000004 00000000 00000000 +dfe0: 00000000 be9fc74c b6e991bb b6ed5af6 +irq event stamp: 0 +hardirqs last enabled at (0): [<00000000>] 0x0 +hardirqs last disabled at (0): [] copy_process+0x520/0x14b8 +softirqs last enabled at (0): [] copy_process+0x520/0x14b8 +softirqs last disabled at (0): [<00000000>] 0x0 +---[ end trace 22461a068edbf2c1 ]--- +------------[ cut here ]------------ +WARNING: CPU: 0 PID: 556 at kernel/dma/remap.c:93 remap_allocator_free+0x20/0x30 +trying to free invalid coherent area: f39c52ba [...] +---[ end trace 22461a068edbf2c2 ]--- SMSC LAN8710/LAN8720 e9a00000.ethernet-ffffffff:00: attached PHY driver [SMSC LAN8710/LAN8720] (mii_bus:phy_addr=e9a00000.ethernet-ffffffff:00, irq=POLL) (the dirty is due to the need for "ARM: fix __get_user_check() in case uaccess_* calls are not inlined"). BTW, I cannot trigger the issue on r8a7791/koelsch, which also uses sh-eth, not even when disabling CONFIG_IOMMU_SUPPORT and CONFIG_ARM_LPAE (both are not set for the affected platforms). > --- a/drivers/iommu/dma-iommu.c > +++ b/drivers/iommu/dma-iommu.c > @@ -541,15 +541,6 @@ static struct page **__iommu_dma_alloc_pages(struct device *dev, > return pages; > } > > -static struct page **__iommu_dma_get_pages(void *cpu_addr) > -{ > - struct vm_struct *area = find_vm_area(cpu_addr); > - > - if (!area || !area->pages) This checks area->pages... > - return NULL; > - return area->pages; > -} > - > /** > * iommu_dma_alloc_remap - Allocate and map a buffer contiguous in IOVA space > * @dev: Device to allocate memory for. Must be a real device > @@ -938,7 +929,7 @@ static void __iommu_dma_free(struct device *dev, size_t size, void *cpu_addr) > * If it the address is remapped, then it's either non-coherent > * or highmem CMA, or an iommu_dma_alloc_remap() construction. > */ > - pages = __iommu_dma_get_pages(cpu_addr); > + pages = dma_common_find_pages(cpu_addr); > if (!pages) > page = vmalloc_to_page(cpu_addr); > dma_common_free_remap(cpu_addr, alloc_size); > @@ -1045,7 +1036,7 @@ static int iommu_dma_mmap(struct device *dev, struct vm_area_struct *vma, > return -ENXIO; > > if (IS_ENABLED(CONFIG_DMA_REMAP) && is_vmalloc_addr(cpu_addr)) { > - struct page **pages = __iommu_dma_get_pages(cpu_addr); > + struct page **pages = dma_common_find_pages(cpu_addr); > > if (pages) > return __iommu_dma_mmap(pages, size, vma); > @@ -1067,7 +1058,7 @@ static int iommu_dma_get_sgtable(struct device *dev, struct sg_table *sgt, > int ret; > > if (IS_ENABLED(CONFIG_DMA_REMAP) && is_vmalloc_addr(cpu_addr)) { > - struct page **pages = __iommu_dma_get_pages(cpu_addr); > + struct page **pages = dma_common_find_pages(cpu_addr); > > if (pages) { > return sg_alloc_table_from_pages(sgt, pages, > --- a/kernel/dma/remap.c > +++ b/kernel/dma/remap.c > @@ -11,6 +11,15 @@ > #include > #include > > +struct page **dma_common_find_pages(void *cpu_addr) > +{ > + struct vm_struct *area = find_vm_area(cpu_addr); > + > + if (!area || area->flags != VM_DMA_COHERENT) ... while this one checks area->flags? > + return NULL; > + return area->pages; > +} > + > static struct vm_struct *__dma_common_pages_remap(struct page **pages, > size_t size, pgprot_t prot, const void *caller) > { Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds