From: Chung-Lin Tang Date: Thu, 20 Aug 2020 14:18:51 +0000 (-0700) Subject: libgomp: adjust nvptx_free callback context checking X-Git-Tag: releases/gcc-10.3.0~1018 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8d3c28efbc126ad44c3fd64082882a25c43e1a5e;p=thirdparty%2Fgcc.git libgomp: adjust nvptx_free callback context checking Change test for CUDA callback context in nvptx_free() from using GOMP_PLUGIN_acc_thread () into checking for CUDA_ERROR_NOT_PERMITTED, for the former only works for OpenACC, but not OpenMP offloading. 2020-08-20 Chung-Lin Tang libgomp/ * plugin/plugin-nvptx.c (nvptx_free): Change "GOMP_PLUGIN_acc_thread () == NULL" test into check of CUDA_ERROR_NOT_PERMITTED status for cuMemGetAddressRange. Adjust comments. (cherry picked from commit f9b9832837b65046a8f01c18597cf615ff61db40) --- diff --git a/libgomp/plugin/plugin-nvptx.c b/libgomp/plugin/plugin-nvptx.c index ec103a2f40b7..390804ad1fa2 100644 --- a/libgomp/plugin/plugin-nvptx.c +++ b/libgomp/plugin/plugin-nvptx.c @@ -1040,9 +1040,17 @@ goacc_profiling_acc_ev_free (struct goacc_thread *thr, void *p) static bool nvptx_free (void *p, struct ptx_device *ptx_dev) { - /* Assume callback context if this is null. */ - if (GOMP_PLUGIN_acc_thread () == NULL) + CUdeviceptr pb; + size_t ps; + + CUresult r = CUDA_CALL_NOCHECK (cuMemGetAddressRange, &pb, &ps, + (CUdeviceptr) p); + if (r == CUDA_ERROR_NOT_PERMITTED) { + /* We assume that this error indicates we are in a CUDA callback context, + where all CUDA calls are not allowed (see cuStreamAddCallback + documentation for description). Arrange to free this piece of device + memory later. */ struct ptx_free_block *n = GOMP_PLUGIN_malloc (sizeof (struct ptx_free_block)); n->ptr = p; @@ -1052,11 +1060,11 @@ nvptx_free (void *p, struct ptx_device *ptx_dev) pthread_mutex_unlock (&ptx_dev->free_blocks_lock); return true; } - - CUdeviceptr pb; - size_t ps; - - CUDA_CALL (cuMemGetAddressRange, &pb, &ps, (CUdeviceptr) p); + else if (r != CUDA_SUCCESS) + { + GOMP_PLUGIN_error ("cuMemGetAddressRange error: %s", cuda_error (r)); + return false; + } if ((CUdeviceptr) p != pb) { GOMP_PLUGIN_error ("invalid device address");