Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1981063pxb; Mon, 18 Jan 2021 05:20:05 -0800 (PST) X-Google-Smtp-Source: ABdhPJw94s11WWB6VCLsQ/U/+6AOYmOpEjryRlAXpv2KXfv/FX+R/WPtcKaF5AJGBTSBNtBBcaL1 X-Received: by 2002:a50:fc8c:: with SMTP id f12mr3948582edq.225.1610976004937; Mon, 18 Jan 2021 05:20:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1610976004; cv=none; d=google.com; s=arc-20160816; b=mtpFKFuaArSW8aVG6z+yNOyiuk3wGf2wv2oN6L3UyqtmV8EYFTsDGz0dkzXEYCc9Cu yO8Bo51Y0prka6N9pK8EmcRoaOY76HQQqHC3AujSTR440mA/LUYXzSnbyhUB1KcmC0qN bf/kizoSVCU1j0WqXFtjN59Pc4rAGGKwAmFo773xU3MUN6beAbs8yJkP91HJbQBGmjfM gLZ4ayk8R1etd/kGmpniiAt7ZDONB0sKB8C/6pA2eJNQBrEpKbc/fgqJipyV8giAzg+8 En9PzZ5tXOyHJ24K5UlViVtZ/9D7+E5QxI9dEfwsFmP8R+HtYNFiqJd35um4Hwdum09+ Qv/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to :mime-version:user-agent:date:message-id:from:cc:references:to :subject; bh=GeCkIvcM6d7NuyLX3aEWPFoc7hwy5bQEphmPUy2brCs=; b=qFyPRRvpQY6Y45wXOjdAisiQ9xp0mi8wnk8s2FWpVZ00YvF+2JFbY0QS1DZEQuwsW/ CK+rHMYmuAb4t1CTL6CKooE8SpBmcUdxyVF8cx60YB8gCfvyao94ANUGh4kz/ZZu0Yrj NiSdWM1VmU40HRafXdKVr1iZI5EpqTKUHsJtjZU+DiK1/YmnJiGoaLZy1jjeTLEm/3j6 Lgy2YqzHFz7h2bcWRCpRIS4XFBYNmVb1bwCH7yfjeeUwX91rdjOkOXgwCZOFvFuR0MSB Nmvh1s82iFXNn73DTB6ljbxRM1BNukN15AJUhqmgTtTWlIPMBAtQDo9mfUIk6DdND1lK QShg== 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 gf2si7488983ejb.154.2021.01.18.05.19.41; Mon, 18 Jan 2021 05:20:04 -0800 (PST) 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 S2392102AbhARNRW (ORCPT + 99 others); Mon, 18 Jan 2021 08:17:22 -0500 Received: from szxga05-in.huawei.com ([45.249.212.191]:11555 "EHLO szxga05-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2392072AbhARNRP (ORCPT ); Mon, 18 Jan 2021 08:17:15 -0500 Received: from DGGEMS401-HUB.china.huawei.com (unknown [172.30.72.60]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4DKC1r5CHCzMLqq; Mon, 18 Jan 2021 21:14:56 +0800 (CST) Received: from [10.174.184.42] (10.174.184.42) by DGGEMS401-HUB.china.huawei.com (10.3.19.201) with Microsoft SMTP Server id 14.3.498.0; Mon, 18 Jan 2021 21:16:09 +0800 Subject: Re: [PATCH v2 2/2] vfio/iommu_type1: Sanity check pfn_list when remove vfio_dma To: Alex Williamson References: <20210115092643.728-1-zhukeqian1@huawei.com> <20210115092643.728-3-zhukeqian1@huawei.com> <20210115121447.54c96857@omen.home.shazbot.org> CC: , , , , , Kirti Wankhede , Cornelia Huck , Will Deacon , "Marc Zyngier" , Catalin Marinas , "Mark Rutland" , James Morse , "Robin Murphy" , Joerg Roedel , Daniel Lezcano , Thomas Gleixner , "Suzuki K Poulose" , Julien Thierry , Andrew Morton , Alexios Zavras , , From: Keqian Zhu Message-ID: <32f8b347-587a-1a9a-bee8-569f09a03a15@huawei.com> Date: Mon, 18 Jan 2021 21:16:08 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.7.1 MIME-Version: 1.0 In-Reply-To: <20210115121447.54c96857@omen.home.shazbot.org> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.174.184.42] X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2021/1/16 3:14, Alex Williamson wrote: > On Fri, 15 Jan 2021 17:26:43 +0800 > Keqian Zhu wrote: > >> vfio_sanity_check_pfn_list() is used to check whether pfn_list of >> vfio_dma is empty when remove the external domain, so it makes a >> wrong assumption that only external domain will add pfn to dma pfn_list. >> >> Now we apply this check when remove a specific vfio_dma and extract >> the notifier check just for external domain. > > The page pinning interface is gated by having a notifier registered for > unmaps, therefore non-external domains would also need to register a > notifier. There's currently no other way to add entries to the > pfn_list. So if we allow pinning for such domains, then it's wrong to > WARN_ON() when the notifier list is not-empty when removing an external > domain. Long term we should probably extend page {un}pinning for the > caller to pass their notifier to be validated against the notifier list > rather than just allowing page pinning if *any* notifier is registered. > Thanks, I was misled by the code comments. So when the commit a54eb55045ae is added, the only user of pin interface is mdev vendor driver, but now we also allow iommu backed group to use this interface to constraint dirty scope. Is vfio_iommu_unmap_unpin_all() a proper place to put this WARN()? Thanks, Keqian > > Alex > >> Fixes: a54eb55045ae ("vfio iommu type1: Add support for mediated devices") >> Signed-off-by: Keqian Zhu >> --- >> drivers/vfio/vfio_iommu_type1.c | 24 +++++------------------- >> 1 file changed, 5 insertions(+), 19 deletions(-) >> >> diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c >> index 4e82b9a3440f..a9bc15e84a4e 100644 >> --- a/drivers/vfio/vfio_iommu_type1.c >> +++ b/drivers/vfio/vfio_iommu_type1.c >> @@ -958,6 +958,7 @@ static long vfio_unmap_unpin(struct vfio_iommu *iommu, struct vfio_dma *dma, >> >> static void vfio_remove_dma(struct vfio_iommu *iommu, struct vfio_dma *dma) >> { >> + WARN_ON(!RB_EMPTY_ROOT(&dma->pfn_list); >> vfio_unmap_unpin(iommu, dma, true); >> vfio_unlink_dma(iommu, dma); >> put_task_struct(dma->task); >> @@ -2251,23 +2252,6 @@ static void vfio_iommu_unmap_unpin_reaccount(struct vfio_iommu *iommu) >> } >> } >> >> -static void vfio_sanity_check_pfn_list(struct vfio_iommu *iommu) >> -{ >> - struct rb_node *n; >> - >> - n = rb_first(&iommu->dma_list); >> - for (; n; n = rb_next(n)) { >> - struct vfio_dma *dma; >> - >> - dma = rb_entry(n, struct vfio_dma, node); >> - >> - if (WARN_ON(!RB_EMPTY_ROOT(&dma->pfn_list))) >> - break; >> - } >> - /* mdev vendor driver must unregister notifier */ >> - WARN_ON(iommu->notifier.head); >> -} >> - >> /* >> * Called when a domain is removed in detach. It is possible that >> * the removed domain decided the iova aperture window. Modify the >> @@ -2367,7 +2351,8 @@ static void vfio_iommu_type1_detach_group(void *iommu_data, >> kfree(group); >> >> if (list_empty(&iommu->external_domain->group_list)) { >> - vfio_sanity_check_pfn_list(iommu); >> + /* mdev vendor driver must unregister notifier */ >> + WARN_ON(iommu->notifier.head); >> >> if (!IS_IOMMU_CAP_DOMAIN_IN_CONTAINER(iommu)) >> vfio_iommu_unmap_unpin_all(iommu); >> @@ -2491,7 +2476,8 @@ static void vfio_iommu_type1_release(void *iommu_data) >> >> if (iommu->external_domain) { >> vfio_release_domain(iommu->external_domain, true); >> - vfio_sanity_check_pfn_list(iommu); >> + /* mdev vendor driver must unregister notifier */ >> + WARN_ON(iommu->notifier.head); >> kfree(iommu->external_domain); >> } >> > > . >