From patchwork Thu Sep 29 14:59:24 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 12994193 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0E1A2C4332F for ; Thu, 29 Sep 2022 14:59:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235795AbiI2O7d (ORCPT ); Thu, 29 Sep 2022 10:59:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51878 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235255AbiI2O7a (ORCPT ); Thu, 29 Sep 2022 10:59:30 -0400 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2070.outbound.protection.outlook.com [40.107.243.70]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C38CB149780 for ; Thu, 29 Sep 2022 07:59:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KG18zrfMsJS11Sh4/Z9QlWKSK0MLXPhViCz8p/j41aLtHyaOWqzKUot7WFnMvvTxhylr7yL9+xKjqmsaTCKnLluuFedyHieO0+5zsS9H9YgWuteeZNuBz25b9fV5eaRJf8mJQpvZNKf523/k8rrwyl8gBBpBZfWKjky6u4u/DhrWPOjb+cF7fJqG+RDBHvnRFuB0FtDmN9D3x2dty+8EYAwq0g4QDnx0O/Eeb11xfxS4Q8BkCPVlPiTs12EhCROah5NCrksTzp/Y16ySWR05RDMydd6clmCgIGQseq0Ldf2DwrkuOJIW5zMkuqnztQgywjfq/qh4at6N0fGpHpr45Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=v9PTFsmw8jXiUsTneXZVvWLlsY2XQxjEv1V8f+bOhzU=; b=hVPIBF+X1hzrpQ2DjQSVJWoy8IKbga/bjeSyDNtAbNyKDZTtTCQpMhROTx/tOaEtEoo81XKKrt4DSFg0LZttxX4eflLQ3AHL7kPjEWlCnS3eyEm5vU8ZtHnYO05+cpk7Xl06CkxGg4A6wlMsaKB638OjTKCQ0IrHDkyf2H0u6vjaHg0VBO0sToP/nWpHEY0ZQPEbT9H3b2lQp08+od4P6Tuiv6LyyovxRGri93dlJAkdOK1LLJuhYq+iuReYKWwBQb8fruPTVRCqmFJH83tIgoLm7hhSGgeqhirWJCqsBHzdtqRYWVFtIc739ABMt01YyG4uyFQLLmKiiJ3J+8NTOw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=v9PTFsmw8jXiUsTneXZVvWLlsY2XQxjEv1V8f+bOhzU=; b=ieeR34Gtx+kxOU+r/c/O7kWvk4IXQjcpngPMdzQq9zIt8dG2vOgY5EbncYfnMnOSpxO0CZ1eAoQittJ108qKZ96bdI9dFltJfUNo2ZinUGvLMVRsBvrDJJGlI8E0hcdzphrcCePPVxLom2h2/5S5eDOJb17ChTESt7ffBIl/NTF6qB/PC/d6lGCkNpi5jlSZ11L8471yDa/jv6jkjHJj7ZIwiRNAQtb4jEwORv9VRYtjo2dX5azp9HyucI5vcA4Tqm1tZuLOYJVco/fvxj0U5Ev6JiOg8Sq0MKhuUa+Ji4lTTbThGoXVlYk5ySnPtPXm84AiyFGEZ6ehtWU7+cnq4w== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from MN2PR12MB4192.namprd12.prod.outlook.com (2603:10b6:208:1d5::15) by DS0PR12MB6389.namprd12.prod.outlook.com (2603:10b6:8:cf::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5676.17; Thu, 29 Sep 2022 14:59:26 +0000 Received: from MN2PR12MB4192.namprd12.prod.outlook.com ([fe80::f0c0:3a28:55e9:e99c]) by MN2PR12MB4192.namprd12.prod.outlook.com ([fe80::f0c0:3a28:55e9:e99c%5]) with mapi id 15.20.5676.019; Thu, 29 Sep 2022 14:59:26 +0000 From: Jason Gunthorpe To: Alex Williamson , Cornelia Huck , kvm@vger.kernel.org Subject: [PATCH 1/2] vfio: Remove the vfio_group->users and users_comp Date: Thu, 29 Sep 2022 11:59:24 -0300 Message-Id: <1-v1-917e3647f123+b1a-vfio_group_users_jgg@nvidia.com> In-Reply-To: <0-v1-917e3647f123+b1a-vfio_group_users_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0135.namprd13.prod.outlook.com (2603:10b6:208:2bb::20) To MN2PR12MB4192.namprd12.prod.outlook.com (2603:10b6:208:1d5::15) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN2PR12MB4192:EE_|DS0PR12MB6389:EE_ X-MS-Office365-Filtering-Correlation-Id: 70e09e68-308b-495c-2743-08daa22b33d1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: z1V7jza5fxhShg4D9VpfzJILf0wzD7sq8I6Ues0wIz7XtD4R3XHnLE3/1BoMccIXHjwFG0/1vES9s+FDkNRnQBHPLnqcABzp6pwfVqUpQ7X0scyX/AWSInPKi3tCCMwNKKZERfQGLSo0WBOSQAImA5B8KohRvxyOGzTIdmfCiO1dNmzvSEsPB/teQVqdtCeS52NQf17sLl/HzfVsxSlYUhfISXRG38wbImXhiQmDNCUngMSSUevQcHhqfTa5n+0BrP8bXW9Xojf4YgpXoSyFi5DS0NfxvUFYiXLSTPk1VeBBSF915cjehcgedUftqyCFem3dyaaMquxU/FxWddDFJAlW3Vzx0iJ5ILHiBJhV2ZWv+d2HjZTA9L/QIKagdFtOlkqjuAizd9QBv37bXa6WJfw+2Rx6fwhhxHcbYhg//yokEa3kvsBhpxrTIEhmZVZqXNDfQAjpbGXyXi4Rdsl47oJQsdHrGh1J7R1aWFgSUUfIwssNVsZ9Y40ct/9uC6OsF968Txh9duwiYWrdBcOgqlUCXuzrGHy/fV5kM8vndca+P0wSLm8UWrY5su47jS3vDbojtuD118ZmWyrfIMPAHMDkNSa7Tjtqw0nT4ziVd4/cOK3m1Ujfs5KcVI100FFuzz1Fr40h6IJ1Agb7685Ek7RJYIKn1/oXhokqS5s2fez6kB5MFNEsDRX4gVWweG04BsXyhJuLnBMLX3JG3tLTlp9DImxg307PwbdyXkAUJHmsvt8VXTL0HTwKaLBRSD6V X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN2PR12MB4192.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(136003)(346002)(376002)(39860400002)(366004)(396003)(451199015)(6506007)(478600001)(110136005)(6486002)(26005)(316002)(38100700002)(86362001)(2616005)(186003)(83380400001)(6512007)(2906002)(8936002)(66476007)(41300700001)(36756003)(8676002)(66556008)(66946007)(5660300002)(4216001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: qr/v5bOiJtjZgjL6Pw5hiZr/ooq3CM8Nt2QWHJGMZBGbjoDAfgMo389tC1obBJwuGS2ewh8yWFIwYAugnPKghwIoW2xrZEEuRfjEaO5+huoIdoeJ6cWDM/WcLEk4IGWfjgMS4J86IhUqqYw8reBjJyBLPuWrnMnioKlVea+k0WZnFiIloVXhlNTvWV/AiK/RzyaxWFuNBu2QEfT7e3KPxhJTsuFqIAQUuaayz6qptVYxVz1BugTf1PAtce88VeQMlqkPkvLRrij+1yIk58ITxBENaohUinZOlCBA7TmQokzfEfR5AZe92KDcUfKOdaOeA1FI9FOHwDWHopWeL0xdnEMckHZYKQojb4qqMLxL8XeVQnAxezQ7BRsON/HDsYxpjd7v9TOWbTaAheL6jfgUTGlW6im+H/3CMX/cfu8iIuVN4tBWKJ6UC69ozKZ/911Y+rD6jqllLz468PbrZNaVjeY3ZeUirD/US0NdkTOh167UkTWp4Rb0F8OPYs3bIwAlVu8/DKwUbiMWfYTgsdgI00Al+XUueySnZ2Nw9GdbFKlz4hT0scNGB0gVLBuhvLV//X/0hiAV8yTNKir59BXzjGRg4287n86UM+RUHu9xgsn8gc2pxl3plLKQY8lOgK+acbsQ+fdk09r1ACRlkG0ID7fcpVurGrk1+PktMC04OoeEUjEr6njF8AqmnYNT0KJosWrKR1L4g9WjI+8g57uMyrub7PG2SfHttc8BsMJicIhiYMCD4FJeMKLxV2rIapep/BzgFDwNR6oxGHTD38tqJcAw+pxEkPhjezluWUgePCOQGa8qWYFB8pL7envud/so/3cQX6J60n4kGPk87WZ2CGuiE3HItj63OJMJgSsDz39V0ud//f+59V1unGw0xaKRlRlFtRUOImJxiE17Zcf/THdtzi0ki2uJBkvsdlxxTXfTvJhgGcULarXWvUuDqBTAEEMlFeekm9DOH/sNYgalS6SaM8B3Pg2hyYBss8kVUPP2cbxj3ndIeCvwshn2Ywp7KbzXc6JJC+S+RRo9sGH3MYHzj38GTKTgupEB1RDI80p9RemvCX7y5mL00hNamj2QEsKu9DX/RWy+PW3n0fQf2HNoHRZelCHfqnGzdboDO7MWW/LDBcMYgJgbYTEc4XNWCS/7zxXDjPRVyAuOba6jY4eS907loVzOFFdD8O5G5T8p6L/cXFjJaxyY8gU2U3B8V8LVOKc4dlw93MtTBvxLQWQOrwFh5vS8YkL+ug5utrDsRB9pD2voLaNt/r0WCS8XO14/Vvjj/aqv60yRTpljqvALM1NGCvVbfUuEPNuIG5fqSNPhwxyDdOdFAzlRGCyWASLNfi3alsaxTvC9QxXSW1ChAy5HgpLi7kEsC7uLfmf+X944a8WgWuJzB4dQ2WYUGbVSxISyo1lEdd2KQ3B0m42vHTND5dB2+PxtfgLqydmlscegQfd76zIwmVODFnEYSbxhrPNim08uhf4A8BHZCqixEFTsU6vmty9GMCKlqI5zRxxRuJQm4jvByZ4OKn/G21oZcSodaEB/Oceq/9vrtgN5pqqiDK5PQQtmio6LxDw= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 70e09e68-308b-495c-2743-08daa22b33d1 X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB4192.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Sep 2022 14:59:26.4403 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: c0F3wiXeEhQby88DlNnOt4rqbwNFloJZwYvO2+0xq6cuUBRKseX4G5xMgHn7IVH7 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB6389 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Kevin points out that the users is really just tracking if group->opened_file is set, so we can simplify this code to a wait_queue that looks for !opened_file under the group_rwsem. Signed-off-by: Jason Gunthorpe Reviewed-by: Kevin Tian --- drivers/vfio/vfio.h | 3 +-- drivers/vfio/vfio_main.c | 45 +++++++++++++++++----------------------- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/drivers/vfio/vfio.h b/drivers/vfio/vfio.h index 039e3208d286fa..78b362a9250113 100644 --- a/drivers/vfio/vfio.h +++ b/drivers/vfio/vfio.h @@ -48,8 +48,6 @@ struct vfio_group { * reaches 0 then the iommu_group is invalid. */ refcount_t drivers; - refcount_t users; - struct completion users_comp; unsigned int container_users; struct iommu_group *iommu_group; struct vfio_container *container; @@ -61,6 +59,7 @@ struct vfio_group { struct rw_semaphore group_rwsem; struct kvm *kvm; struct file *opened_file; + struct swait_queue_head opened_file_wait; struct blocking_notifier_head notifier; }; diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c index f19171cad9a25f..57a7576a96a61b 100644 --- a/drivers/vfio/vfio_main.c +++ b/drivers/vfio/vfio_main.c @@ -186,10 +186,9 @@ static struct vfio_group *vfio_group_alloc(struct iommu_group *iommu_group, cdev_init(&group->cdev, &vfio_group_fops); group->cdev.owner = THIS_MODULE; - refcount_set(&group->users, 1); refcount_set(&group->drivers, 1); - init_completion(&group->users_comp); init_rwsem(&group->group_rwsem); + init_swait_queue_head(&group->opened_file_wait); INIT_LIST_HEAD(&group->device_list); mutex_init(&group->device_lock); group->iommu_group = iommu_group; @@ -245,12 +244,6 @@ static struct vfio_group *vfio_create_group(struct iommu_group *iommu_group, return ret; } -static void vfio_group_put(struct vfio_group *group) -{ - if (refcount_dec_and_test(&group->users)) - complete(&group->users_comp); -} - static void vfio_device_remove_group(struct vfio_device *device) { struct vfio_group *group = device->group; @@ -270,10 +263,6 @@ static void vfio_device_remove_group(struct vfio_device *device) * cdev_device_add() will fail due to the name aready existing. */ cdev_device_del(&group->cdev, &group->dev); - mutex_unlock(&vfio.group_lock); - - /* Matches the get from vfio_group_alloc() */ - vfio_group_put(group); /* * Before we allow the last driver in the group to be unplugged the @@ -281,7 +270,13 @@ static void vfio_device_remove_group(struct vfio_device *device) * is because the group->iommu_group pointer should only be used so long * as a device driver is attached to a device in the group. */ - wait_for_completion(&group->users_comp); + while (group->opened_file) { + mutex_unlock(&vfio.group_lock); + swait_event_idle_exclusive(group->opened_file_wait, + !group->opened_file); + mutex_lock(&vfio.group_lock); + } + mutex_unlock(&vfio.group_lock); /* * These data structures all have paired operations that can only be @@ -906,15 +901,18 @@ static int vfio_group_fops_open(struct inode *inode, struct file *filep) down_write(&group->group_rwsem); - /* users can be zero if this races with vfio_device_remove_group() */ - if (!refcount_inc_not_zero(&group->users)) { + /* + * drivers can be zero if this races with vfio_device_remove_group(), it + * will be stable at 0 under the group rwsem + */ + if (refcount_read(&group->drivers) == 0) { ret = -ENODEV; - goto err_unlock; + goto out_unlock; } if (group->type == VFIO_NO_IOMMU && !capable(CAP_SYS_RAWIO)) { ret = -EPERM; - goto err_put; + goto out_unlock; } /* @@ -922,16 +920,12 @@ static int vfio_group_fops_open(struct inode *inode, struct file *filep) */ if (group->opened_file) { ret = -EBUSY; - goto err_put; + goto out_unlock; } group->opened_file = filep; filep->private_data = group; - - up_write(&group->group_rwsem); - return 0; -err_put: - vfio_group_put(group); -err_unlock: + ret = 0; +out_unlock: up_write(&group->group_rwsem); return ret; } @@ -952,8 +946,7 @@ static int vfio_group_fops_release(struct inode *inode, struct file *filep) vfio_group_detach_container(group); group->opened_file = NULL; up_write(&group->group_rwsem); - - vfio_group_put(group); + swake_up_one(&group->opened_file_wait); return 0; } From patchwork Thu Sep 29 14:59:25 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 12994194 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 752DCC433F5 for ; Thu, 29 Sep 2022 14:59:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235806AbiI2O7f (ORCPT ); Thu, 29 Sep 2022 10:59:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52008 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235789AbiI2O7c (ORCPT ); Thu, 29 Sep 2022 10:59:32 -0400 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2070.outbound.protection.outlook.com [40.107.243.70]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CDCB8149793 for ; Thu, 29 Sep 2022 07:59:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=QGkOT4koaeHsgY/akWb55gZhkPxA9kwfVulbdyTyVrL0sQ/CmwqFiBF1RxaGlVlvgQYeOecFvMltEdrDgkqtDnQG27zTYSZCRom+fEzau2SSB7h82UB+jpfewApMBKzS6SlGuPq0dt1Xi1wcLLjMgIixQ20sltf2o4J5MxfRDLE4oyHex8pvSdcEPg80hzg5PJEGq5vFcozmciFZ+WBB6VcCNEAkEAPK3viMih8UayQ0WizMRKFeTYnQbqUjLDssuk+eXwfap9sSUU9+lm4aLggx1NgQZ0ve4BLazqP6aSC7Kv/T8EhZM64O3ydO8D5kq877muFmintV96PgFocHAA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=eynq03dWRJcj/2hoKDOULvHOugc+MBIdpZL2y+sS2FA=; b=b7BsUD/ZLf1ms9NdgBij+KVh4BvaGQwwlipBA+EpPdgBuefjqMl80F3BmOj7AUwJ2Rlxh9DlQHoN65+xHtDWGEqdOiGSF5fVuxunPmQl43HDSSQA4Uu4fTZp71XqzULsDjp8+YPC+LdLMIdrfWwZt7gci4g4Q3ZJWPV/1JicS86C3bKgzaRgj1QGr/4N1eUX4ZmDXvqd0CeK3weAkvu0K9Mg/1WAZP7049hTF+jHLtjamBPEZ114JDIx7clHvQ5PCXXZT6ZgjR0E/LTFZmAyXLOhkXCxx5ff1PhQxKpeHZWG3Q/J1+IahZsfjNjbC/UGp1eoiYzOEhkLW8aYQDUV7w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=eynq03dWRJcj/2hoKDOULvHOugc+MBIdpZL2y+sS2FA=; b=gyyOyqtYMqI9zELJBvz6b/bvB5XLUnU6caRIkj/20NlVk6A2m0DjEoD8Xiw89zaBiupIT3OwpdEkAa4IYllx1Z1rWDHd+fnhoLCWW7qKqDY/EjuAh4nYcj9Y503tQNNbBGx/GhlwzaBniMB7NuQF5dmul6v+dMa+iQynO525RVVmJrVRZ/g3c1F/NiIaWzmmaFxvn4uY/Y/MpugXL2QXdnyu+1I2YUQ+g4PALoiOvYqTT7n9xwjVw3zknLwuYfKJZgkpyOZ048TRF7PMGQ1mbSIHMRdTdR/SbYrQs4S/4XUrlVq8GVg6IOn20Yq/fIXPzIoMLJRMxA1iA+nvz4SCfw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from MN2PR12MB4192.namprd12.prod.outlook.com (2603:10b6:208:1d5::15) by DS0PR12MB6389.namprd12.prod.outlook.com (2603:10b6:8:cf::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5676.17; Thu, 29 Sep 2022 14:59:27 +0000 Received: from MN2PR12MB4192.namprd12.prod.outlook.com ([fe80::f0c0:3a28:55e9:e99c]) by MN2PR12MB4192.namprd12.prod.outlook.com ([fe80::f0c0:3a28:55e9:e99c%5]) with mapi id 15.20.5676.019; Thu, 29 Sep 2022 14:59:27 +0000 From: Jason Gunthorpe To: Alex Williamson , Cornelia Huck , kvm@vger.kernel.org Subject: [PATCH 2/2] vfio: Change vfio_group->group_rwsem to a mutex Date: Thu, 29 Sep 2022 11:59:25 -0300 Message-Id: <2-v1-917e3647f123+b1a-vfio_group_users_jgg@nvidia.com> In-Reply-To: <0-v1-917e3647f123+b1a-vfio_group_users_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0177.namprd13.prod.outlook.com (2603:10b6:208:2bd::32) To MN2PR12MB4192.namprd12.prod.outlook.com (2603:10b6:208:1d5::15) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN2PR12MB4192:EE_|DS0PR12MB6389:EE_ X-MS-Office365-Filtering-Correlation-Id: 27e75313-2d49-4a6b-5a80-08daa22b3427 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: w6kHSLo7wv9d/RAvsTKR7VvaTzeZQTWbMMABhS4/E3fGq9SZcoTLk38BQ7zGnVLrKQnoQPN447vIhTrSsKKj+2U+TfaJefWd5BvliwljdIif45esW53XWfZqSvXhW0+AA94rO71r0uq0bVd53vaf3avHE2y7dS/k+rObJTqlx6IDlORVw0LicW8+c1QKgZV4Sow3tVwT3ssPFblZnNeTL1VDENu5+egqvfKLRYu5uMjVXAJRi7CJ4CjIzqJJr3lfDnSvXmq2NzPuFcgkAAjfqlxEAZw0qkl/j9mxqPko/jqCsFY9/+3dSmk46AIX+hjEw/hIQsUaLMHRY9YLa+W2mAxT62un54Eb6Pub/RCYY7tjtE7bWe2AIT94neB3Hd0txcmy7A9y8WqaRKQjJAenCO1vBf9K2v46lR+NrDO4zsP4bsZldM0VbQCAkgdv0YW5KCxDJJwcUCJEeCmy/EB6HsrcAiMsy2CZ6xq7Tl+vzK+yZiPlmonEfiCEIsa0HPpOopdTlhL3w7zMf9Qx/PvvoToXmOPLOP+/upe1eMC/17Ji4PDA/Ty+UaWUxezxO3Kr/GbRyIwYUl3q7hhBQ3CyDy81xsXIhHROMdkq7KZN3i3blqYMJMr72QK9esAIIbvpGMvp2QKWIvxjTjcpvcbrNOYezmR7ZsmISWNh0VkHfdSaqPpwQYTgmBGHtdFhydYFmIjBi0c6//Y08a3sgFgShNhPzlnaVL9OEnYWDkuQ05qG/Wj0XhcRVJCj/z3zGJYa X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN2PR12MB4192.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(136003)(346002)(376002)(39860400002)(366004)(396003)(451199015)(6506007)(478600001)(110136005)(6486002)(26005)(316002)(38100700002)(86362001)(2616005)(186003)(83380400001)(6512007)(2906002)(8936002)(66476007)(41300700001)(36756003)(8676002)(66556008)(66946007)(5660300002)(4216001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: KkyOC/YvPozgjP7B1rT8viunvURQOCGUO64q6qk5G9X15M8zpMk6uXbuGJ2xdhb40korAyvjhrLCW1HoEpnrQzJj14ric8ySitrUnkuL5+h9qtpn0TJljTNEDGKTACIGWUh/Pids/LMMZiv8uvb6fMnrqBxCy36cKCDpUG+nZGku+dYTRd2kiROf9wR2Vwt+D+ywwhOVAA1EXez6baPNbDqHqHBrRG09l52mTImLAFPmrY9izjgt+pO6y6y5cJo8cK8foOEEv3HyP1vDPIwUY4ymGCEm9h1x3tOm9nxBFW6T2eqzj01bGtt/S3S2gjPTJ4qLqBmetsdorjhkBXxkQGf14CSoJHwG7F6V2Ty++2U/YL47XJabFjkSae04MThhWw7uhFDU0SwMRICtmJuUBRGYkONijKQyHJ5AU7AeTAxGIyCH1IKq2X7XWXrjpwQ1m7wXAR6QQ7uF7ZWRjmnb69rMB97yf8QbG0aj6LacG+B4QKEudaGbKL9I7xFZHs0ywvrHMMMdTi2iER4gHVgVc7kkMnp/G9bEnN2y8jSIrtWkWulqQ1FE11H1MJu03mNscEl7y3Sh81f+BAUnJWUhApNq6ghZ32SvakhYQ0nPxCeVeame44OosmRXKdoizXx7qS3z00eta6+HOu6Vwk8mvG4Og3wcE6CpwFAZ8VkGA/ij20mecyTxjJyEglOkl3tky9vsuPSOUP6NQEsAL0whTFhL9vKkR84JrDfxgEcPz3fNHiCg44judwodBsmFKlRa45fIRJ+9GUBB7LXqjia5E9l00C+nD7SF3q8J2Em68mdRIOipJwBL6x4DSw4qOGJJbZL5eoqqnB/D/WW45q8JFXnyRJJHCOSFiCtAXr02S7ILd1DBYRhVVdDCTNP32x9qiXwY45LtApWIyOxA378OP1DMUUe1Hz2FHraAidvEglGeXhXahMaM6YbODhol4de46tO0Wjxv0QDFHjX0F7hp7axyk5mlxhVUVynm+dZZ9p5ix1FMAQt75t2JiwEJEDt1JEOpz0r5V/gWNIS4ClC51Yq5YB+LdU8XysBzgowLcTdF+pohoDFxvxqiS+EOsjy579ZqJy8RNY17fbMSJGoHavG1TuN7EBwywCD4xRzCtOMtJja77ztZUq2fyYrhaiVlZKkj0YiW9VwUFpVY3Ee8kOyX548JYhfqrERx50lpQketv1z/I/BX8KcSJpX+AMjHszilbOAjqPfn6k+F/APhMmhDYI4bUd7hSOFuzaiFqx2zy2XV5HPMTPAZtPLSYh+M919mabyJAK2m1onB75fyrFzLz6W7c1LLDADJfQJZOKl9bzggNB2lsfB069crVwx5FSry+hOF4KBqifE3ik76enO2uRTirfeLLyj9gP4EJyz+k4kqp5//Y2+F+hn+FIR9/eG9Wq9LAb8ASU5C2lJ/XKdG0+hj1xt4n/7KFCS7ZpdQKsoc0xSixZKFj9/MDnG4Lx/6lWCNlnnEQUUY3Pkx5UrR8tCrJ2smmfgAYy498IFTH/jcH/kyo5Ix6H/2HKJC3vgOrMlisfhYCmljLZrXZRd6R+m5R8CvScvehXnNxCk= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 27e75313-2d49-4a6b-5a80-08daa22b3427 X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB4192.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Sep 2022 14:59:27.0040 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: oLObUV5uYSGStVGr7VA7HydCvbUoAqutbUT7ZG3M0wovKfJwvN9eSsGTMKmovq8F X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB6389 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org These days not much is using the read side: - device first open - ioctl_get_status - device FD release - check enforced_coherent None of this is performance, so just make it into a normal mutex. Signed-off-by: Jason Gunthorpe Reviewed-by: Kevin Tian --- drivers/vfio/container.c | 10 ++++----- drivers/vfio/vfio.h | 2 +- drivers/vfio/vfio_main.c | 47 ++++++++++++++++++++-------------------- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/drivers/vfio/container.c b/drivers/vfio/container.c index db7c071ee3de1a..d74164abbf401d 100644 --- a/drivers/vfio/container.c +++ b/drivers/vfio/container.c @@ -430,7 +430,7 @@ int vfio_container_attach_group(struct vfio_container *container, struct vfio_iommu_driver *driver; int ret = 0; - lockdep_assert_held_write(&group->group_rwsem); + lockdep_assert_held(&group->group_lock); if (group->type == VFIO_NO_IOMMU && !capable(CAP_SYS_RAWIO)) return -EPERM; @@ -481,7 +481,7 @@ void vfio_group_detach_container(struct vfio_group *group) struct vfio_container *container = group->container; struct vfio_iommu_driver *driver; - lockdep_assert_held_write(&group->group_rwsem); + lockdep_assert_held(&group->group_lock); WARN_ON(group->container_users != 1); down_write(&container->group_lock); @@ -515,7 +515,7 @@ int vfio_device_assign_container(struct vfio_device *device) { struct vfio_group *group = device->group; - lockdep_assert_held_write(&group->group_rwsem); + lockdep_assert_held(&group->group_lock); if (!group->container || !group->container->iommu_driver || WARN_ON(!group->container_users)) @@ -531,11 +531,11 @@ int vfio_device_assign_container(struct vfio_device *device) void vfio_device_unassign_container(struct vfio_device *device) { - down_write(&device->group->group_rwsem); + mutex_lock(&device->group->group_lock); WARN_ON(device->group->container_users <= 1); device->group->container_users--; fput(device->group->opened_file); - up_write(&device->group->group_rwsem); + mutex_unlock(&device->group->group_lock); } /* diff --git a/drivers/vfio/vfio.h b/drivers/vfio/vfio.h index 78b362a9250113..4a1bac1359a952 100644 --- a/drivers/vfio/vfio.h +++ b/drivers/vfio/vfio.h @@ -56,7 +56,7 @@ struct vfio_group { struct list_head vfio_next; struct list_head container_next; enum vfio_group_type type; - struct rw_semaphore group_rwsem; + struct mutex group_lock; struct kvm *kvm; struct file *opened_file; struct swait_queue_head opened_file_wait; diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c index 57a7576a96a61b..9207e6c0e3cb26 100644 --- a/drivers/vfio/vfio_main.c +++ b/drivers/vfio/vfio_main.c @@ -158,6 +158,7 @@ static void vfio_group_release(struct device *dev) struct vfio_group *group = container_of(dev, struct vfio_group, dev); mutex_destroy(&group->device_lock); + mutex_destroy(&group->group_lock); iommu_group_put(group->iommu_group); ida_free(&vfio.group_ida, MINOR(group->dev.devt)); kfree(group); @@ -187,7 +188,7 @@ static struct vfio_group *vfio_group_alloc(struct iommu_group *iommu_group, group->cdev.owner = THIS_MODULE; refcount_set(&group->drivers, 1); - init_rwsem(&group->group_rwsem); + mutex_init(&group->group_lock); init_swait_queue_head(&group->opened_file_wait); INIT_LIST_HEAD(&group->device_list); mutex_init(&group->device_lock); @@ -665,7 +666,7 @@ static int vfio_group_ioctl_unset_container(struct vfio_group *group) { int ret = 0; - down_write(&group->group_rwsem); + mutex_lock(&group->group_lock); if (!group->container) { ret = -EINVAL; goto out_unlock; @@ -677,7 +678,7 @@ static int vfio_group_ioctl_unset_container(struct vfio_group *group) vfio_group_detach_container(group); out_unlock: - up_write(&group->group_rwsem); + mutex_unlock(&group->group_lock); return ret; } @@ -696,7 +697,7 @@ static int vfio_group_ioctl_set_container(struct vfio_group *group, if (!f.file) return -EBADF; - down_write(&group->group_rwsem); + mutex_lock(&group->group_lock); if (group->container || WARN_ON(group->container_users)) { ret = -EINVAL; goto out_unlock; @@ -709,7 +710,7 @@ static int vfio_group_ioctl_set_container(struct vfio_group *group, } out_unlock: - up_write(&group->group_rwsem); + mutex_unlock(&group->group_lock); fdput(f); return ret; } @@ -727,9 +728,9 @@ static struct file *vfio_device_open(struct vfio_device *device) struct file *filep; int ret; - down_write(&device->group->group_rwsem); + mutex_lock(&device->group->group_lock); ret = vfio_device_assign_container(device); - up_write(&device->group->group_rwsem); + mutex_unlock(&device->group->group_lock); if (ret) return ERR_PTR(ret); @@ -746,7 +747,7 @@ static struct file *vfio_device_open(struct vfio_device *device) * lock. If the device driver will use it, it must obtain a * reference and release it during close_device. */ - down_read(&device->group->group_rwsem); + mutex_lock(&device->group->group_lock); device->kvm = device->group->kvm; if (device->ops->open_device) { @@ -755,7 +756,7 @@ static struct file *vfio_device_open(struct vfio_device *device) goto err_undo_count; } vfio_device_container_register(device); - up_read(&device->group->group_rwsem); + mutex_unlock(&device->group->group_lock); } mutex_unlock(&device->dev_set->lock); @@ -788,14 +789,14 @@ static struct file *vfio_device_open(struct vfio_device *device) err_close_device: mutex_lock(&device->dev_set->lock); - down_read(&device->group->group_rwsem); + mutex_lock(&device->group->group_lock); if (device->open_count == 1 && device->ops->close_device) { device->ops->close_device(device); vfio_device_container_unregister(device); } err_undo_count: - up_read(&device->group->group_rwsem); + mutex_unlock(&device->group->group_lock); device->open_count--; if (device->open_count == 0 && device->kvm) device->kvm = NULL; @@ -860,13 +861,13 @@ static int vfio_group_ioctl_get_status(struct vfio_group *group, status.flags = 0; - down_read(&group->group_rwsem); + mutex_lock(&group->group_lock); if (group->container) status.flags |= VFIO_GROUP_FLAGS_CONTAINER_SET | VFIO_GROUP_FLAGS_VIABLE; else if (!iommu_group_dma_owner_claimed(group->iommu_group)) status.flags |= VFIO_GROUP_FLAGS_VIABLE; - up_read(&group->group_rwsem); + mutex_unlock(&group->group_lock); if (copy_to_user(arg, &status, minsz)) return -EFAULT; @@ -899,7 +900,7 @@ static int vfio_group_fops_open(struct inode *inode, struct file *filep) container_of(inode->i_cdev, struct vfio_group, cdev); int ret; - down_write(&group->group_rwsem); + mutex_lock(&group->group_lock); /* * drivers can be zero if this races with vfio_device_remove_group(), it @@ -926,7 +927,7 @@ static int vfio_group_fops_open(struct inode *inode, struct file *filep) filep->private_data = group; ret = 0; out_unlock: - up_write(&group->group_rwsem); + mutex_unlock(&group->group_lock); return ret; } @@ -936,7 +937,7 @@ static int vfio_group_fops_release(struct inode *inode, struct file *filep) filep->private_data = NULL; - down_write(&group->group_rwsem); + mutex_lock(&group->group_lock); /* * Device FDs hold a group file reference, therefore the group release * is only called when there are no open devices. @@ -945,7 +946,7 @@ static int vfio_group_fops_release(struct inode *inode, struct file *filep) if (group->container) vfio_group_detach_container(group); group->opened_file = NULL; - up_write(&group->group_rwsem); + mutex_unlock(&group->group_lock); swake_up_one(&group->opened_file_wait); return 0; @@ -1001,12 +1002,12 @@ static int vfio_device_fops_release(struct inode *inode, struct file *filep) mutex_lock(&device->dev_set->lock); vfio_assert_device_open(device); - down_read(&device->group->group_rwsem); + mutex_lock(&device->group->group_lock); if (device->open_count == 1 && device->ops->close_device) device->ops->close_device(device); vfio_device_container_unregister(device); - up_read(&device->group->group_rwsem); + mutex_unlock(&device->group->group_lock); device->open_count--; if (device->open_count == 0) device->kvm = NULL; @@ -1580,7 +1581,7 @@ bool vfio_file_enforced_coherent(struct file *file) if (file->f_op != &vfio_group_fops) return true; - down_read(&group->group_rwsem); + mutex_lock(&group->group_lock); if (group->container) { ret = vfio_container_ioctl_check_extension(group->container, VFIO_DMA_CC_IOMMU); @@ -1592,7 +1593,7 @@ bool vfio_file_enforced_coherent(struct file *file) */ ret = true; } - up_read(&group->group_rwsem); + mutex_unlock(&group->group_lock); return ret; } EXPORT_SYMBOL_GPL(vfio_file_enforced_coherent); @@ -1612,9 +1613,9 @@ void vfio_file_set_kvm(struct file *file, struct kvm *kvm) if (file->f_op != &vfio_group_fops) return; - down_write(&group->group_rwsem); + mutex_lock(&group->group_lock); group->kvm = kvm; - up_write(&group->group_rwsem); + mutex_unlock(&group->group_lock); } EXPORT_SYMBOL_GPL(vfio_file_set_kvm);