From patchwork Fri Apr 29 14:14:23 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Agostini X-Patchwork-Id: 110516 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id E8C8DA04FF; Fri, 29 Apr 2022 16:14:43 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CF948415D7; Fri, 29 Apr 2022 16:14:43 +0200 (CEST) Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2071.outbound.protection.outlook.com [40.107.237.71]) by mails.dpdk.org (Postfix) with ESMTP id AB247410E3 for ; Fri, 29 Apr 2022 16:14:42 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ffUSUUtKYmkB+pZxD+qN8x6DqzunxkwOxlZ9usPXqkxhkq8hs7qQGAfEgbudfbiFTWrOj/YKk+RygZuX/9UvVs4nkk5muKQwmuRO4hmzF+7Ovf4HuGtGXRBJje0ZP5z2slWj9qR+3YnLIwhxINa/hwNaNAaWs6UHfEAVLaBKG3u3D0xJGGjttVxEYhQWbmhZLzalont66RrUmQclzimgkw0qYLR9ImdnO3YjPFtXR7wFAUgRaFJBAhjf37iyflF3MDyQPOCRGmNAxTVZ5+Br8f5gCf9dA4KtwJepjda9xiD9wTOZMpn2mfBHDoMh17spfw0IaUAvP2+QiGbdMJSAIg== 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=ZyTAmVx/qZ5inb4LRhGmGkgLHNV29r6DEA9IFxzuAW4=; b=Fis94/0MwrNIiQWGUYDdpyd2pTBU9l77Uf5PYN11H6wP6DG6LD2T0S/2zUpBiV3DrQTxBUWEVl21D0L9qrdnqMBx3zM4UIY5X9zlQp3JyBZCe2seoF617bJnkFkpMTqnNgy/gdL6MRkeFT0e1CrEN6ij6FsWACmUjWjlUgO1FdjKi7Vy3MSPclRc+GKvZAjUuGiEaytdvFQUhm3CbnV8HCBugA8gpROVpYfxRofHILjIipU2mi3/4GRTgRuYV/mJQ+B5t2UCNFSTnUzQXZwpzg26eAUDHZGZsCW5fgoropw6qHD7r3sJ1MKEQDbo2eQysh8ZDn+HwH7xvxfVFpmHPg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 12.22.5.238) smtp.rcpttodomain=dpdk.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); 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=ZyTAmVx/qZ5inb4LRhGmGkgLHNV29r6DEA9IFxzuAW4=; b=NmOLB+KQg+pYBlUCBccg0Vs2mXt4s6AoORleZuJKGthzcVukLya65cFJ5X5f2IfdJJjnuZaGKx/1uBxlNcVE+xokkMHSui6GHACYd2bZ9NiGm0W7t3MqKrnozPFcbt1UoU+zWHXvLA4+Aglw4R9ygwZpjvBHU4HSXmnwpjH1gMyIpy7y6KsWFqmhCnKI8WkJm4taaiAPvsAxLSUILnS81MgvvWdypxnjWs2bB+7d+ZCNhsN/OVRInJJHZqHY7uxNAX3jBsztBYjp3XuYQSfQOdoKWoXw20ieRjYd6Z3PAjQtPNfvjV96gFlyXy8xWZOFVF7ICjjDr7icPWkZvtz2yg== Received: from MW4PR04CA0127.namprd04.prod.outlook.com (2603:10b6:303:84::12) by CH0PR12MB5283.namprd12.prod.outlook.com (2603:10b6:610:d6::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5206.13; Fri, 29 Apr 2022 14:14:40 +0000 Received: from CO1NAM11FT003.eop-nam11.prod.protection.outlook.com (2603:10b6:303:84:cafe::c8) by MW4PR04CA0127.outlook.office365.com (2603:10b6:303:84::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5206.14 via Frontend Transport; Fri, 29 Apr 2022 14:14:40 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 12.22.5.238) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 12.22.5.238 as permitted sender) receiver=protection.outlook.com; client-ip=12.22.5.238; helo=mail.nvidia.com; Received: from mail.nvidia.com (12.22.5.238) by CO1NAM11FT003.mail.protection.outlook.com (10.13.175.93) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.5206.12 via Frontend Transport; Fri, 29 Apr 2022 14:14:39 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by DRHQMAIL105.nvidia.com (10.27.9.14) with Microsoft SMTP Server (TLS) id 15.0.1497.32; Fri, 29 Apr 2022 14:14:39 +0000 Received: from nvidia.com (10.126.231.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.22; Fri, 29 Apr 2022 07:14:38 -0700 From: To: CC: Elena Agostini Subject: [PATCH] gpu/cuda: GPU_REGISTERED to distinguish GPU memory CPU mapped Date: Fri, 29 Apr 2022 14:14:23 +0000 Message-ID: <20220429141423.1374380-1-eagostini@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220429135251.1373996-1-eagostini@nvidia.com> References: <20220429135251.1373996-1-eagostini@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [10.126.231.35] X-ClientProxiedBy: rnnvmail203.nvidia.com (10.129.68.9) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: df2e8c4b-f8d7-428c-6319-08da29ea9983 X-MS-TrafficTypeDiagnostic: CH0PR12MB5283:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 6wrWcpPCMrp3XXNlF4Ev9h+lk9uEfn62mmW/py2BMmJ29tBqzJOt3PWSJOn0X3pZLSzttx2nU1jmreS/FV12lrmYWc61AeFeZgtfGfgHETjGhBm+MXgm3dqK1E1p8A1Szbj9aGWV3fI+gW12KtRc+mGnwdlqQf/+3eMzOGl1QYd+KGkWopA5hux3y9MxJ7r/Ao8asHfu6pSgQ1IyESCP9VCZ6LLKv0nFc2Q2FvOk+Tyj/iudcBrEYlSVZSh0TmeaoExHrW1WXfEweuanS2Xx4aHaUgqRPEMkfzRhmQrNZd22t46BGBXmF9kK4jFGGTtTU7YLYMyNVIJbhuqNjs14PMR+tPgHe8eoQ1QkoQ2xlRcjYAL7WRtj/U8IkwdHdDqWUZ2YtPSRxskkicNsw11vatY85uqThFCa5g+m13xUF3ql+ZzHpDRH2yekjBnTCzJyk2Ar4EEQ8wCPsOH08G9+EKg8YsU2IWXQlWQ+EPXSbbErDpM3SmRdt+b+00bFwh5WswR2BT1p+TklY1xv5tocqBTiVlx8f+WCBF1z6W2xpxbL5qVFpaeRmNNi0JoBvEghcM/QNu5hYnBwzL9LZeZttI99Bs+/Gl9nDRQIed86m3fEFJghlflDNv75Dkhx9neM5bZymt5QHvrsQWbmfgPDKhZ1tfegxndqmLXb2ioolAMs2iBYr6RFtuPXV9IgrIXiYluDQDttszdhZxSGnFJVGQ== X-Forefront-Antispam-Report: CIP:12.22.5.238; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:InfoNoRecords; CAT:NONE; SFS:(13230001)(4636009)(40470700004)(46966006)(36840700001)(2876002)(186003)(16526019)(36756003)(5660300002)(2906002)(70206006)(36860700001)(55016003)(7696005)(316002)(83380400001)(8676002)(4326008)(6916009)(70586007)(8936002)(107886003)(2616005)(40460700003)(336012)(426003)(86362001)(47076005)(508600001)(82310400005)(81166007)(356005)(6666004)(26005)(1076003)(6286002)(36900700001); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Apr 2022 14:14:39.9863 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: df2e8c4b-f8d7-428c-6319-08da29ea9983 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[12.22.5.238]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT003.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB5283 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Elena Agostini Enable GPU_REGISTERED flag in gpu/cuda driver in the memory list. If a GPU memory address CPU mapped is freed before being unmapped, CUDA driver unmaps it before freeing the memory. Signed-off-by: Elena Agostini --- drivers/gpu/cuda/cuda.c | 77 ++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 31 deletions(-) diff --git a/drivers/gpu/cuda/cuda.c b/drivers/gpu/cuda/cuda.c index 5b8476ac20..664605d9fb 100644 --- a/drivers/gpu/cuda/cuda.c +++ b/drivers/gpu/cuda/cuda.c @@ -257,7 +257,7 @@ struct cuda_info { enum mem_type { GPU_MEM = 0, CPU_REGISTERED, - GPU_REGISTERED /* Not used yet */ + GPU_REGISTERED }; /* key associated to a memory address */ @@ -953,13 +953,14 @@ cuda_mem_cpu_map(struct rte_gpu *dev, __rte_unused size_t size, void *ptr_in, vo return -rte_errno; } + mem_item->mtype = GPU_REGISTERED; *ptr_out = mem_item->ptr_h; return 0; } static int -cuda_mem_free(struct rte_gpu *dev, void *ptr) +cuda_mem_unregister(struct rte_gpu *dev, void *ptr) { CUresult res; struct mem_entry *mem_item; @@ -978,11 +979,11 @@ cuda_mem_free(struct rte_gpu *dev, void *ptr) return -rte_errno; } - if (mem_item->mtype == GPU_MEM) { - res = pfn_cuMemFree(mem_item->ptr_orig_d); + if (mem_item->mtype == CPU_REGISTERED) { + res = pfn_cuMemHostUnregister(ptr); if (res != 0) { pfn_cuGetErrorString(res, &(err_string)); - rte_cuda_log(ERR, "cuMemFree current failed with %s", + rte_cuda_log(ERR, "cuMemHostUnregister current failed with %s", err_string); rte_errno = EPERM; return -rte_errno; @@ -993,74 +994,88 @@ cuda_mem_free(struct rte_gpu *dev, void *ptr) rte_cuda_log(ERR, "Memory type %d not supported", mem_item->mtype); - return -EPERM; + rte_errno = EPERM; + return -rte_errno; } static int -cuda_mem_unregister(struct rte_gpu *dev, void *ptr) +cuda_mem_cpu_unmap(struct rte_gpu *dev, void *ptr_in) { - CUresult res; struct mem_entry *mem_item; - const char *err_string; cuda_ptr_key hk; if (dev == NULL) return -ENODEV; - hk = get_hash_from_ptr((void *)ptr); + hk = get_hash_from_ptr((void *)ptr_in); mem_item = mem_list_find_item(hk); if (mem_item == NULL) { - rte_cuda_log(ERR, "Memory address 0x%p not found in driver memory", ptr); + rte_cuda_log(ERR, "Memory address 0x%p not found in driver memory.", ptr_in); rte_errno = EPERM; return -rte_errno; } - if (mem_item->mtype == CPU_REGISTERED) { - res = pfn_cuMemHostUnregister(ptr); - if (res != 0) { - pfn_cuGetErrorString(res, &(err_string)); - rte_cuda_log(ERR, "cuMemHostUnregister current failed with %s", - err_string); + if (mem_item->mtype == GPU_REGISTERED) { + if (gdrcopy_unpin(gdrc_h, mem_item->mh, (void *)mem_item->ptr_d, + mem_item->size)) { + rte_cuda_log(ERR, "Error unexposing GPU memory address 0x%p.", ptr_in); rte_errno = EPERM; return -rte_errno; } - return mem_list_del_item(hk); + mem_item->mtype = GPU_MEM; + } else { + rte_errno = EPERM; + return -rte_errno; } - rte_cuda_log(ERR, "Memory type %d not supported", mem_item->mtype); - - rte_errno = EPERM; - return -rte_errno; + return 0; } static int -cuda_mem_cpu_unmap(struct rte_gpu *dev, void *ptr_in) +cuda_mem_free(struct rte_gpu *dev, void *ptr) { + CUresult res; struct mem_entry *mem_item; + const char *err_string; cuda_ptr_key hk; if (dev == NULL) return -ENODEV; - hk = get_hash_from_ptr((void *)ptr_in); + hk = get_hash_from_ptr((void *)ptr); mem_item = mem_list_find_item(hk); if (mem_item == NULL) { - rte_cuda_log(ERR, "Memory address 0x%p not found in driver memory.", ptr_in); + rte_cuda_log(ERR, "Memory address 0x%p not found in driver memory", ptr); rte_errno = EPERM; return -rte_errno; } - if (gdrcopy_unpin(gdrc_h, mem_item->mh, (void *)mem_item->ptr_d, - mem_item->size)) { - rte_cuda_log(ERR, "Error unexposing GPU memory address 0x%p.", ptr_in); - rte_errno = EPERM; - return -rte_errno; + /* + * If a GPU memory area that's CPU mapped is being freed + * without calling cpu_unmap, force the unmapping. + */ + if (mem_item->mtype == GPU_REGISTERED) + cuda_mem_cpu_unmap(dev, ptr); + + if (mem_item->mtype == GPU_MEM) { + res = pfn_cuMemFree(mem_item->ptr_orig_d); + if (res != 0) { + pfn_cuGetErrorString(res, &(err_string)); + rte_cuda_log(ERR, "cuMemFree current failed with %s", + err_string); + rte_errno = EPERM; + return -rte_errno; + } + + return mem_list_del_item(hk); } - return 0; + rte_cuda_log(ERR, "Memory type %d not supported", mem_item->mtype); + + return -EPERM; } static int