Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp1004798yba; Thu, 4 Apr 2019 02:13:03 -0700 (PDT) X-Google-Smtp-Source: APXvYqyO1sF6/7wBGl4XZ7tcY0kZFap4hksdVGWqO5pQmmnseaPm4QeZi3ctVK+6Q7ErHVMsbrzw X-Received: by 2002:a63:1359:: with SMTP id 25mr4630522pgt.92.1554369183212; Thu, 04 Apr 2019 02:13:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554369183; cv=none; d=google.com; s=arc-20160816; b=ur5p7WgIDJXb3FTY57D/BoSd/c+MKagBih6UxSeWc6M2wUf7Bh6PqSb+Me+c7RRKI8 4iuyK4XqPzBVvbFq9ZGfglqN2AtKqO3i4ELZ5YlX4RV+0qT5en6I/eslflr3aLTqVonw xooqiiRI93bnukF7Uncx6c+LzuQ/rGKuE7H8f1EbVeXkBWbWe1eMFCtU7OFUYr6FxVzS mKcbO7F63hnzTp+s7f3jPtaQOqvSQlN8YiXTKrQaCIpyPYkZjs+dRNuat+nvBIydQIj8 P9lVRyNNT2+4KqFj8mHyoJvnRgCfHCHxAjM7xqn1I68Fw8hH8GPiNTo4sFf5zWYIQCn+ 3AuQ== 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=aKZv13aM9vUG5Kz9rpy2trxT8nQufIO5L4WTfuXv0dA=; b=LCOZRIPJ916XPAMkvymUwPWkC6rk2iA8i4E3ATAJ/OoMHhzZgCNSoyxXPKOGLwMA73 EHdeYwm2vSKALF0qqFRGW3lQA3p/0qSDsDs0m09uGp5QCdmqDeXc7b8p/ox6xjTOTBZY XKA1uOiEkSFcWiuND3Zk5GWAWkQs3hnRvu1GcTi/Yw8akorOZcGw/M2grd4GFA1H4Cuz KBWabTITZpqpF9dWrRrUhiA3UxRWf39CFoWfoxROO4eECyWucbitkHPh/jdQ4BS0mIu1 GAHJm0B4MTuu4q78lh2XTF2UACkvov+gpkRNpYpCyRzdAiI64L5QEKFE7G0TCKKcFOhB 99bw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=FXmGIX5J; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j1si16266184pgi.414.2019.04.04.02.12.47; Thu, 04 Apr 2019 02:13:03 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=FXmGIX5J; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732889AbfDDJLC (ORCPT + 99 others); Thu, 4 Apr 2019 05:11:02 -0400 Received: from mail.kernel.org ([198.145.29.99]:50784 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733092AbfDDJK6 (ORCPT ); Thu, 4 Apr 2019 05:10:58 -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 9B86A20855; Thu, 4 Apr 2019 09:10:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554369057; bh=avms9JqdlW9ocvZa7YWk61e85LYjypUBOaI53k2Pf6Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FXmGIX5JCVTmfU4MP219K39XsiqJwb9sefclntTRKJk0pYPJ0DIcRV75gHAgp+rdE w0yKeyjrjeRO71AgOrt0vZHzhaO/bv9IlhIlKswLWCuduB6xn3/UZBn6qrmYadWUbZ hgDzSqg3+rEuY3ecnO6AnRoNhduBq7EQbOtPESVw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Alexey Kardashevskiy , David Gibson , Michael Ellerman , Sasha Levin Subject: [PATCH 5.0 067/246] powerpc/powernv/ioda: Fix locked_vm counting for memory used by IOMMU tables Date: Thu, 4 Apr 2019 10:46:07 +0200 Message-Id: <20190404084621.495485780@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190404084619.236418459@linuxfoundation.org> References: <20190404084619.236418459@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore 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 5.0-stable review patch. If anyone has any objections, please let me know. ------------------ [ Upstream commit 11f5acce2fa43b015a8120fa7620fa4efd0a2952 ] We store 2 multilevel tables in iommu_table - one for the hardware and one with the corresponding userspace addresses. Before allocating the tables, the iommu_table_group_ops::get_table_size() hook returns the combined size of the two and VFIO SPAPR TCE IOMMU driver adjusts the locked_vm counter correctly. When the table is actually allocated, the amount of allocated memory is stored in iommu_table::it_allocated_size and used to decrement the locked_vm counter when we release the memory used by the table; .get_table_size() and .create_table() calculate it independently but the result is expected to be the same. However the allocator does not add the userspace table size to .it_allocated_size so when we destroy the table because of VFIO PCI unplug (i.e. VFIO container is gone but the userspace keeps running), we decrement locked_vm by just a half of size of memory we are releasing. To make things worse, since we enabled on-demand allocation of indirect levels, it_allocated_size contains only the amount of memory actually allocated at the table creation time which can just be a fraction. It is not a problem with incrementing locked_vm (as get_table_size() value is used) but it is with decrementing. As the result, we leak locked_vm and may not be able to allocate more IOMMU tables after few iterations of hotplug/unplug. This sets it_allocated_size in the pnv_pci_ioda2_ops::create_table() hook to what pnv_pci_ioda2_get_table_size() returns so from now on we have a single place which calculates the maximum memory a table can occupy. The original meaning of it_allocated_size is somewhat lost now though. We do not ditch it_allocated_size whatsoever here and we do not call get_table_size() from vfio_iommu_spapr_tce.c when decrementing locked_vm as we may have multiple IOMMU groups per container and even though they all are supposed to have the same get_table_size() implementation, there is a small chance for failure or confusion. Fixes: 090bad39b237 ("powerpc/powernv: Add indirect levels to it_userspace") Signed-off-by: Alexey Kardashevskiy Reviewed-by: David Gibson Signed-off-by: Michael Ellerman Signed-off-by: Sasha Levin --- arch/powerpc/platforms/powernv/pci-ioda-tce.c | 1 - arch/powerpc/platforms/powernv/pci-ioda.c | 7 ++++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/platforms/powernv/pci-ioda-tce.c b/arch/powerpc/platforms/powernv/pci-ioda-tce.c index 697449afb3f7..e28f03e1eb5e 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda-tce.c +++ b/arch/powerpc/platforms/powernv/pci-ioda-tce.c @@ -313,7 +313,6 @@ long pnv_pci_ioda2_table_alloc_pages(int nid, __u64 bus_offset, page_shift); tbl->it_level_size = 1ULL << (level_shift - 3); tbl->it_indirect_levels = levels - 1; - tbl->it_allocated_size = total_allocated; tbl->it_userspace = uas; tbl->it_nid = nid; diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index 145373f0e5dc..2d62c58f9a4c 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c @@ -2594,8 +2594,13 @@ static long pnv_pci_ioda2_create_table_userspace( int num, __u32 page_shift, __u64 window_size, __u32 levels, struct iommu_table **ptbl) { - return pnv_pci_ioda2_create_table(table_group, + long ret = pnv_pci_ioda2_create_table(table_group, num, page_shift, window_size, levels, true, ptbl); + + if (!ret) + (*ptbl)->it_allocated_size = pnv_pci_ioda2_get_table_size( + page_shift, window_size, levels); + return ret; } static void pnv_ioda2_take_ownership(struct iommu_table_group *table_group) -- 2.19.1