From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932431AbdCFT0I (ORCPT ); Mon, 6 Mar 2017 14:26:08 -0500 Received: from mail-sn1nam02on0068.outbound.protection.outlook.com ([104.47.36.68]:19615 "EHLO NAM02-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752782AbdCFTZd (ORCPT ); Mon, 6 Mar 2017 14:25:33 -0500 Authentication-Results: google.com; dkim=none (message not signed) header.d=none;google.com; dmarc=none action=none header.from=amd.com; Subject: Re: [RFC PATCH v4 18/28] x86: DMA support for memory encryption To: Borislav Petkov References: <20170216154158.19244.66630.stgit@tlendack-t1.amdoffice.net> <20170216154604.19244.69522.stgit@tlendack-t1.amdoffice.net> <20170225171024.xzlfox56rbbflxfo@pd.tnic> CC: , , , , , , , , , Rik van Riel , =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= , Toshimitsu Kani , Arnd Bergmann , Jonathan Corbet , Matt Fleming , "Michael S. Tsirkin" , Joerg Roedel , Konrad Rzeszutek Wilk , Paolo Bonzini , Brijesh Singh , Ingo Molnar , Alexander Potapenko , Andy Lutomirski , "H. Peter Anvin" , Andrey Ryabinin , Thomas Gleixner , Larry Woodman , Dmitry Vyukov From: Tom Lendacky Message-ID: <65461175-6b79-fd79-8c4b-3e7f28e707ae@amd.com> Date: Mon, 6 Mar 2017 11:47:15 -0600 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: <20170225171024.xzlfox56rbbflxfo@pd.tnic> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: CY4PR12CA0033.namprd12.prod.outlook.com (10.175.82.147) To MWHPR12MB1152.namprd12.prod.outlook.com (10.169.204.16) X-MS-Office365-Filtering-Correlation-Id: eb9e8016-9621-4ef7-e771-08d464b8d70a X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081);SRVR:MWHPR12MB1152; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1152;3:f0nPQmyfk20Cvs6eTwOFnF1zjnU1JV3ofjDVcd4sjfNYZmv7KjykRElP4KIHMQQVpURMs8eXmeY0KYDIuVNGjw+GuNOJF+e4YDS+V0V2CdFZl5bp9tZlea93KhNaHUjPF8AlgcXu9DxWACVYBeGfXGcpTQkRTrcisNxmGZg/w7AVFvvS76HJkdjSAkDd11tnhQi+tnOIi7dLJVGiQUMh6spodFsfekwW6NirA5Tc2LGAUnEvEZvS79kU8mHN5y4p1+sRkD1keljFzDD/I8pjc+//DZ8laKMsIBp3SYFjFS0=;25:g7QDkK+cV3ym19Xm1Thn7rd4dZ8SMzowr8AxzGrmHsgPhCNk7ZkraKTkYK6vxmKzKoO2oEYwxEIf2Le9kWFoiBTQMhWnxW4Fp9pZctoc6dmls+WL99HvpnSYwKSOBlmdbuX5a3/bUql34wfsG+xADvSNx/uxfrZnCuieDApiLfUSvPxRrfE0qZgUvq2o2NAvc23coYcSUEI/Swcd88rmqXt1v75trruSe/jSF0+hwurIBm+4OCWB998W84qNwJD4keyp9IHRasKm+FBRAOK2DqSewkv3Q85H0F5bjh0JMzxd2eV1Z/7Z9nmz7UDuyqv51J4HQw6JLW4tM8zuUu6GZYiehQMF4jkGzlhDFpDJ+PNP1llGHgikfYN82lCuR3PapkMaJUFuQGAilyLJzIcOk0o+CTHyz743/3Cr7U+hQL2uf+e2lHGZV2Y1YfarXQPySAYTP0gdi6Z+m3n40mULpA== X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1152;31:mG0g6VIu2o6R98RjN6/xa0HP+Ak7Vsk54q/5rnoEGKGoYBX3rBclI+IHOjVmHt28qUIHPKOOgQ5kTXE0K6g0PzBbfsITBd5kMKoYs4l/FB4ehHLVv5c5NwYeuBVKZo7w0v3G/TAWKYKJzw48GJspwKbt461VnwxjPXT8J2oTT2B3KLCbmdd6w9v2QELFAYMAO1KLuLobro09JSu0Xd9q/P36Mr1L+cXD252N4qxJwnPo7IiEiYYNACm3lDVHqLlC;20:Yv1qr0jjAwtopcy1liYFg78B11r4H2Pk19cWU916Hg0nrhvpAfZywxZbaoxQJolnZmCuoyGC+dArGcsMFAEYSWDrPSsbyKDu+u9qewxKrZb2ZLe02l+sMSzc9k7NmSs879MLq62gh7kCTHlefyCtU2Re+tK0RFtuckINUbo+2F7D5lsbKS3iJVBJKQd0o+7yaa2MSlsgBEZ5AJEw4K4BocxelKBMS4ftDaMllpUN25E5Zj4PH8LmpbYLk1CnrVuZI8c06pssQZPBJ+gp0Dc3BS1zM40ivtOsGsk0pDhqHgyqrZoasFf7H7dJvlpIv/xbqWBn+9d5Zz+8OeSdjKsubAjMo9Na5h26ct7v/vRC7efvenQRGdHujagkTGmVGpHTHcNamcFpKCiaF93r3NZtClChO5V95DdXkQnMG8+oKI6w1sjkriKrxHTKBSplPWPdprQA9++deuBYRZyvFLboQWQrOIqzdNSkihCfAE19Pd9aaZUNKuY9gPAO4IK8102z X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6055026)(6041248)(20161123560025)(20161123558025)(20161123555025)(20161123562025)(20161123564025)(6072148);SRVR:MWHPR12MB1152;BCL:0;PCL:0;RULEID:;SRVR:MWHPR12MB1152; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1152;4:/vfxd3kzJQq5oEulITk0WUACIrkEwmCCPCjtXUSN2NZt+q/vlbqBYqVyLzZML1AjD+r1Nj8ideKlWpnCvfYplzjy2zYMXV6PDM86LSh9mvAJnI6ojDimeVVQ1cgKawhKxXikjIZxPPGpuBR6owvecbNYfrXRMaxKM3u90Rubh2uQ0h7oCteb6CFvrQfm3aiOak0uEZ+oIeOUjMq+mklwoQ4GOtlYNhAIN11RydwtzAYBSBzZd7qvdDWp9wvWqcSMsI0UIuPkN51SpCYkNqP0VDN780cxvu4ntmvpcfQRmSCgKkzYgCwGB55wFUEDPpaatVdSR/Vy/V/iEVgAydBq6qKUaTITjHC0IGApQ1ycBIC8EUjNo3quzTPHgn5FhbT2ynZOlj3U6LL9Q3Su3qtuqfMUSH1sF+MAeSQ2nQtZH58OcUu42Ptyc3sS42O0Zda0ztr60yDKssRh7MzYOC936+ZNaVReBTHSyKGoL0t+MXqKVsBU7t8QbxA9pbeSBRp8SxhuZgPQfbQUff4G7xnb0atpB+djhNXtlrYWi14IUBvzqEs33j8nvHpJX62rFrd+/YmnB6B+XP95HXYx0teBgYvqqJQ0OJL5OI0X27M1cGqH4TpbTwOlnhVzpphI4HOKwtZDL8njWHJo72nl9vD8KwDd1GKakBZTZQ0LcxW8Lx0= X-Forefront-PRVS: 0238AEEDB0 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6049001)(6009001)(7916002)(39840400002)(39410400002)(39850400002)(39860400002)(39450400003)(377454003)(24454002)(4326008)(230700001)(5660300001)(23676002)(77096006)(33646002)(90366009)(6486002)(53546006)(83506001)(50466002)(86362001)(65826007)(64126003)(53936002)(92566002)(81166006)(8676002)(189998001)(4001350100001)(6246003)(50986999)(31686004)(25786008)(54906002)(42186005)(31696002)(36756003)(54356999)(110136004)(76176999)(3846002)(65956001)(65806001)(6116002)(2950100002)(6916009)(6666003)(2906002)(305945005)(7736002)(47776003)(66066001)(7416002)(38730400002)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR12MB1152;H:[10.236.64.195];FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtNV0hQUjEyTUIxMTUyOzIzOktlVVpLN29TcDN3QWFVSW9jcmgwL3EzOGVS?= =?utf-8?B?QWVMbzErbmptOEVsSk9lemZYZnFCejQ5U216Y05Cei9XWDc0Mkt3Mk9XckRK?= =?utf-8?B?MjdncjJhMDN3L3oyei90eThHcXBIRGxLcURWOXI3ZXNqY3lFc01nb1IzVmsz?= =?utf-8?B?YXRNeDA1ZStDaGtuRGtyNDJhampYSTRTTWh0NjZtTTQ3Ly91MVJzcEI0V0RH?= =?utf-8?B?WTFBRGVscHlMa1pCeWh2ZXNJV0xNZ002NTBXTVFYaG53cm1CcVUvMW9LQkNR?= =?utf-8?B?T2g3VmwrYUx5SHFOdzdxT2s3clMvazlENm14WjBnMml6Y1d0SkVkMVRqUHll?= =?utf-8?B?OGVDVkc5WWorZWxOQUtjbXlpbmhpblBZU1phenhXNTJsZmVlbjVqOVIydkoy?= =?utf-8?B?SVVBMzJTdXprZ2ZOTW9rREZkYk1SOXJmRERLMk03WkROTjNFWWtxM0V5ZTNC?= =?utf-8?B?ZWd0OTR3emJFOXNWaVZ4VHoyV0g0TlBmQkRlTVdFMit0cDQrNS9PbXlWa1c2?= =?utf-8?B?TkJGRXc5Tkk1WVhHTW96VktpTFRYMXArK1J4aTJrTjBoV1ZkYVVDOWR5YzU2?= =?utf-8?B?a0dLazJPWFl2c0VtUjllVkVMOTR4Nkc4NEMvVkZHKy93ekdaV0ZWZVR1ZEF5?= =?utf-8?B?WEJCZ0ZqUlRwaEQwTjV2Q0VIbXJqajZlSGpObjZGOHZ3RnF0WlgvTVZwYjJD?= =?utf-8?B?Qlg0bmxieW56Mkw1VTFkRlJGZmNiVGduRGpkanZmdFd6VndyT1hsMDdWYXNv?= =?utf-8?B?Vk12Njl1aWkwTkE1Tno5VFBDdVlGWW9abi91L25nOHVuZkhscVdBcFFIQjNT?= =?utf-8?B?TTQvNy9aZkMxNjVnR1dhQnk1R2szSmFGcFpzY0JKM0Q1aGRCVWUxNExUenJP?= =?utf-8?B?V0JkNEdERWxPZ0ZIbFNQR1J6R0lleW5QTitnaXlxak1nS3duUVpLRjVxdjhH?= =?utf-8?B?MDg5SGdpZElabUZ2bTN4Z1dlRmpYYWtXdkR3N09Hc1NLS2hzSzlSOFYwS2tz?= =?utf-8?B?VlJMNFlXQ056c2pwbkpPWU1rS3I4TGdRVkhzUUc4ZEVEdVI2Q0l0d0ZSY21p?= =?utf-8?B?ZEVNbVhZVHVLZEhYaEVidTBQcGMxZ0VGckpNN3FhM3JWUnhGM05RditicXht?= =?utf-8?B?NTNya3pONC9nTGMzTEQrTHBjaitzelRtaUxLMXJpeFhCWm5QRlFyT2IzN05o?= =?utf-8?B?bkFvTjNMTGV4cW9mL1IwWnduOWs1dmtNRnZkU3JoT2U1ZFNZbkRtbWN0N2lk?= =?utf-8?B?eDB3UGUzci9HNkFQRU9JSE9Dd3N5K2NZSVFmcXFQb3MvR3FxWlVOMk1OUWZq?= =?utf-8?B?d0d3bkZVN1ArVHl1Q3BmbHZMcmpubU9OZk8zQjgwc2VIQWhzcE1acGIzeCtV?= =?utf-8?B?Vzc2K3lWWTZwWkNQRW5yZ1MrMlFLY2dRZzNoZjM0RXlJRHEweDVGUTlEaTJq?= =?utf-8?B?SXpEenVwV3dNdVhiTEYvRVhiMkRJWVN0dzNPaERrWWJSU3hvbzlPTTBPYVlX?= =?utf-8?B?dmJUU1VMQk5BUEdTdmdYMi9uYWF3MHpDS3JqS2lWVnl4Wko2d1cvR1F6OW02?= =?utf-8?B?RXBOMTlCeEk5R0dPYVFZVEpMYVJoUFF3MFVPMW1uMlNFandJVTc0WVNSUmJQ?= =?utf-8?B?OWV5Z244a2JJTmRiSTdZZUR3TDFtQkpwc3NSVVZyT3lLS2hFbDBrUTBJVW9Q?= =?utf-8?B?eWFoS2VNT2llSkMxa0Vwbm9URlhoRWg1ekNIcTh5NGhZdkdYZWJjbHlDeFl4?= =?utf-8?B?U1ZoVFh1WHNyQ3VUYW1wSWpVc3VlcmxWOElnd1l6L1FvMEVrMVljajhtQ3pB?= =?utf-8?B?cVoxdWMwWldLR09lMUZxZmg0a0w0NHFnbUMzZDRuMDB6c004U3Z0dlNQaGpH?= =?utf-8?Q?9qb0DLROk7Y=3D?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1152;6:RYje5v21hBFpBlwp1gBeYwM3vEjUI1vwFpF6N8zUAN4VGLK7bsOJW7w3vGaDv2oxvcuzxKH+2JGxXIM/Dw0BaTWr/H8jeCE0pBXamfhmAoMCsF5+dGWI44GsgWc+YhAtHKDfGSoTk7KlXWH9P9AcWFbm1hMUEdhNZumVOvw+cYCQvBXh6mzB6AYXjXD0CuqzRXo678m+Zm6VDx87vWYGCyvj94eeeg34hZWFNBuyn9ExDQaofvbC8fPDsgsv09TktQP5dot3kJW2pGEFi4xagsvsN7GldlpqkLBz6neaT+VE9xfO3mmnHlPGmsXl0Cx6AckmPvXo6vhhW0XxlK2NB1id5WIjLujkfEU2Ie1FOY1XSc6gpYb7Rk3d0yuvu5M/u6gDEqzbj2qpQqcCB5rBAEtIVDe0smtg4iQVNNwoOoo=;5:id4hymWErnWE7cfTMTiMeoMpUh8PNR+ZaA1FB3UDrzk5qtMWJr3ARh1bRrfdd03OS/VDmrICvXqEBQUhGf8t3UqYT7RBzJnt43ko2ANAH1Aw9IaEy5o1l0vMlJ/bXWa4p/k4Nme6gyPFM2TeFX7DvA==;24:7V+M0ul7WFlCTrqbuDAevphNdTSyVsdpeJOtHLbhwre3hSxKLjwdHEOwqjO1qy0n5l+z0Y7KbmHxjUBr2ej0nDOeTCY0WjhuFyOI77ynWAA= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1152;7:AN4F3sCLhr7zx79C1QcLTRNsya9ZhaxKodYFApH+3Wu6a4Ur45pCHTUHY4IzSH4OXdsvxv2lXnK3l+OCNUtbbdhjwx5D0ZCr6YDnbMs376mYfHVYGjzQd3sHUmVzqPKkwb/z0wa8r3pT8uxWMbTvfBQN/uEEX25dFppDnuk6j0UrmiUT5YOta7DOPhO90caOQhxWlUROJhjUe1zZhylS5oNWMIPqAxAd/AKdPeKbq/WFN87C3D5b2B3Qfb/bpFQQJWWzS2v6x0/ozBw+MNXyHN6SBBu0uropLls7Yl5oqL6ange/I/GDjKqlLJXVKyd4AAAdjBd815lta/VZXIBj3g==;20:iKqLs2xY0S9E43o1Kjk5h/lyypt3+4wVr76wnVCucPFaC+CdmcdGJt3f4C0si+KauByno/hjhFFZzdA7qAZqUh7lG8ApQGbrA8CWIU6EfmqVJ9OYMPUNBwX3W5PhQbJtzDPKqmW5I511uqh1Gvl0c9cgZXzzKAzrC612uZqHYEfKlhVpr1orV3lG1+H5DHspRomF6KociNMfp+kbufLnlTWpxvLSBgCO/LXnf97SX9Jwj2NSfYC+KFGUrs3JbR/o X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2017 17:47:18.8440 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR12MB1152 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2/25/2017 11:10 AM, Borislav Petkov wrote: > On Thu, Feb 16, 2017 at 09:46:04AM -0600, Tom Lendacky wrote: >> Since DMA addresses will effectively look like 48-bit addresses when the >> memory encryption mask is set, SWIOTLB is needed if the DMA mask of the >> device performing the DMA does not support 48-bits. SWIOTLB will be >> initialized to create decrypted bounce buffers for use by these devices. >> >> Signed-off-by: Tom Lendacky >> --- > > Just nitpicks below... > >> diff --git a/arch/x86/mm/mem_encrypt.c b/arch/x86/mm/mem_encrypt.c >> index ec548e9..a46bcf4 100644 >> --- a/arch/x86/mm/mem_encrypt.c >> +++ b/arch/x86/mm/mem_encrypt.c >> @@ -13,11 +13,14 @@ >> #include >> #include >> #include >> +#include >> +#include >> >> #include >> #include >> #include >> #include >> +#include >> >> extern pmdval_t early_pmd_flags; >> int __init __early_make_pgtable(unsigned long, pmdval_t); >> @@ -192,3 +195,22 @@ void __init sme_early_init(void) >> for (i = 0; i < ARRAY_SIZE(protection_map); i++) >> protection_map[i] = pgprot_encrypted(protection_map[i]); >> } >> + >> +/* Architecture __weak replacement functions */ >> +void __init mem_encrypt_init(void) >> +{ >> + if (!sme_me_mask) > > !sme_active() > > no? I was probably looking ahead to SEV on this one. Basically if the sme_me_mask is non-zero we will want to make SWIOTLB decrypted. > > Unless we're going to be switching SME dynamically at run time? > >> + return; >> + >> + /* Call into SWIOTLB to update the SWIOTLB DMA buffers */ >> + swiotlb_update_mem_attributes(); >> +} >> + >> +void swiotlb_set_mem_attributes(void *vaddr, unsigned long size) >> +{ >> + WARN(PAGE_ALIGN(size) != size, >> + "size is not page aligned (%#lx)\n", size); > > "page-aligned" I guess. Ok. > >> + >> + /* Make the SWIOTLB buffer area decrypted */ >> + set_memory_decrypted((unsigned long)vaddr, size >> PAGE_SHIFT); >> +} >> diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h >> index 4ee479f..15e7160 100644 >> --- a/include/linux/swiotlb.h >> +++ b/include/linux/swiotlb.h >> @@ -35,6 +35,7 @@ enum swiotlb_force { >> extern unsigned long swiotlb_nr_tbl(void); >> unsigned long swiotlb_size_or_default(void); >> extern int swiotlb_late_init_with_tbl(char *tlb, unsigned long nslabs); >> +extern void __init swiotlb_update_mem_attributes(void); >> >> /* >> * Enumeration for sync targets >> diff --git a/init/main.c b/init/main.c >> index 8222caa..ba13f8f 100644 >> --- a/init/main.c >> +++ b/init/main.c >> @@ -466,6 +466,10 @@ void __init __weak thread_stack_cache_init(void) >> } >> #endif >> >> +void __init __weak mem_encrypt_init(void) >> +{ >> +} >> + >> /* >> * Set up kernel memory allocators >> */ >> @@ -614,6 +618,15 @@ asmlinkage __visible void __init start_kernel(void) >> */ >> locking_selftest(); >> >> + /* >> + * This needs to be called before any devices perform DMA >> + * operations that might use the swiotlb bounce buffers. > > SWIOTLB Ok. > >> + * This call will mark the bounce buffers as decrypted so >> + * that their usage will not cause "plain-text" data to be >> + * decrypted when accessed. >> + */ >> + mem_encrypt_init(); >> + >> #ifdef CONFIG_BLK_DEV_INITRD >> if (initrd_start && !initrd_below_start_ok && >> page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) { >> diff --git a/lib/swiotlb.c b/lib/swiotlb.c >> index a8d74a7..c463067 100644 >> --- a/lib/swiotlb.c >> +++ b/lib/swiotlb.c >> @@ -30,6 +30,7 @@ >> #include >> #include >> #include >> +#include >> >> #include >> #include >> @@ -155,6 +156,17 @@ unsigned long swiotlb_size_or_default(void) >> return size ? size : (IO_TLB_DEFAULT_SIZE); >> } >> >> +void __weak swiotlb_set_mem_attributes(void *vaddr, unsigned long size) >> +{ >> +} >> + >> +/* For swiotlb, clear memory encryption mask from dma addresses */ >> +static dma_addr_t swiotlb_phys_to_dma(struct device *hwdev, >> + phys_addr_t address) >> +{ >> + return phys_to_dma(hwdev, address) & ~sme_me_mask; >> +} >> + >> /* Note that this doesn't work with highmem page */ >> static dma_addr_t swiotlb_virt_to_bus(struct device *hwdev, >> volatile void *address) >> @@ -183,6 +195,31 @@ void swiotlb_print_info(void) >> bytes >> 20, vstart, vend - 1); >> } >> >> +/* >> + * Early SWIOTLB allocation may be to early to allow an architecture to > > too Yup. > >> + * perform the desired operations. This function allows the architecture to >> + * call SWIOTLB when the operations are possible. This function needs to be > > s/This function/It/ Ok. Thanks, Tom > >> + * called before the SWIOTLB memory is used. >> + */ >> +void __init swiotlb_update_mem_attributes(void) >> +{ >> + void *vaddr; >> + unsigned long bytes; >> + >> + if (no_iotlb_memory || late_alloc) >> + return; >> + >> + vaddr = phys_to_virt(io_tlb_start); >> + bytes = PAGE_ALIGN(io_tlb_nslabs << IO_TLB_SHIFT); >> + swiotlb_set_mem_attributes(vaddr, bytes); >> + memset(vaddr, 0, bytes); >> + >> + vaddr = phys_to_virt(io_tlb_overflow_buffer); >> + bytes = PAGE_ALIGN(io_tlb_overflow); >> + swiotlb_set_mem_attributes(vaddr, bytes); >> + memset(vaddr, 0, bytes); >> +} >> + >> int __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose) >> { >> void *v_overflow_buffer; >