Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp2797100pxk; Tue, 15 Sep 2020 02:35:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwAvdSZnfEHIwn6mjIj5kzDp9rGQyqCnS6psczR2j/2dKqQ+JKmI8zqy8nzD7kFZk2ncU7Y X-Received: by 2002:a17:906:12c7:: with SMTP id l7mr18840325ejb.306.1600162531990; Tue, 15 Sep 2020 02:35:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1600162531; cv=none; d=google.com; s=arc-20160816; b=oNy8QEwh07gaaOzCEUxs/YeJhTyS1PE+SKkbH7rmTFULaihxO6Mt1x09EjYtJBv+v1 ecMmBvui5ymBvXRYgyUgN6dwD8sQdzVOBCrF6pm3K/SnvayxeHf2thwYWuQFrRAcB2Fc FvsSJq621deVEdquPdPeYDMhWdy9WXqcKgq8Nz54JPC5FDngAO5L2UGofkTubwPSznnr wifh0N1DzlFt8ViUbcfQns0c4tRNAKU+t5r/jmgU9NJlBdj7X77PJneaFvid3j3/y0fY 7Wy0x7aB48qIPg3WNpmFYyKMltEvjFHsB97rLD49n6Ml6P9f+csxeVja8xzpUS6WVZr7 SM/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=2lbblrdAG0fCVTrKj0Md7ieCFKFK/i5IqByRtTngAis=; b=wTf5sTmgbp7hKBrBtBC7ttLo7V1ZpclN5LLaA4aCXu3qiOwZ7Wb4eNjVkCh4jHeyBC vo2E0jMVO22lmtyuVsQ8pkiI4tOspa2DJ6UxLgICKt6FtVfvHt3t01YLKEBWD6dpi+n9 5OXzg1/EOV/+wvWWHu2R4HnZFK+m1hRhIp32bVhaB1qchpnhUcybVh7qGept/fbtGF8s +nCISf8ibF7otJKfsYToMtN3M+cEGEJqQ2wJO/zNSfj6gnV1OdlmGQCAeNAZUJ+is2CZ G/8f38UHtvth+ACBF5Mz3dnHvnXid4gPin+6VgKTjbRvnI713c08AZ4+7gb4wYHHei42 N5nQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c6si9918439edq.397.2020.09.15.02.35.09; Tue, 15 Sep 2020 02:35:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726465AbgIOJc1 (ORCPT + 99 others); Tue, 15 Sep 2020 05:32:27 -0400 Received: from foss.arm.com ([217.140.110.172]:59076 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726438AbgIOJcS (ORCPT ); Tue, 15 Sep 2020 05:32:18 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 83E8F11B3; Tue, 15 Sep 2020 02:32:17 -0700 (PDT) Received: from red-moon.arm.com (unknown [10.57.14.23]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id D26FB3F68F; Tue, 15 Sep 2020 02:32:15 -0700 (PDT) From: Lorenzo Pieralisi To: linux-kernel@vger.kernel.org Cc: Lorenzo Pieralisi , George Cherian , Arnd Bergmann , Will Deacon , Bjorn Helgaas , Catalin Marinas , Yang Yingliang , linux-pci@vger.kernel.org, linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org, "David S. Miller" Subject: [PATCH 2/2] asm-generic/io.h: Fix !CONFIG_GENERIC_IOMAP pci_iounmap() implementation Date: Tue, 15 Sep 2020 10:32:03 +0100 Message-Id: <20200915093203.16934-3-lorenzo.pieralisi@arm.com> X-Mailer: git-send-email 2.26.1 In-Reply-To: <20200915093203.16934-1-lorenzo.pieralisi@arm.com> References: <20200915093203.16934-1-lorenzo.pieralisi@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For arches that do not select CONFIG_GENERIC_IOMAP, the current pci_iounmap() function does nothing causing obvious memory leaks for mapped regions that are backed by MMIO physical space. In order to detect if a mapped pointer is IO vs MMIO, a check must made available to the pci_iounmap() function so that it can actually detect whether the pointer has to be unmapped. In configurations where CONFIG_HAS_IOPORT_MAP && !CONFIG_GENERIC_IOMAP, a mapped port is detected using an ioport_map() stub defined in asm-generic/io.h. Use the same logic to implement a stub (ie __pci_ioport_unmap()) that detects if the passed in pointer in pci_iounmap() is IO vs MMIO to iounmap conditionally and call it in pci_iounmap() fixing the issue. Leave __pci_ioport_unmap() as a NOP for all other config options. Reported-by: George Cherian Link: https://lore.kernel.org/lkml/20200905024811.74701-1-yangyingliang@huawei.com Link: https://lore.kernel.org/lkml/20200824132046.3114383-1-george.cherian@marvell.com Signed-off-by: Lorenzo Pieralisi Cc: Arnd Bergmann Cc: George Cherian Cc: Will Deacon Cc: Bjorn Helgaas Cc: Catalin Marinas Cc: Yang Yingliang --- include/asm-generic/io.h | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h index dabf8cb7203b..9ea83d80eb6f 100644 --- a/include/asm-generic/io.h +++ b/include/asm-generic/io.h @@ -911,18 +911,6 @@ static inline void iowrite64_rep(volatile void __iomem *addr, #include #define __io_virt(x) ((void __force *)(x)) -#ifndef CONFIG_GENERIC_IOMAP -struct pci_dev; -extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max); - -#ifndef pci_iounmap -#define pci_iounmap pci_iounmap -static inline void pci_iounmap(struct pci_dev *dev, void __iomem *p) -{ -} -#endif -#endif /* CONFIG_GENERIC_IOMAP */ - /* * Change virtual addresses to physical addresses and vv. * These are pretty trivial @@ -1016,6 +1004,16 @@ static inline void __iomem *ioport_map(unsigned long port, unsigned int nr) port &= IO_SPACE_LIMIT; return (port > MMIO_UPPER_LIMIT) ? NULL : PCI_IOBASE + port; } +#define __pci_ioport_unmap __pci_ioport_unmap +static inline void __pci_ioport_unmap(void __iomem *p) +{ + uintptr_t start = (uintptr_t) PCI_IOBASE; + uintptr_t addr = (uintptr_t) p; + + if (addr >= start && addr < start + IO_SPACE_LIMIT) + return; + iounmap(p); +} #endif #ifndef ioport_unmap @@ -1030,6 +1028,23 @@ extern void ioport_unmap(void __iomem *p); #endif /* CONFIG_GENERIC_IOMAP */ #endif /* CONFIG_HAS_IOPORT_MAP */ +#ifndef CONFIG_GENERIC_IOMAP +struct pci_dev; +extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max); + +#ifndef __pci_ioport_unmap +static inline void __pci_ioport_unmap(void __iomem *p) {} +#endif + +#ifndef pci_iounmap +#define pci_iounmap pci_iounmap +static inline void pci_iounmap(struct pci_dev *dev, void __iomem *p) +{ + __pci_ioport_unmap(p); +} +#endif +#endif /* CONFIG_GENERIC_IOMAP */ + /* * Convert a virtual cached pointer to an uncached pointer */ -- 2.26.1