From nobody Thu Apr 16 03:47:28 2026 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 AA357C433FE for ; Thu, 24 Nov 2022 01:51:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229644AbiKXBvu (ORCPT ); Wed, 23 Nov 2022 20:51:50 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49874 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229436AbiKXBvs (ORCPT ); Wed, 23 Nov 2022 20:51:48 -0500 Received: from DM4PR02CU001-vft-obe.outbound.protection.outlook.com (mail-centralusazon11022023.outbound.protection.outlook.com [52.101.63.23]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5278E7DEF6; Wed, 23 Nov 2022 17:51:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=N0gAaUQfZ8JipAMNpRJ+FhU2c0zOCbtwM1hckqxo8xO57QsP8BSoVTgvzDg1rg3G6LaTDnoWORW7w/i8ism7qpvx35WntKom2NA1vVo4UrTHOvrwl2RMep/MmcEenjFZJxNWS8Fva+0TPwV2FrAe4nPOu0JN/yCDFiLbSLs2BhNqNbwM+UAzZ1+XbF+bDj6499ufXU/kTHAXzIGe3S2reSK1Hlwb5cpC/DIoWMMLMdeZ0YLh5vI+URZMJLUQkNp5eIhiLLgm9vy9t/wd8Lv3/wvoZ2GjfLKG1bnOW20R77Bw4w3tjhzJIGY+0zxq0ggKvzt53f7OmRpHSYX0u75QiA== 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=3uQAvW1i2lEb1haTYDNJJjntr0F9HjOKuVmUK7LDXok=; b=PQ5LoX4W2Bc8D9QTeuEngXLoHgP1bKK0DL1A78KtswrxnE6mvKJB9fa1REY6sOyouisHHn6ANuniJHsJSsWj9s0kgfM3Rbubm6ZHgKTKsHk8rU1OrHyi/tMhPZpyGmNjJ+o0kQsrWh77FP/wB3VBB40e6xS2rEX4d99207wQORO6ba+rghbSEFY8e88prs/p/9k8xG/pWhlA1srKW2vs2+drSjlcYRfQIF9riYI1NvzxpGirKSHlvgn0q4e7CDmwMu3OGDJJN0WOxFQwT8B4q5kJQN1pRnKzpOp7yar0c5v+4I/8fln3KNiR8b6QUgjJ/qlOfp170m58vtWzGgeXxA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microsoft.com; dmarc=pass action=none header.from=microsoft.com; dkim=pass header.d=microsoft.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=3uQAvW1i2lEb1haTYDNJJjntr0F9HjOKuVmUK7LDXok=; b=ZxMLJ67loAdLMq8QXvkkt75P+8xI3EiOZsuyU69iHgZE+6d6ld5Wfey4z88G3XL6+HOUH9UD2q6bfYwIhRVziUMXXDOPYD+fZJhniI86PTMx+kZijLZDzJn0hKwR3LwXkQLG0f+8zEhZ2QrmI333SilheEkAJTmYgK97rp8xwO4= Received: from SA1PR21MB1335.namprd21.prod.outlook.com (2603:10b6:806:1f2::11) by SA1PR21MB2051.namprd21.prod.outlook.com (2603:10b6:806:1b6::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5880.5; Thu, 24 Nov 2022 01:51:42 +0000 Received: from SA1PR21MB1335.namprd21.prod.outlook.com ([fe80::ac9b:6fe1:dca5:b817]) by SA1PR21MB1335.namprd21.prod.outlook.com ([fe80::ac9b:6fe1:dca5:b817%5]) with mapi id 15.20.5880.004; Thu, 24 Nov 2022 01:51:42 +0000 From: Dexuan Cui To: Robin Murphy , "hch@lst.de" , "m.szyprowski@samsung.com" , "iommu@lists.linux.dev" CC: "linux-kernel@vger.kernel.org" , "linux-hyperv@vger.kernel.org" Subject: RE: [PATCH] swiotlb: check set_memory_decrypted()'s return value Thread-Topic: [PATCH] swiotlb: check set_memory_decrypted()'s return value Thread-Index: AQHY/eqsPHYoQ2/srk+ShZhNBDYuZ65NMzfw Date: Thu, 24 Nov 2022 01:51:42 +0000 Message-ID: References: <20221121194839.21722-1-decui@microsoft.com> <671bc0d5-2c14-32ea-2a37-e15c8a0621ff@arm.com> In-Reply-To: <671bc0d5-2c14-32ea-2a37-e15c8a0621ff@arm.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_ActionId=032e0802-ebc4-4bdc-8829-a374dbd87f69;MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_ContentBits=0;MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Enabled=true;MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Method=Standard;MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Name=Internal;MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SetDate=2022-11-23T23:58:46Z;MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SiteId=72f988bf-86f1-41af-91ab-2d7cd011db47; authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=microsoft.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SA1PR21MB1335:EE_|SA1PR21MB2051:EE_ x-ms-office365-filtering-correlation-id: 65e65d51-8458-4d54-37b3-08dacdbe6f95 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 8oOIJJewBPPfGfjfDfjAFMq2LzbuI+U3KJbWXMMlHaW2XjC5pK7gF+GMzMe58Qrvebn3F2P4cPP/B0q8wLNR9wXcsb2sLPgas5upLSHakdATf9r57bEH0h2ixwV2hvM+kK0F6gU4XBGjg/yCFw6UUUOsw765JvgTprdSauyf7Oh3TsighBOQAIV26psydVWL4XEImiVrKPd7Dado9wy3qfNdW8AIhwHT8AFj1WcMOrU7HCff1lYXNN6hbP8eczd2dkF6IUT52eEj4VE8TARlMTRVowzo4B+9VpBb1hm7Dr9T0w3QmsCvPtbmLXrb5OUg1GB9dZOuP8cCNB4L44MQP95kZWuyb4DY19jHwByRDH5rJI/50wA2BMdcLMscBrkz1pmCseET1kwNAzJJYiQb+K7HpsN3GnF2uEfhurDJGKkbBcyoelrGCh/injMTIPg8yFL5lE7OPsYTHhraAtd/qdOxE1tjjvjIfGKgXremfVotysz5gl4BuMsvPi1A/4Q/V3OIE6HAjq18hDieNYEcSHSpN4C5zz+DA1Q4PY5kKCK0YppnNMngJqLsnQ+4vd8sR7cZBfxcRVjrrOxZ7fDB7dkMWoRfAclEhOsNXyTDMzddKV7CLZ4L0jCyUJWCZcyfRvflbbXfe4C9epTS3oFhv30z40QJOaE4M0k4kwNFuLiotZOfnJw2vh2gjthvt0hFt4/H1fIJ3jc3m6dX6cmPWHE6Z7JLDUKyPo4TlT9MDRJ2Mh+3UJqLdLf8d6FCv8wTY4ELJ4TFgsaSoDoyuBqOWA== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SA1PR21MB1335.namprd21.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(39860400002)(346002)(366004)(396003)(376002)(136003)(451199015)(8936002)(5660300002)(76116006)(66946007)(64756008)(66446008)(66476007)(66556008)(4326008)(8676002)(52536014)(2906002)(41300700001)(10290500003)(478600001)(8990500004)(54906003)(38100700002)(122000001)(110136005)(7696005)(6506007)(33656002)(186003)(71200400001)(966005)(316002)(26005)(9686003)(83380400001)(38070700005)(55016003)(86362001)(82960400001)(82950400001);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?MnFhNTh1YkRESCswVlNpSFg4aE1hN0tZSnhEZ0VaZi9GYTBJTkxiTWRkTnBX?= =?utf-8?B?N2pqMXJRcjdkMjVLOGtEYlUvU2I5OUlWa3lldDcvdUNIUjFZK0lMZUxCdVdl?= =?utf-8?B?Tm1UbTFWc0p6bGxBQ25OcjBHNU5UWXlYU0tvQkVWTnljM2JxaVQ1ZFFmdHo0?= =?utf-8?B?aU5MMHVJU1BHQXoxR1lUZEpYMlZhUnB2b3U5aExTV3k1ZnNwZVQrUDB1dGd0?= =?utf-8?B?dk9GSFBRdUNFQVhoZWRzZHkvOEJhV3QxQ00zdVhUUnBIaFBQY2pmSStBT0Ey?= =?utf-8?B?RVA5c1oxV1JsL1VsazlmS0ZqZ0hYYUpMdjVNMXVsT1lsMHdMdG5XVlVpY2lM?= =?utf-8?B?WFpxMXNsVnFDSU5LZU5TYk1DdHJSUHNaSE5XNytlcDIvamNKRzd6RG52RW1Z?= =?utf-8?B?bEw5eS9kNVpoRFFLdUJXZFN2czV4QXUzeXdZS3dxdUt4bEZuMlJGalhoSWRR?= =?utf-8?B?T3djb3lzaXhGOXJLOXAvNEdyNE0rVkUzVWM0ZG5CVTRQdmZQSWwrZ0pNNWpy?= =?utf-8?B?cjlrTHFoOWQvUEVyRXdDRS9hTU1VT3NmYTNnTVNrdis4dnMzRE5sZDRzOFZJ?= =?utf-8?B?UUlhL3R6MUQ2aThKRWRoNXZDNFdmbFJkL1ZkMUo0cU9jcmNldXhVUStZbXJP?= =?utf-8?B?ZjJQZysyWE5IVzZYZVVZeHpPOUxUU0daOFV4NCt4NW12WjgwNENCVmlLRS9G?= =?utf-8?B?K2xNcnZPbEErRml5SHpoQSsyWENsbGdudmJZaS9ITGRtOEF4Rk40RW1DYUVL?= =?utf-8?B?ZVdGYWtmRmdxQTlFRGZPeXRIR2tjcWlsYUl3M1RkcXpKMGhmMVRVbTJDQUth?= =?utf-8?B?bGY4VkVMOFk3ZFF2K1JJazBobHF5VHoxNHR5SEcwNFNubjR3UGp2K1ViL1RL?= =?utf-8?B?bEVmcjlRZUVYVGF4a01xSzRmNG9WbnhITWpPRnZQMDBOVnZDV01aaDcxSm1I?= =?utf-8?B?UWlYK3N2dm9IWlVKSmtEdVJCMmZ4eDY5Rks0L3VBbzZxZFJEb2lmU2NjOTZv?= =?utf-8?B?UzZiRHRYNWVGclZFSXQvUldXYjhmS1hJMElSRVA0K0dpclkxS0NhSHFOYkFV?= =?utf-8?B?aTl0MEVzYWkzdVU4NkEzOXZQdFd3dWJHK3Ura2hoQTlsNjh3RmtrNHAzR3Ry?= =?utf-8?B?UnU5L2xUalJkK3YycWhac21wWDR4QzRqaXJFUzF5Vk5lQW5FZEYrYjRZOXR2?= =?utf-8?B?dUxrblZ6RVZrMlcvWkJrT0UrSHBGMkRvK3ZOZ21YZ0hDdmFPUVFSMlVMMlhj?= =?utf-8?B?bGJZY0crME1zajgzNENZY2M0dy90bFRsd3Q5ZlpPaFppZlhFNU4vWjFHaURn?= =?utf-8?B?alBHaXV5SlY4UnB6M3hHV1MwNm4vSEFEZnhsdlNabjRSOWdjR1B2V2pEczJW?= =?utf-8?B?N2syVWVVTXVZVCtjclpLVGw5U3lxSHpwSzN5WFNNV2ZXMy80dlo5ZlVRaXE5?= =?utf-8?B?NytGbm1qTlE3RHZKek5pT1pJeVVhdFlzdmM4T0dqWkQxV0w1dFhveERWVUIz?= =?utf-8?B?R0RUNXJ5NTlPRStNQTBDL1gzNkNZclhFb2U1YzdOdWpqN05GbEo2VWxxeXlp?= =?utf-8?B?cThKSVd3VHZTU3YzTXFGeGhiVkFjcVBSZnYwaU9uV3grYStPTWRUS2JmcUdN?= =?utf-8?B?VmRhdDZNb0JlaG5MOHhKMkk2NnZ1R01STXI3MkdhOXdMVzRoSzQ0QkRDczVs?= =?utf-8?B?eEE0RVFhZHhNSFhSQ3ZYRUdyZ2doYk16NklvZERSekJCbUhvRDN3TXpJNGRh?= =?utf-8?B?UWZ0U1JCbXhUbTJvNmZOUjhUTSt4UnpiUGhXTFo5OTJyNlJncXRCVTlETE9y?= =?utf-8?B?aFlYWTg2c05vWlNyY0R2VkNSODlrZzlkS2JScXhCQjMyTWE1ZmxqUUk0NW41?= =?utf-8?B?Zzd1aWVQaWF6R0UreFB6QkdWR0diSkZaR01zVU92TVpTMk1DTGExbzJMNXND?= =?utf-8?B?amNZZWlOSzVsN3Jkcy8weHdsS0doVkg3UHlmKzZJdUpsci83ZTA0S2kxcEQy?= =?utf-8?B?MTR6ZlVvZmtmN1gwT0RzVTNXbHlLdVNNVVFtMW1hQmtLM0wvNE42cTg1Sk9y?= =?utf-8?B?dWZVelJldjFzZkUveHJLYVJMRm9NMEZyZEVYOXlvMmw2dVpQc2ExcGozTWdn?= =?utf-8?Q?H+qdaVK0T1VeW7k6CDqANUP1L?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SA1PR21MB1335.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 65e65d51-8458-4d54-37b3-08dacdbe6f95 X-MS-Exchange-CrossTenant-originalarrivaltime: 24 Nov 2022 01:51:42.5720 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 72f988bf-86f1-41af-91ab-2d7cd011db47 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: aRc+C5gQ5iOYsqP6UXI8nQMjR6kZ7EZo4C4M96crpstKfLhBH7skTzYIp8s/qEL/mRERkkZXgf5vXyP1zjypdQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR21MB2051 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > From: Robin Murphy > Sent: Monday, November 21, 2022 12:49 PM > > [...] > > diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c > > @@ -248,12 +248,16 @@ void __init swiotlb_update_mem_attributes(void) > > struct io_tlb_mem *mem =3D &io_tlb_default_mem; > > void *vaddr; > > unsigned long bytes; > > + int rc; > > > > if (!mem->nslabs || mem->late_alloc) > > return; > > vaddr =3D phys_to_virt(mem->start); > > bytes =3D PAGE_ALIGN(mem->nslabs << IO_TLB_SHIFT); > > - set_memory_decrypted((unsigned long)vaddr, bytes >> PAGE_SHIFT); > > + > > + rc =3D set_memory_decrypted((unsigned long)vaddr, bytes >> PAGE_SHIFT= ); > > + if (rc) > > + panic("Failed to decrypt swiotlb bounce buffers (%d)\n", rc); >=20 > Aww, I just cleaned up all the panics! AFAICS we could warn and set Sorry, I didn't know about that... :-) > mem->nslabs to 0 here to semi-gracefully disable SWIOTLB (presumably > decryption failure is sufficiently unexpected that "leaking" the SWIOTLB > memory is the least of the system's problems). Or indeed just warn and > do nothing as in the swiotlb_init_late() case below - what's with the > inconsistency? In either path we have the same expectation that > decryption succeeds (or does nothing, successfully), so failure is no > more or less fatal to later SWIOTLB operation depending on when the > architecture chose to set it up. I agree it's better to print an error message rather than panic here, but anyway the kernel will panic later, e.g. when an AMD SEV-SNP guest runs on Hyper-V, in case this set_memory_decrypted() fails, we set mem->nslabs to 0, and next we'll hit a panic soon when the storage driver calls swiotlb_tbl_map_single(): "Kernel panic - not syncing: Can not allocate SWIOTLB buffer earlier and=20 can't now provide you with the DMA bounce buffer". > So in 3 init paths we have 3 different outcomes from the same thing :( >=20 > 1: make the whole system unusable > 2: continue with possible data corruption (or at least weird DMA errors) > if devices still see encrypted memory contents > 3: cleanly disable SWIOTLB, thus also all subsequent attempts to use it >=20 > (OK, for the rmem case this isn't actually 3 since falling back to > io_tlb_default_mem might work out more like 2, but hopefully you get my > point) >=20 > Thanks, > Robin. How do you like this new version:=20 1) I removed the panic(). 2) For swiotlb_update_mem_attributes() and swiotlb_init_late(), I print an error message and disable swiotlb: the error seems so bad that IMO we have to disable swiotlb. 3) No change to rmem_swiotlb_device_init(). The error in this function doesn't seem fatal to me. The bottom line is that set_memory_decrypted() should not fail silently and cause weird issues later... BTW, normally IMO set_memory_decrypted() doesn't fail, but I did see a failure because we're expectd to retry (the failure is fixed by https://lwn.net/ml/linux-kernel/20221121195151.21812-3-decui%40microsoft.co= m/) --- a/kernel/dma/swiotlb.c +++ b/kernel/dma/swiotlb.c @@ -248,12 +248,20 @@ void __init swiotlb_update_mem_attributes(void) struct io_tlb_mem *mem =3D &io_tlb_default_mem; void *vaddr; unsigned long bytes; + int rc; =20 if (!mem->nslabs || mem->late_alloc) return; vaddr =3D phys_to_virt(mem->start); bytes =3D PAGE_ALIGN(mem->nslabs << IO_TLB_SHIFT); - set_memory_decrypted((unsigned long)vaddr, bytes >> PAGE_SHIFT); + + rc =3D set_memory_decrypted((unsigned long)vaddr, bytes >> PAGE_SHI= FT); + if (rc) { + pr_err("Failed to decrypt swiotlb buffer (%d): disabling sw= iotlb!\n", + rc); + mem->nslabs =3D 0; + return; + } =20 mem->vaddr =3D swiotlb_mem_remap(mem, bytes); if (!mem->vaddr) @@ -391,7 +399,7 @@ int swiotlb_init_late(size_t size, gfp_t gfp_mask, struct io_tlb_mem *mem =3D &io_tlb_default_mem; unsigned long nslabs =3D ALIGN(size >> IO_TLB_SHIFT, IO_TLB_SEGSIZE= ); unsigned char *vstart =3D NULL; - unsigned int order, area_order; + unsigned int order, area_order, slot_order; bool retried =3D false; int rc =3D 0; =20 @@ -442,19 +450,29 @@ int swiotlb_init_late(size_t size, gfp_t gfp_mask, if (!mem->areas) goto error_area; =20 + slot_order =3D get_order(array_size(sizeof(*mem->slots), nslabs)); mem->slots =3D (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, - get_order(array_size(sizeof(*mem->slots), nslabs))); + slot_order); if (!mem->slots) goto error_slots; =20 - set_memory_decrypted((unsigned long)vstart, - (nslabs << IO_TLB_SHIFT) >> PAGE_SHIFT); + rc =3D set_memory_decrypted((unsigned long)vstart, + (nslabs << IO_TLB_SHIFT) >> PAGE_SHIFT); + if (rc) { + pr_err("Failed to decrypt swiotlb buffer (%d): disabling sw= iotlb!\n", + rc); + mem->nslabs =3D 0; + goto error_decrypted; + } + swiotlb_init_io_tlb_mem(mem, virt_to_phys(vstart), nslabs, 0, true, default_nareas); =20 swiotlb_print_info(); return 0; =20 +error_decrypted: + free_pages((unsigned long)mem->slots, slot_order); error_slots: free_pages((unsigned long)mem->areas, area_order); error_area: @@ -986,6 +1004,7 @@ static int rmem_swiotlb_device_init(struct reserved_me= m *rmem, =20 /* Set Per-device io tlb area to one */ unsigned int nareas =3D 1; + int rc =3D -ENOMEM; =20 /* * Since multiple devices can share the same pool, the private data, @@ -998,21 +1017,22 @@ static int rmem_swiotlb_device_init(struct reserved_= mem *rmem, return -ENOMEM; =20 mem->slots =3D kcalloc(nslabs, sizeof(*mem->slots), GFP_KER= NEL); - if (!mem->slots) { - kfree(mem); - return -ENOMEM; - } + if (!mem->slots) + goto free_mem; =20 mem->areas =3D kcalloc(nareas, sizeof(*mem->areas), GFP_KERNEL); - if (!mem->areas) { - kfree(mem->slots); - kfree(mem); - return -ENOMEM; + if (!mem->areas) + goto free_slots; + + rc =3D set_memory_decrypted( + (unsigned long)phys_to_virt(rmem->base), + rmem->size >> PAGE_SHIFT); + if (rc) { + pr_err("Failed to decrypt rmem buffer (%d)\n", rc); + goto free_areas; } =20 - set_memory_decrypted((unsigned long)phys_to_virt(rmem->base= ), - rmem->size >> PAGE_SHIFT); swiotlb_init_io_tlb_mem(mem, rmem->base, nslabs, SWIOTLB_FO= RCE, false, nareas); mem->for_alloc =3D true; @@ -1025,6 +1045,14 @@ static int rmem_swiotlb_device_init(struct reserved_= mem *rmem, dev->dma_io_tlb_mem =3D mem; =20 return 0; + +free_areas: + kfree(mem->areas); +free_slots: + kfree(mem->slots); +free_mem: + kfree(mem); + return rc; }