From 11b7e12b7d8208f8285dc4c1119a36be7469d7a7 Mon Sep 17 00:00:00 2001 From: Nitin Kumbhar Date: Thu, 16 Jan 2020 16:01:43 +0530 Subject: [PATCH] gpu: nvgpu: posix: whitelist built-in atomic ops certc violations Whitelist the following CERT-C INT31-C, DCL37-C and EXP47-C violations from atomic.h reported due to an issue in the Coverity scanner tool (version 2019.06). Violations: 1. cert_int31_c_violation: Casting "__atomic_fetch_sub_4(&v->v, i, 5)" from "unsigned int" to "int" without checking its value may result in lost or misinterpreted data. 2. cert_int31_c_violation: Casting "i" from "int" to "unsigned int" without checking its value may result in lost or misinterpreted data. 3. cert_exp37_c_violation: Calling function "__atomic_fetch_add_4(void volatile *, unsigned int, int)" with the argument "i", which has an incompatible type "int" instead of "unsigned int". 4. cert_dcl37_c_violation: The reserved identifier "__atomic_load_ptr", which is reserved for use as identifiers with file scope in both the ordinary and tag name spaces, is declared. Bug 200584380 JIRA NVGPU-4480 Change-Id: I9eebcca734f7081f9ca759c955e50a777e1ff25a Signed-off-by: Nitin Kumbhar Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2279933 Reviewed-by: Philip Elcan Reviewed-by: Ajesh K V Reviewed-by: Deepak Nibade Reviewed-by: mobile promotions GVS: Gerrit_Virtual_Submit Tested-by: mobile promotions --- .../gpu/nvgpu/include/nvgpu/posix/atomic.h | 58 ++++++++++++++++++- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/nvgpu/include/nvgpu/posix/atomic.h b/drivers/gpu/nvgpu/include/nvgpu/posix/atomic.h index 7935a5dde..c659de03f 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/posix/atomic.h +++ b/drivers/gpu/nvgpu/include/nvgpu/posix/atomic.h @@ -27,6 +27,7 @@ #include #include #include +#include /* * Note: this code uses the GCC builtins to implement atomics. @@ -66,14 +67,28 @@ typedef struct __nvgpu_posix_atomic64 { * @param v Atomic variable to be set. * @param i Value to set in atomic variable. */ -#define NVGPU_POSIX_ATOMIC_SET(v, i) atomic_store(&((v)->v), (i)) +#define NVGPU_POSIX_ATOMIC_SET(v, i) \ + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(DCL37_C), "Bug 200584380") \ + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(EXP37_C), "Bug 200584380") \ + atomic_store(&((v)->v), (i)) \ + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(DCL37_C)) \ + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(EXP37_C)) /** * @brief Define for atomic read. * * @param v Atomic variable to be read. */ -#define NVGPU_POSIX_ATOMIC_READ(v) atomic_load(&((v)->v)) +#define NVGPU_POSIX_ATOMIC_READ(v) \ + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(DCL37_C), "Bug 200584380") \ + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(EXP37_C), "Bug 200584380") \ + atomic_load(&((v)->v)) \ + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(DCL37_C)) \ + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(EXP37_C)) /** * @brief Define for atomic add and return. @@ -87,7 +102,16 @@ typedef struct __nvgpu_posix_atomic64 { ({ \ typeof((v)->v) tmp; \ \ + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(INT31_C), "Bug 200584380") \ + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(DCL37_C), "Bug 200584380") \ + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(EXP37_C), "Bug 200584380") \ tmp = (typeof((v)->v))atomic_fetch_add(&((v)->v), (i)); \ + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(INT31_C)) \ + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(DCL37_C)) \ + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(EXP37_C)) \ tmp = __builtin_choose_expr( \ IS_SIGNED_LONG_TYPE(i), \ (nvgpu_safe_add_s64((tmp), (i))), \ @@ -107,7 +131,16 @@ typedef struct __nvgpu_posix_atomic64 { ({ \ typeof((v)->v) tmp; \ \ + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(INT31_C), "Bug 200584380") \ + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(DCL37_C), "Bug 200584380") \ + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(EXP37_C), "Bug 200584380") \ tmp = (typeof((v)->v))atomic_fetch_sub(&((v)->v), (i)); \ + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(INT31_C)) \ + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(DCL37_C)) \ + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(EXP37_C)) \ tmp = __builtin_choose_expr( \ IS_SIGNED_LONG_TYPE(i), \ (nvgpu_safe_sub_s64((tmp), (i))), \ @@ -130,7 +163,13 @@ typedef struct __nvgpu_posix_atomic64 { ({ \ typeof((v)->v) tmp = (old); \ \ + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(DCL37_C), "Bug 200584380") \ + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(EXP37_C), "Bug 200584380") \ atomic_compare_exchange_strong(&((v)->v), &tmp, (new)); \ + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(DCL37_C)) \ + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(EXP37_C)) \ tmp; \ }) @@ -142,7 +181,14 @@ typedef struct __nvgpu_posix_atomic64 { * * @return Original value in the atomic variable. */ -#define NVGPU_POSIX_ATOMIC_XCHG(v, new) atomic_exchange(&((v)->v), (new)) +#define NVGPU_POSIX_ATOMIC_XCHG(v, new) \ + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(DCL37_C), "Bug 200584380") \ + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(EXP37_C), "Bug 200584380") \ + atomic_exchange(&((v)->v), (new)) \ + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(DCL37_C)) \ + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(EXP37_C)) /** * @brief POSIX implementation of atomic set. @@ -379,7 +425,10 @@ static inline int nvgpu_atomic_add_unless_impl(nvgpu_atomic_t *v, int a, int u) if (old == (u)) { break; } + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(DCL37_C), "Bug 200584380") } while (!atomic_compare_exchange_strong(&((v)->v), &old, old + (a))); + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(DCL37_C)) return old; } @@ -460,7 +509,10 @@ static inline long nvgpu_atomic64_add_unless_impl(nvgpu_atomic64_t *v, long a, if (old == (u)) { break; } + NVGPU_COV_WHITELIST_BLOCK_BEGIN(false_positive, 1, \ + NVGPU_CERT(DCL37_C), "Bug 200584380") } while (!atomic_compare_exchange_strong(&((v)->v), &old, old + (a))); + NVGPU_COV_WHITELIST_BLOCK_END(NVGPU_CERT(DCL37_C)) return old; }