Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp1536085ybz; Thu, 16 Apr 2020 10:54:00 -0700 (PDT) X-Google-Smtp-Source: APiQypJ96kFP3he8U1m6yqo/D+6zhlUKXcXwYoBJly/DAA7gwysmVisUT8soKspxvuMRt5T7hno3 X-Received: by 2002:a50:cf8a:: with SMTP id h10mr12501396edk.142.1587059640323; Thu, 16 Apr 2020 10:54:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587059640; cv=none; d=google.com; s=arc-20160816; b=Ql/QfLlPiZ+PIL8Fd+35E/OhVpJM5ibsH9QG7ZFKOYiJTOk8GEB6uC/zJJvx8zwPr5 1GT+uiAK9ZJ0l+RGTKs5v0yOnZyR8qF7N1Yssm4v2yZfoRL25JrKu0wUqoHQFbBOq4pM WPwLuBXilmVNIDlf55UhC2T5q9TkLtOXx9vRxaxN2V326yJZI9/5NJqXLoTJ/PasHTGR zvwERio4VydnHoanEhiuX/Z0UTB7CLMAXuFuSNf1AkC5lx7W0785Y2+EAhNFDIld8rMn g1h2gYtRSkg8tnyYztH1KTeAbOUe1VlILPhDRCO8erX7WrohMW0klcFFdLx2iGVcLQFF VK+A== 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=uhdTEqoBbmAovnM6+vA7bXiYQgJstjAIASy1idTKyNg=; b=URHOu/EC3oHyxMwJ5BaHogpai+j+yHk4AAryQVQ2hnfZldI/Xgnbo+m02XDJiKq98h nCA2jPYEAcviGip+4ok5ziDEgjvchYZF+SqQ0G6gGi+jHVuT0VM8c/d5+sLWXs3qV6cb 5AupIKXbK5ls65CHmfzu5IB+H3+km8FDzIMgn899Zq+GGFkBQuhXzJTA+Q3lV7Pmj6HF lL7yn31YAHjCw/aZtWkfSGo3K6d3W7+VbPADCbfOYq1Xxy4xpLFz63DtkVXRN+i1Anqg ww4MEuR7nAzKfH82SVnXXFB3G7DqRHu3B5joDHPZP1jYNIiaifIGICoHz6hD6Rey9SWw zHHw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Fr5NxINF; 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 w16si11608508ejb.521.2020.04.16.10.53.34; Thu, 16 Apr 2020 10:54:00 -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=Fr5NxINF; 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 S2896474AbgDPNcE (ORCPT + 99 others); Thu, 16 Apr 2020 09:32:04 -0400 Received: from mail.kernel.org ([198.145.29.99]:37512 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2895770AbgDPN2b (ORCPT ); Thu, 16 Apr 2020 09:28:31 -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 D41EF206E9; Thu, 16 Apr 2020 13:28:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587043710; bh=O7V0h3Pp//Pa004XuacvG1SJV34cloXKEn9Xo9N6PpM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Fr5NxINFZ7gZCMP2fiqG0bvugiH+MqLuJxutpB0jU0plK1GUdYygFbNEf14bcwixe A9kMH2IsRapo1yX2zhqOXpgQjFOdjtVkM1NhpPQEZMBP8k0yu8Wg4xYGRmlz+yyhsL /AYpYz6Av/qkzCwGQQ9e9VDsJgnx4pnwXP+D+flY= 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.19 067/146] PCI: endpoint: Fix for concurrent memory allocation in OB address region Date: Thu, 16 Apr 2020 15:23:28 +0200 Message-Id: <20200416131252.072173927@linuxfoundation.org> X-Mailer: git-send-email 2.26.1 In-Reply-To: <20200416131242.353444678@linuxfoundation.org> References: <20200416131242.353444678@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 @@ -79,6 +79,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; @@ -122,7 +123,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; @@ -130,15 +131,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); @@ -164,7 +168,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 @@ -69,6 +69,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; @@ -76,6 +77,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; }; /**