From patchwork Thu Jan 7 09:29:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: zhukeqian X-Patchwork-Id: 12003331 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1A095C4332E for ; Thu, 7 Jan 2021 09:30:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D7A8E2333E for ; Thu, 7 Jan 2021 09:30:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727799AbhAGJaY (ORCPT ); Thu, 7 Jan 2021 04:30:24 -0500 Received: from szxga05-in.huawei.com ([45.249.212.191]:10557 "EHLO szxga05-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727329AbhAGJaW (ORCPT ); Thu, 7 Jan 2021 04:30:22 -0500 Received: from DGGEMS404-HUB.china.huawei.com (unknown [172.30.72.60]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4DBLWb6mFDzMGT6; Thu, 7 Jan 2021 17:28:27 +0800 (CST) Received: from DESKTOP-5IS4806.china.huawei.com (10.174.184.42) by DGGEMS404-HUB.china.huawei.com (10.3.19.204) with Microsoft SMTP Server id 14.3.498.0; Thu, 7 Jan 2021 17:29:32 +0800 From: Keqian Zhu To: , , , , , Alex Williamson , Kirti Wankhede , Cornelia Huck , Will Deacon , Marc Zyngier , Catalin Marinas CC: Mark Rutland , James Morse , Robin Murphy , Joerg Roedel , "Daniel Lezcano" , Thomas Gleixner , Suzuki K Poulose , Julien Thierry , Andrew Morton , Alexios Zavras , , Subject: [PATCH 4/5] vfio/iommu_type1: Carefully use unmap_unpin_all during dirty tracking Date: Thu, 7 Jan 2021 17:29:00 +0800 Message-ID: <20210107092901.19712-5-zhukeqian1@huawei.com> X-Mailer: git-send-email 2.8.4.windows.1 In-Reply-To: <20210107092901.19712-1-zhukeqian1@huawei.com> References: <20210107092901.19712-1-zhukeqian1@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.174.184.42] X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org If we detach group during dirty page tracking, we shouldn't remove vfio_dma, because dirty log will lose. But we don't prevent unmap_unpin_all in vfio_iommu_release, because under normal procedure, dirty tracking has been stopped. Fixes: d6a4c185660c ("vfio iommu: Implementation of ioctl for dirty pages tracking") Signed-off-by: Keqian Zhu --- drivers/vfio/vfio_iommu_type1.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c index 26b7eb2a5cfc..9776a059904d 100644 --- a/drivers/vfio/vfio_iommu_type1.c +++ b/drivers/vfio/vfio_iommu_type1.c @@ -2373,7 +2373,12 @@ static void vfio_iommu_type1_detach_group(void *iommu_data, if (list_empty(&iommu->external_domain->group_list)) { vfio_sanity_check_pfn_list(iommu); - if (!IS_IOMMU_CAP_DOMAIN_IN_CONTAINER(iommu)) + /* + * During dirty page tracking, we can't remove + * vfio_dma because dirty log will lose. + */ + if (!IS_IOMMU_CAP_DOMAIN_IN_CONTAINER(iommu) && + !iommu->dirty_page_tracking) vfio_iommu_unmap_unpin_all(iommu); kfree(iommu->external_domain); @@ -2406,10 +2411,15 @@ static void vfio_iommu_type1_detach_group(void *iommu_data, * iommu and external domain doesn't exist, then all the * mappings go away too. If it's the last domain with iommu and * external domain exist, update accounting + * + * Note: During dirty page tracking, we can't remove vfio_dma + * because dirty log will lose. Just update accounting is a good + * choice. */ if (list_empty(&domain->group_list)) { if (list_is_singular(&iommu->domain_list)) { - if (!iommu->external_domain) + if (!iommu->external_domain && + !iommu->dirty_page_tracking) vfio_iommu_unmap_unpin_all(iommu); else vfio_iommu_unmap_unpin_reaccount(iommu);