Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp2915282pxb; Mon, 25 Jan 2021 01:54:27 -0800 (PST) X-Google-Smtp-Source: ABdhPJxgxnIvpVv3WOyudI723Y17hECXtDCSZySmb07wPYHBm2YrBDDx+ld46nWeLbpJwtCCfiBC X-Received: by 2002:a05:6402:27cf:: with SMTP id c15mr118615ede.179.1611568466992; Mon, 25 Jan 2021 01:54:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1611568466; cv=none; d=google.com; s=arc-20160816; b=R3mvWRQsvx3F7oB7AgsClS7V9dbd7rYVSi5122TKn4mrf8dl7HXdUaFYSX97w/ZWc3 eWpl6nluAQdghhoJUGsnQizjwGDomGSyuLXQUfk8XJP5GUl7Ft3EwvyKnbEelqSO2oFZ v0EzbSqG7ST+rKPAdCNKkC6CHZRhcjj0CCmnEOs5k5Cm3Tzkqq/HYd9D2Xi+I2WaYJ6Y +yRK6/GUPQsYQ5jBJhOP8d9ky7gzcKY5HrFX0DDfMD4gta5C5PR9VPejSSH2dtre0YUf fqJQfeHJvq2DNtFLjwpFCOWCyWSQkGoPVuk/7cWCTisX5bWqv+6hA1oHofNU45jT4pkW FDng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=e0QKRLDgUqGBpADDueMHjJ3Lp5wv+TtZJLXVcKcrQUo=; b=s/var9Q795gJdYPohA70V1zAZ2VDGL39rfsGuBVv5Pq2YOQaz/8G+W3im99rWuT9GN nt+LJe/W0Z9T2p1AJHBtsFTW5yoJVto7ow+x5l/VWO3NNgcve1JRDoW7jv1jcGp9qMhi T8ZMmDOqy5im2XzdHYAMyHR1Y9n+AYgCKabmjUZH7zu+knJzerwjYc9SL2JPkGjttGpd zS/KjvnSyFMb80mNkkvdKueRffUHm6t7EB+tTdoLJqKJ3H0uJJWATTRq8/wu9C5cg0pK H1vEe6TPWn1FVNx9aitjE4AgAcO/UQWvVCupqbeXsDMUvRYeUUZm2s+ksLv78RsaH4mW I5/A== 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 s22si4476882edi.465.2021.01.25.01.54.01; Mon, 25 Jan 2021 01:54:26 -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 S1727108AbhAYJpb (ORCPT + 99 others); Mon, 25 Jan 2021 04:45:31 -0500 Received: from szxga07-in.huawei.com ([45.249.212.35]:11862 "EHLO szxga07-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726680AbhAYJ31 (ORCPT ); Mon, 25 Jan 2021 04:29:27 -0500 Received: from DGGEMS406-HUB.china.huawei.com (unknown [172.30.72.59]) by szxga07-in.huawei.com (SkyGuard) with ESMTP id 4DPP6m65prz7Znb; Mon, 25 Jan 2021 17:03:44 +0800 (CST) Received: from DESKTOP-7FEPK9S.china.huawei.com (10.174.186.182) by DGGEMS406-HUB.china.huawei.com (10.3.19.206) with Microsoft SMTP Server id 14.3.498.0; Mon, 25 Jan 2021 17:04:48 +0800 From: Shenming Lu To: Alex Williamson , Cornelia Huck , , CC: Jean-Philippe Brucker , Eric Auger , Lu Baolu , Kevin Tian , , , Subject: [RFC PATCH v1 3/4] vfio: Try to enable IOPF for VFIO devices Date: Mon, 25 Jan 2021 17:04:01 +0800 Message-ID: <20210125090402.1429-4-lushenming@huawei.com> X-Mailer: git-send-email 2.27.0.windows.1 In-Reply-To: <20210125090402.1429-1-lushenming@huawei.com> References: <20210125090402.1429-1-lushenming@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [10.174.186.182] X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If IOMMU_DEV_FEAT_IOPF is set for the VFIO device, which means that the delivering of page faults of this device from the IOMMU is enabled, we register the VFIO page fault handler to complete the whole faulting path (HW+SW). And add a iopf_enabled field in struct vfio_device to record it. Signed-off-by: Shenming Lu --- drivers/vfio/vfio.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c index ff7797260d0f..fd885d99ee0f 100644 --- a/drivers/vfio/vfio.c +++ b/drivers/vfio/vfio.c @@ -97,6 +97,7 @@ struct vfio_device { struct vfio_group *group; struct list_head group_next; void *device_data; + bool iopf_enabled; }; #ifdef CONFIG_VFIO_NOIOMMU @@ -532,6 +533,21 @@ static struct vfio_group *vfio_group_get_from_dev(struct device *dev) /** * Device objects - create, release, get, put, search */ + +static void vfio_device_enable_iopf(struct vfio_device *device) +{ + struct device *dev = device->dev; + + if (!iommu_dev_has_feature(dev, IOMMU_DEV_FEAT_IOPF)) + return; + + if (WARN_ON(iommu_register_device_fault_handler(dev, + vfio_iommu_dev_fault_handler, dev))) + return; + + device->iopf_enabled = true; +} + static struct vfio_device *vfio_group_create_device(struct vfio_group *group, struct device *dev, @@ -549,6 +565,8 @@ struct vfio_device *vfio_group_create_device(struct vfio_group *group, device->group = group; device->ops = ops; device->device_data = device_data; + /* By default try to enable IOPF */ + vfio_device_enable_iopf(device); dev_set_drvdata(dev, device); /* No need to get group_lock, caller has group reference */ @@ -573,6 +591,8 @@ static void vfio_device_release(struct kref *kref) mutex_unlock(&group->device_lock); dev_set_drvdata(device->dev, NULL); + if (device->iopf_enabled) + WARN_ON(iommu_unregister_device_fault_handler(device->dev)); kfree(device); -- 2.19.1