Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp568399ybz; Wed, 22 Apr 2020 03:55:03 -0700 (PDT) X-Google-Smtp-Source: APiQypJV2az5ursaygsF5v3g59gebcgc8JSDeBLE77ZjBwcfc7dIIO7xrsGYEXlLvIXWgJiZyCGm X-Received: by 2002:aa7:c401:: with SMTP id j1mr22152463edq.31.1587552903638; Wed, 22 Apr 2020 03:55:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587552903; cv=none; d=google.com; s=arc-20160816; b=n+E7rLpmqEJi0q8oUOGXBd8sq1JpdPm7kHn6KEPzTZ12ThfpYAXoJTdpJ0Tp/A381k mUKu6GxvIa6c+RJjXUyXq4KZT7jqpmXh5cJilH2bjNBg+5XJPu6b4OUnR4A7X08CKaUZ XkuxYzF9FcRTSNsB7mpG3J/aNEc0nz3HJbqxoVWYkWs7aowrgOCiKPvtnM4sKkvh9YCg pcF3TjrxcgoOrx0Ld/8oHSGfuIqrOYdsvF6zl/0Yfp7Br6yp8fm/gkIsodn9KD4VbUHh nZo2SDUrHN6JMIhjGXhR7xmEBGaWcE/FWPMzKqtLajKF5R24ZID7J1lYIBm6KL61jxJC TQ1Q== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=lh/ovcZW+S1R+2H6+x1MmG0PJftD0nLauEWyIcla6oE=; b=TSGdbuuHcFJDaN2fbnW9vkfg28/Oi4lG3S7e6NCA0Xwc1s/67mdpWf30aO+6TUu/I/ 8B2S261RG870RZeg4nQ5rkMTzPYB+xeazHgJz37vkCd1Ul1PS/9H+qbMWXzFP38LvMny ko+SmwZmandWwICXfP+V1HsdvrHK4+U77vnIb5+mm8V82JY74Q0O6ambY4HjDMFdMDmE XXSzUaclGDMFSPIq6MrmuAo/sBCAQvNEuJdYT/Jjb4nCz9svjkK6OCGLDveR+pr8GfYP T+7jyxym0cINrGvJXnAMc7s9+WbphDk24YJFwpkaHWy34d6jUl1K6IwOkrY3r71XDsir K3Jg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=sIA8bzob; 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 cq3si3065571edb.367.2020.04.22.03.54.40; Wed, 22 Apr 2020 03:55:03 -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; dkim=pass header.i=@kernel.org header.s=default header.b=sIA8bzob; 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 S1732054AbgDVKw2 (ORCPT + 99 others); Wed, 22 Apr 2020 06:52:28 -0400 Received: from mail.kernel.org ([198.145.29.99]:38562 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728947AbgDVKKI (ORCPT ); Wed, 22 Apr 2020 06:10:08 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9888020775; Wed, 22 Apr 2020 10:10:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587550207; bh=aGquuusWEy//4Cijg3ojUT8EFZej4syeVu8388MiEp8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sIA8bzobJSeocmwKnZv0psD+I6F6FkWpOCFH9Dv0qGWOeb7jDpoLhzcJ7/rpCu3yE 92DFBTZ3sRG7rQjiPJp5zLl39lNyqhI6pTPKvBPZDrCgRlDo/XxH1JBmsYJB6rzdmK oaCvrkgGjkG8tSE27upk9whXU9QH2z75Mf1c27wI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Kishon Vijay Abraham I , Lorenzo Pieralisi Subject: [PATCH 4.14 050/199] PCI: endpoint: Fix for concurrent memory allocation in OB address region Date: Wed, 22 Apr 2020 11:56:16 +0200 Message-Id: <20200422095103.177403649@linuxfoundation.org> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200422095057.806111593@linuxfoundation.org> References: <20200422095057.806111593@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Kishon Vijay Abraham I commit 04e046ca57ebed3943422dee10eec9e73aec081e upstream. pci-epc-mem uses a bitmap to manage the Endpoint outbound (OB) address region. This address region will be shared by multiple endpoint functions (in the case of multi function endpoint) and it has to be protected from concurrent access to avoid updating an inconsistent state. Use a mutex to protect bitmap updates to prevent the memory allocation API from returning incorrect addresses. Signed-off-by: Kishon Vijay Abraham I Signed-off-by: Lorenzo Pieralisi Cc: stable@vger.kernel.org # v4.14+ Signed-off-by: Greg Kroah-Hartman --- drivers/pci/endpoint/pci-epc-mem.c | 10 ++++++++-- include/linux/pci-epc.h | 3 +++ 2 files changed, 11 insertions(+), 2 deletions(-) --- a/drivers/pci/endpoint/pci-epc-mem.c +++ b/drivers/pci/endpoint/pci-epc-mem.c @@ -90,6 +90,7 @@ int __pci_epc_mem_init(struct pci_epc *e mem->page_size = page_size; mem->pages = pages; mem->size = size; + mutex_init(&mem->lock); epc->mem = mem; @@ -133,7 +134,7 @@ void __iomem *pci_epc_mem_alloc_addr(str phys_addr_t *phys_addr, size_t size) { int pageno; - void __iomem *virt_addr; + void __iomem *virt_addr = NULL; struct pci_epc_mem *mem = epc->mem; unsigned int page_shift = ilog2(mem->page_size); int order; @@ -141,15 +142,18 @@ void __iomem *pci_epc_mem_alloc_addr(str size = ALIGN(size, mem->page_size); order = pci_epc_mem_get_order(mem, size); + mutex_lock(&mem->lock); pageno = bitmap_find_free_region(mem->bitmap, mem->pages, order); if (pageno < 0) - return NULL; + goto ret; *phys_addr = mem->phys_base + (pageno << page_shift); virt_addr = ioremap(*phys_addr, size); if (!virt_addr) bitmap_release_region(mem->bitmap, pageno, order); +ret: + mutex_unlock(&mem->lock); return virt_addr; } EXPORT_SYMBOL_GPL(pci_epc_mem_alloc_addr); @@ -175,7 +179,9 @@ void pci_epc_mem_free_addr(struct pci_ep pageno = (phys_addr - mem->phys_base) >> page_shift; size = ALIGN(size, mem->page_size); order = pci_epc_mem_get_order(mem, size); + mutex_lock(&mem->lock); bitmap_release_region(mem->bitmap, pageno, order); + mutex_unlock(&mem->lock); } EXPORT_SYMBOL_GPL(pci_epc_mem_free_addr); --- a/include/linux/pci-epc.h +++ b/include/linux/pci-epc.h @@ -63,6 +63,7 @@ struct pci_epc_ops { * @bitmap: bitmap to manage the PCI address space * @pages: number of bits representing the address region * @page_size: size of each page + * @lock: mutex to protect bitmap */ struct pci_epc_mem { phys_addr_t phys_base; @@ -70,6 +71,8 @@ struct pci_epc_mem { unsigned long *bitmap; size_t page_size; int pages; + /* mutex to protect against concurrent access for memory allocation*/ + struct mutex lock; }; /**