From patchwork Tue Oct 26 17:57:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 12585395 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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 42FF5C433F5 for ; Tue, 26 Oct 2021 17:57:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2367E610A0 for ; Tue, 26 Oct 2021 17:57:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238003AbhJZSAI (ORCPT ); Tue, 26 Oct 2021 14:00:08 -0400 Received: from mail-co1nam11on2068.outbound.protection.outlook.com ([40.107.220.68]:12137 "EHLO NAM11-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S237991AbhJZSAD (ORCPT ); Tue, 26 Oct 2021 14:00:03 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=EO32wazu2L5kzq/ovdKh0AlFlAgBdu5RmkKDmXuBNCHRpvMQ6KO0nnMRz77wy6AQZ9QnmhWVJZqQ0ERX2JLo79sp4lh2ov2M8P9CshsWKmtop9ZTeIhrHafGaAdn82HnGLvncu9zC27GPzcDn9M+TU/UNeZlurIC7WBrbUmC2IGryD1X2tKSQRMz2CL3NvvprDpsNGYBJ1Q7a6qnVRsVHAo2l/8vbhvPIKFvdLhDZ17YfjLxjQl3Nr2+wa5cQHnpWWrSSMIcl6auFbpSiScLxXXjm7hGBrV8Yt4MBH/7xjL4SJRXWEFx/j9KB6L9XiwWiV2g38CbTr7zbYn4PSd2uA== 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=YTh6ZUm2PrgORCNyCbn+2r3MpGIT/x7JNE9sdNM2aA8=; b=X+U+beuG7/+4eS9vI6khWLZ0qgIWT5TjbG4oDsTl5U4qztyg7T4GIFATHUzig+PHRmMnVl3Z+fJLDsyEVcq+61xqp1hjy60kiGyXaNfnJyY5YQ6OoCBU7b3iOqkTHfohgwNjQp/1btotxWgbsVsEFL0GPgivDceNm51TDKaSKYN3NnSa6WWTv1odzmqRto7AnKcXFL3UUaCe61hSGkvFW4WoMs1ergrcpZJho2WKavxvFpRFf1TUEYyteBDrXktJpPREqBmoBrQDwbDeJipywgKmWu0tBH5G4tR95TiXtRa2ztt3QIOQcSYDdNRlFjB5YG6eBYQ7zFSS+NtdHFmtUg== 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=YTh6ZUm2PrgORCNyCbn+2r3MpGIT/x7JNE9sdNM2aA8=; b=J/N1VGsg9n9dzgH7ma1MmoCxJrYYVpYpDGyGB36rg/wiwxoBH/J/BEq5wHKhNLbbgn8MMZUmrWcDFYip3z4niPDTTJ8L2nIvGQtQacIR6Py4jVny7OEMD/IzvGEM+1T8nxpZa+sdPVwyV2x9DmBlcUXk01VAecDHC4c9j1hFfvBR1MTDbVZuLkmaT+oujzrTx2EjrLCzLS0PLR2hXQd2AMRLF3gVCF3wrnd8DAWI4C0MhHylyxjnpTBIdDx4S5PdLdVLaqezQxhPIt6Dm2uj4hIqo2c7oW0Isvh5w8IqXaHjtRKEbTsSpSyCYJGP1M13mdTWW1p8CgKdtzbDhWTzaQ== Authentication-Results: redhat.com; dkim=none (message not signed) header.d=none;redhat.com; dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB5506.namprd12.prod.outlook.com (2603:10b6:208:1cb::22) by BL1PR12MB5077.namprd12.prod.outlook.com (2603:10b6:208:310::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4628.16; Tue, 26 Oct 2021 17:57:37 +0000 Received: from BL0PR12MB5506.namprd12.prod.outlook.com ([fe80::e8af:232:915e:2f95]) by BL0PR12MB5506.namprd12.prod.outlook.com ([fe80::e8af:232:915e:2f95%8]) with mapi id 15.20.4649.014; Tue, 26 Oct 2021 17:57:37 +0000 From: Jason Gunthorpe To: Alex Williamson , Christian Borntraeger , Cornelia Huck , Vasily Gorbik , Heiko Carstens , kvm@vger.kernel.org, linux-s390@vger.kernel.org, Matthew Rosato , Peter Oberparleiter , Halil Pasic , Vineeth Vijayan Cc: Eric Farman , Christoph Hellwig Subject: [PATCH v4 2/4] vfio/ccw: Use functions for alloc/free of the vfio_ccw_private Date: Tue, 26 Oct 2021 14:57:31 -0300 Message-Id: <2-v4-cea4f5bd2c00+b52-ccw_mdev_jgg@nvidia.com> In-Reply-To: <0-v4-cea4f5bd2c00+b52-ccw_mdev_jgg@nvidia.com> References: X-ClientProxiedBy: YT1PR01CA0122.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:2c::31) To BL0PR12MB5506.namprd12.prod.outlook.com (2603:10b6:208:1cb::22) MIME-Version: 1.0 Received: from mlx.ziepe.ca (206.223.160.26) by YT1PR01CA0122.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:2c::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4649.13 via Frontend Transport; Tue, 26 Oct 2021 17:57:36 +0000 Received: from jgg by mlx with local (Exim 4.94) (envelope-from ) id 1mfQhZ-002BJv-GS; Tue, 26 Oct 2021 14:57:33 -0300 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 14f1b6a6-0f25-4caf-7bb5-08d998aa1857 X-MS-TrafficTypeDiagnostic: BL1PR12MB5077: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:785; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: dAZt9mqavBvszAKsQ4SXYWaj/KPwfYvh0Y5ua1+psRwdxOJ2YNhZQN08t7nPwHhn0odqKgkR/D8xLGHAdL8MGTJrZtAfthOMI4W7PqAQnASfe5q5vSk8OJsZXXEJAI3slLg4IET7JBwqYsUDyZ7sKdt2fk9nnaTLsJTXaZZ3l5pcrpqUBdTgewlK6TZXANJ8QVv9Qwu25rdnukS+/iY4X6v/4tvCr+ixUyO5sB8fJRhpWL2QmzLbCAamp2snUrNY398Sf3pUQFnluRqco4Gy1W0wbW/AtYgDI61o/kHkDxTpJWQdrAFVnQI8ji8JbFsWRD3w/fDfa2KO0N0O7jOCkedYsYRojvq8a42/ks82ovlWngXYQSIosCKH6D2ECk4bz24WIb2OjDwzarVEb9gJp82vfb/CcnDS+yrsFvT8yhlMzRpf6b/D3SVwERdmafiT7fVDlr7vtaMJUjCmVQgWIr73iHmiFUfWUIg0wyFOQ0/5BfFoeCwey+Y35tMT9MHf2wmFCKkg/8gxeKwklvmCiPM2+AiEQ/X4Lfuen+Xrx6xR18jH8dldZyJYF9Bx9qg7tN36e40IKAYIbDDXFiuufu6wn9e44UsHS9+tFEQDIO8LaZtcJQHfDre92+AQTwlfYTkf5yPd7v0rnb9ZkxIaqmUCYk/ZBFEKVXytYHtc8sdtLky4fkQ413z3yUlu+dZCbBqafimhfwpO5bC5Og57Cw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB5506.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(366004)(66946007)(5660300002)(66476007)(66556008)(7416002)(186003)(83380400001)(26005)(508600001)(4326008)(36756003)(9746002)(38100700002)(9786002)(426003)(54906003)(110136005)(2906002)(8676002)(2616005)(316002)(86362001)(8936002)(921005)(4216001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: SiF9IDGbCT4fm4GcG5OVOH99W4zj9iLneonGuQdGPRnf8aF92r1dqQ5sD33HqtOmDo8oy/GYaraUmBWmQEMvSTcWnIipoPa2Zg/xA593NgtoUuPyQX7wHyK7rNA7y/mwDTVfsb/LgiNb5I0DNExFxHLSG4AHRz7ZY7hRmKwBRPm4RqWgaRrz3SHt2w0DFGhzIfdG+P8DpQo9J1iv/Lmc0OZuG8xGrN9CFQYzCGYhWMhfcVoLA0GQnUGgioYUoOfhi0pzuC9gOJtyWXLHyEjZKx0YqAmp0YvVhzr0V4HmB29hFo/2GeBEk1QvOT6c2T9JlQJe3l/ud8o6wES9nRQ4qBj42I8CpZc4XLgR21TqCFqvAi33T+++TE3XMFRDFwzvY83PGpFNskLeiifz7TZobR9/g5p8rUcDc0gcpd/c8db19HKL+rqlIxwA7wK+R3xGPziiqVfja4aCbMdkSG2J6qVqHK+Ctasf3OUo+6sROjBIZSkMyYSUgwKHytN6QnfGaL/vj3uHvPFgiMpMyYf3P99O2Xb8uCBqT2BcUOlxnoH+jxLLusq5JW2vCRk74iiWO7JMUAQTyRKxHBgiWRezwpLk4JcjVBk6EDS5q2kGxvMfsAUxhC5mqG5PDZjHtp1m+1nAu09YNY8R9ItqdFKhZh25AiGJeQf+5lYWtaU3mDevA1XQZ9bT8cosEzwESee6OhSG2E1W10s3rzOzygjc3Ip9X8FRrqU3z8R88xL+JiMufZQ+Rp2QFqhADGMIMKi0uwwCYnXZOok799Z1uMtGO6/nA3OVpLb24oD5Gq5qahI8u0kxyzFkfUQXvIRERNTDUrNK5g8M5pziunJ5p24U02LmMhAlH0BOdj1AyflTWAcONobJ9sGTPRPntw4Hso+gQzhymUqMToZb5YLoRIaKxq8GLuVjWCv42XO/KhII77Htp9nz42wC6z16Kw+P8ZPw2So3qTBown22QLsegKeTS6MA7an+MNw+Ju+l1UeNhxMEM9afI6oTjOCzbE80d+jAxLqtTvzxaWQUM40eUJEPKId0dEBUC1jaR3j2duge+Wq2d6MfNfY/YnOcN4iD35A5tMqVflzOzP7aYwqUfBFwc4xEN19KnWea46wy2ArDPfTVKUnhztiyNtImBM5vjip7H0eUt0qvHGrTn1BGPKjFmfYXtVPclVP8EPex4O6wHU3OR4qXlDN2jlLRHpvsd0AhXag3G8v+M7BR/gQusnyWf7NDvR/q/JT16U3VdvGIkRibf9RX9N18rYB1s+1lK5XbwyuLxjleVFl7+nDGGGsMrjWm8G7GlS2ofSgR1V0LBsTnNfJPLrYGA8rS3zgLzhfOmr6zyy86fCbE7KFjXF/MyPgjz8IxrdTt5Enpnku9w2Cly+Zi9F2/UQrKinrDEwhEudbPDbnliFEjmwDw9XUegrNGLOMK0oRNYpHpl2//5iOBgU4nAVr2IIjqiXdoXWWj2WRGDwYrwYDfXBkabR790GL8zpdcMRZ15nutANHXnPQDHajYdowyLmBO8ukh31Qy7w/oMFD2ZaBbAnl9uEvH+yfPx1027ipq3lYW9sjJYLE= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 14f1b6a6-0f25-4caf-7bb5-08d998aa1857 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB5506.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Oct 2021 17:57:37.2005 (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: 8f/MAHlQe1FZTaxFWSeMH3AHkb7XS/c1aLgliFv+rRsjuTtVLAmz+EOwA17x/L2y X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL1PR12MB5077 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Makes the code easier to understand what is memory lifecycle and what is other stuff. Reviewed-by: Eric Farman Signed-off-by: Jason Gunthorpe --- drivers/s390/cio/vfio_ccw_drv.c | 137 ++++++++++++++++++-------------- 1 file changed, 78 insertions(+), 59 deletions(-) diff --git a/drivers/s390/cio/vfio_ccw_drv.c b/drivers/s390/cio/vfio_ccw_drv.c index 371558ec92045d..e32678a71644fb 100644 --- a/drivers/s390/cio/vfio_ccw_drv.c +++ b/drivers/s390/cio/vfio_ccw_drv.c @@ -137,16 +137,80 @@ static void vfio_ccw_sch_irq(struct subchannel *sch) vfio_ccw_fsm_event(private, VFIO_CCW_EVENT_INTERRUPT); } -static void vfio_ccw_free_regions(struct vfio_ccw_private *private) +static struct vfio_ccw_private *vfio_ccw_alloc_private(struct subchannel *sch) { - if (private->crw_region) - kmem_cache_free(vfio_ccw_crw_region, private->crw_region); - if (private->schib_region) - kmem_cache_free(vfio_ccw_schib_region, private->schib_region); - if (private->cmd_region) - kmem_cache_free(vfio_ccw_cmd_region, private->cmd_region); - if (private->io_region) - kmem_cache_free(vfio_ccw_io_region, private->io_region); + struct vfio_ccw_private *private; + + private = kzalloc(sizeof(*private), GFP_KERNEL); + if (!private) + return ERR_PTR(-ENOMEM); + + private->sch = sch; + mutex_init(&private->io_mutex); + private->state = VFIO_CCW_STATE_NOT_OPER; + INIT_LIST_HEAD(&private->crw); + INIT_WORK(&private->io_work, vfio_ccw_sch_io_todo); + INIT_WORK(&private->crw_work, vfio_ccw_crw_todo); + atomic_set(&private->avail, 1); + + private->cp.guest_cp = kcalloc(CCWCHAIN_LEN_MAX, sizeof(struct ccw1), + GFP_KERNEL); + if (!private->cp.guest_cp) + goto out_free_private; + + private->io_region = kmem_cache_zalloc(vfio_ccw_io_region, + GFP_KERNEL | GFP_DMA); + if (!private->io_region) + goto out_free_cp; + + private->cmd_region = kmem_cache_zalloc(vfio_ccw_cmd_region, + GFP_KERNEL | GFP_DMA); + if (!private->cmd_region) + goto out_free_io; + + private->schib_region = kmem_cache_zalloc(vfio_ccw_schib_region, + GFP_KERNEL | GFP_DMA); + + if (!private->schib_region) + goto out_free_cmd; + + private->crw_region = kmem_cache_zalloc(vfio_ccw_crw_region, + GFP_KERNEL | GFP_DMA); + + if (!private->crw_region) + goto out_free_schib; + return private; + +out_free_schib: + kmem_cache_free(vfio_ccw_schib_region, private->schib_region); +out_free_cmd: + kmem_cache_free(vfio_ccw_cmd_region, private->cmd_region); +out_free_io: + kmem_cache_free(vfio_ccw_io_region, private->io_region); +out_free_cp: + kfree(private->cp.guest_cp); +out_free_private: + mutex_destroy(&private->io_mutex); + kfree(private); + return ERR_PTR(-ENOMEM); +} + +static void vfio_ccw_free_private(struct vfio_ccw_private *private) +{ + struct vfio_ccw_crw *crw, *temp; + + list_for_each_entry_safe(crw, temp, &private->crw, next) { + list_del(&crw->next); + kfree(crw); + } + + kmem_cache_free(vfio_ccw_crw_region, private->crw_region); + kmem_cache_free(vfio_ccw_schib_region, private->schib_region); + kmem_cache_free(vfio_ccw_cmd_region, private->cmd_region); + kmem_cache_free(vfio_ccw_io_region, private->io_region); + kfree(private->cp.guest_cp); + mutex_destroy(&private->io_mutex); + kfree(private); } static int vfio_ccw_sch_probe(struct subchannel *sch) @@ -161,53 +225,19 @@ static int vfio_ccw_sch_probe(struct subchannel *sch) return -ENODEV; } - private = kzalloc(sizeof(*private), GFP_KERNEL); - if (!private) - return -ENOMEM; + private = vfio_ccw_alloc_private(sch); + if (IS_ERR(private)) + return PTR_ERR(private); - private->cp.guest_cp = kcalloc(CCWCHAIN_LEN_MAX, sizeof(struct ccw1), - GFP_KERNEL); - if (!private->cp.guest_cp) - goto out_free; - - private->io_region = kmem_cache_zalloc(vfio_ccw_io_region, - GFP_KERNEL | GFP_DMA); - if (!private->io_region) - goto out_free; - - private->cmd_region = kmem_cache_zalloc(vfio_ccw_cmd_region, - GFP_KERNEL | GFP_DMA); - if (!private->cmd_region) - goto out_free; - - private->schib_region = kmem_cache_zalloc(vfio_ccw_schib_region, - GFP_KERNEL | GFP_DMA); - - if (!private->schib_region) - goto out_free; - - private->crw_region = kmem_cache_zalloc(vfio_ccw_crw_region, - GFP_KERNEL | GFP_DMA); - - if (!private->crw_region) - goto out_free; - - private->sch = sch; dev_set_drvdata(&sch->dev, private); - mutex_init(&private->io_mutex); spin_lock_irq(sch->lock); - private->state = VFIO_CCW_STATE_NOT_OPER; sch->isc = VFIO_CCW_ISC; ret = cio_enable_subchannel(sch, (u32)(unsigned long)sch); spin_unlock_irq(sch->lock); if (ret) goto out_free; - INIT_LIST_HEAD(&private->crw); - INIT_WORK(&private->io_work, vfio_ccw_sch_io_todo); - INIT_WORK(&private->crw_work, vfio_ccw_crw_todo); - atomic_set(&private->avail, 1); private->state = VFIO_CCW_STATE_STANDBY; ret = vfio_ccw_mdev_reg(sch); @@ -228,31 +258,20 @@ static int vfio_ccw_sch_probe(struct subchannel *sch) cio_disable_subchannel(sch); out_free: dev_set_drvdata(&sch->dev, NULL); - vfio_ccw_free_regions(private); - kfree(private->cp.guest_cp); - kfree(private); + vfio_ccw_free_private(private); return ret; } static void vfio_ccw_sch_remove(struct subchannel *sch) { struct vfio_ccw_private *private = dev_get_drvdata(&sch->dev); - struct vfio_ccw_crw *crw, *temp; vfio_ccw_sch_quiesce(sch); - - list_for_each_entry_safe(crw, temp, &private->crw, next) { - list_del(&crw->next); - kfree(crw); - } - vfio_ccw_mdev_unreg(sch); dev_set_drvdata(&sch->dev, NULL); - vfio_ccw_free_regions(private); - kfree(private->cp.guest_cp); - kfree(private); + vfio_ccw_free_private(private); VFIO_CCW_MSG_EVENT(4, "unbound from subchannel %x.%x.%04x\n", sch->schid.cssid, sch->schid.ssid,