Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp585908pxk; Wed, 16 Sep 2020 11:27:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxKYvLoGWwFVf0ka94p7zwq6g4CeYNjGKGf1mmmjg4DgMwooISE4Lresuz/XYWSHK3PDzDE X-Received: by 2002:a17:906:14ca:: with SMTP id y10mr4355542ejc.542.1600280879125; Wed, 16 Sep 2020 11:27:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1600280879; cv=none; d=google.com; s=arc-20160816; b=YGacBNR79zf8OD1fKTEwbQiLtBZi8GJacKXSqTf8hfkEgOLZI28iQj8C199kEpAiNQ vn1I9lbnIU/IwTYUpvFy5nIWZvzj3FD6FwHyF/jbE83lyeODR+svAYjEURuEGNEl7mcp Eh7/ig0TbK2sghaJHmq5cBEhn3kARppT/DwO9dIKRqsYq+Kojv0FpBUw9tUuD+QHNt3K aUmKRXHPZECaEiYD2vyVTjWKApy9FrrqI1qbkbFHazkBUxUNSnKsDI82JJ64WJzHuC2C QuPSyzBLMdW6Mu78dyzyfArOvs56QEief9uK8l4/4Fg7TyVM2i469E9LOBpa5PeUG6yG ccmg== 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=Gk9isbgpSHU8CT/1agG8xNxeISTTKG6NG/meuk7ig594qTZObT8RsX2Z6JG8zFhpHu l1UwodCf2JWGoqhn9ylNsiTgRfCUeJTdXaHTx91ITtvYdnofUf9i4yx6uRoNC2VNAFxV T4jRNbqsWPAuS4C91Ag2EnDrikQTaORnnAMP7Ku/7fEWQa068E6uJr3a07j1LNvPtaN9 v9bbNQDdmBRj8r/GFmdUC4VCn6umgZnPcEH3K3Q7HZ0DXECt1r2mB3YffA61oFosFTg9 dhj/QRlj1FiLiZovs73GKS6wKOo9agiq4KahHngIj5iFCHgX+gFazUN5LsSX9FXtFnyZ HaBw== 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 z6si4441226edr.566.2020.09.16.11.27.36; Wed, 16 Sep 2020 11:27:59 -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 S1728018AbgIPS0y (ORCPT + 99 others); Wed, 16 Sep 2020 14:26:54 -0400 Received: from foss.arm.com ([217.140.110.172]:35104 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727996AbgIPSZl (ORCPT ); Wed, 16 Sep 2020 14:25:41 -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 DAC7E1477; Wed, 16 Sep 2020 04:07:14 -0700 (PDT) Received: from red-moon.arm.com (unknown [10.57.6.237]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 646A23F68F; Wed, 16 Sep 2020 04:07:12 -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 v2 3/3] asm-generic/io.h: Fix !CONFIG_GENERIC_IOMAP pci_iounmap() implementation Date: Wed, 16 Sep 2020 12:06:58 +0100 Message-Id: X-Mailer: git-send-email 2.26.1 In-Reply-To: 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