From d32692ae2427693daf85b3c7b4e24cd36471dec6 Mon Sep 17 00:00:00 2001 From: Scott Long Date: Mon, 2 Jul 2018 17:57:21 -0700 Subject: gpu: nvgpu: fix MISRA Rule 11.6 issue with _THIS_IP_ The use of the _THIS_IP_ macro in nvgpu introduces two separate MISRA Rule 11.6 violations. The first is when when the label address (which gcc generates as a void *) is cast to an unsigned long and the second is when that unsigned long is cast back to a void * in the timer and kmem code that track the value. Skipping the intermediate use of unsigned long eliminates these violations. To do this, references to _THIS_IP_ are replaced with a new (compliant) _NVGPU_GET_IP_ macro. JIRA NVGPU-895 : MISRA Rule 11.6 violations Change-Id: I5ea999d8e2b467257fa190b485fa971adcbd0a2b Signed-off-by: Scott Long Reviewed-on: https://git-master.nvidia.com/r/1774531 Reviewed-by: svc-misra-checker GVS: Gerrit_Virtual_Submit Reviewed-by: Adeel Raza Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/posix/kmem.c | 14 +++++++------- drivers/gpu/nvgpu/include/nvgpu/kmem.h | 19 +++++++------------ drivers/gpu/nvgpu/include/nvgpu/linux/kmem.h | 23 ++++++++++------------- drivers/gpu/nvgpu/include/nvgpu/posix/kmem.h | 10 +++++----- drivers/gpu/nvgpu/include/nvgpu/timers.h | 5 +++-- drivers/gpu/nvgpu/include/nvgpu/utils.h | 6 ++++++ drivers/gpu/nvgpu/os/linux/kmem.c | 24 ++++++++++++------------ 7 files changed, 50 insertions(+), 51 deletions(-) diff --git a/drivers/gpu/nvgpu/common/posix/kmem.c b/drivers/gpu/nvgpu/common/posix/kmem.c index 3c0b9b66..5fe0aeb2 100644 --- a/drivers/gpu/nvgpu/common/posix/kmem.c +++ b/drivers/gpu/nvgpu/common/posix/kmem.c @@ -64,17 +64,17 @@ void nvgpu_kmem_cache_free(struct nvgpu_kmem_cache *cache, void *ptr) free(ptr); } -void *__nvgpu_kmalloc(struct gk20a *g, size_t size, unsigned long ip) +void *__nvgpu_kmalloc(struct gk20a *g, size_t size, void *ip) { return malloc(size); } -void *__nvgpu_kzalloc(struct gk20a *g, size_t size, unsigned long ip) +void *__nvgpu_kzalloc(struct gk20a *g, size_t size, void *ip) { return calloc(1, size); } -void *__nvgpu_kcalloc(struct gk20a *g, size_t n, size_t size, unsigned long ip) +void *__nvgpu_kcalloc(struct gk20a *g, size_t n, size_t size, void *ip) { /* * calloc() implicitly zeros mem. So calloc a single member size bytes @@ -91,12 +91,12 @@ void __nvgpu_kfree(struct gk20a *g, void *addr) /* * The concept of vmalloc() does not exist in userspace. */ -void *__nvgpu_vmalloc(struct gk20a *g, unsigned long size, unsigned long ip) +void *__nvgpu_vmalloc(struct gk20a *g, unsigned long size, void *ip) { return __nvgpu_kmalloc(g, size, ip); } -void *__nvgpu_vzalloc(struct gk20a *g, unsigned long size, unsigned long ip) +void *__nvgpu_vzalloc(struct gk20a *g, unsigned long size, void *ip) { return __nvgpu_kzalloc(g, size, ip); } @@ -113,8 +113,8 @@ void *__nvgpu_big_alloc(struct gk20a *g, size_t size, bool clear) * reuse k[zm]alloc() for this. */ return clear ? - __nvgpu_kzalloc(g, size, _THIS_IP_) : - __nvgpu_kmalloc(g, size, _THIS_IP_); + __nvgpu_kzalloc(g, size, _NVGPU_GET_IP_) : + __nvgpu_kmalloc(g, size, _NVGPU_GET_IP_); } void nvgpu_big_free(struct gk20a *g, void *p) diff --git a/drivers/gpu/nvgpu/include/nvgpu/kmem.h b/drivers/gpu/nvgpu/include/nvgpu/kmem.h index 91574ce0..852f6f8a 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/kmem.h +++ b/drivers/gpu/nvgpu/include/nvgpu/kmem.h @@ -24,13 +24,7 @@ #define __NVGPU_KMEM_H__ #include - -/* - * Incase this isn't defined already. - */ -#ifndef _THIS_IP_ -#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; }) -#endif +#include struct gk20a; @@ -125,7 +119,7 @@ void nvgpu_kmem_cache_free(struct nvgpu_kmem_cache *cache, void *ptr); * * This function may sleep so cannot be used in IRQs. */ -#define nvgpu_kmalloc(g, size) __nvgpu_kmalloc(g, size, _THIS_IP_) +#define nvgpu_kmalloc(g, size) __nvgpu_kmalloc(g, size, _NVGPU_GET_IP_) /** * nvgpu_kzalloc - Allocate from the kernel's allocator. @@ -136,7 +130,7 @@ void nvgpu_kmem_cache_free(struct nvgpu_kmem_cache *cache, void *ptr); * Identical to nvgpu_kalloc() except the memory will be zeroed before being * returned. */ -#define nvgpu_kzalloc(g, size) __nvgpu_kzalloc(g, size, _THIS_IP_) +#define nvgpu_kzalloc(g, size) __nvgpu_kzalloc(g, size, _NVGPU_GET_IP_) /** * nvgpu_kcalloc - Allocate from the kernel's allocator. @@ -148,7 +142,8 @@ void nvgpu_kmem_cache_free(struct nvgpu_kmem_cache *cache, void *ptr); * Identical to nvgpu_kalloc() except the size of the memory chunk returned is * @n * @size. */ -#define nvgpu_kcalloc(g, n, size) __nvgpu_kcalloc(g, n, size, _THIS_IP_) +#define nvgpu_kcalloc(g, n, size) \ + __nvgpu_kcalloc(g, n, size, _NVGPU_GET_IP_) /** * nvgpu_vmalloc - Allocate memory and return a map to it. @@ -164,7 +159,7 @@ void nvgpu_kmem_cache_free(struct nvgpu_kmem_cache *cache, void *ptr); * * This function may sleep. */ -#define nvgpu_vmalloc(g, size) __nvgpu_vmalloc(g, size, _THIS_IP_) +#define nvgpu_vmalloc(g, size) __nvgpu_vmalloc(g, size, _NVGPU_GET_IP_) /** * nvgpu_vzalloc - Allocate memory and return a map to it. @@ -174,7 +169,7 @@ void nvgpu_kmem_cache_free(struct nvgpu_kmem_cache *cache, void *ptr); * * Identical to nvgpu_vmalloc() except this will return zero'ed memory. */ -#define nvgpu_vzalloc(g, size) __nvgpu_vzalloc(g, size, _THIS_IP_) +#define nvgpu_vzalloc(g, size) __nvgpu_vzalloc(g, size, _NVGPU_GET_IP_) /** * nvgpu_kfree - Frees an alloc from nvgpu_kmalloc, nvgpu_kzalloc, diff --git a/drivers/gpu/nvgpu/include/nvgpu/linux/kmem.h b/drivers/gpu/nvgpu/include/nvgpu/linux/kmem.h index 611854f2..660aac9f 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/linux/kmem.h +++ b/drivers/gpu/nvgpu/include/nvgpu/linux/kmem.h @@ -21,14 +21,11 @@ struct gk20a; struct device; #ifdef CONFIG_NVGPU_TRACK_MEM_USAGE -void *__nvgpu_track_vmalloc(struct gk20a *g, unsigned long size, - unsigned long ip); -void *__nvgpu_track_vzalloc(struct gk20a *g, unsigned long size, - unsigned long ip); -void *__nvgpu_track_kmalloc(struct gk20a *g, size_t size, unsigned long ip); -void *__nvgpu_track_kzalloc(struct gk20a *g, size_t size, unsigned long ip); -void *__nvgpu_track_kcalloc(struct gk20a *g, size_t n, size_t size, - unsigned long ip); +void *__nvgpu_track_vmalloc(struct gk20a *g, unsigned long size, void *ip); +void *__nvgpu_track_vzalloc(struct gk20a *g, unsigned long size, void *ip); +void *__nvgpu_track_kmalloc(struct gk20a *g, size_t size, void *ip); +void *__nvgpu_track_kzalloc(struct gk20a *g, size_t size, void *ip); +void *__nvgpu_track_kcalloc(struct gk20a *g, size_t n, size_t size, void *ip); void __nvgpu_track_vfree(struct gk20a *g, void *addr); void __nvgpu_track_kfree(struct gk20a *g, void *addr); #endif @@ -39,11 +36,11 @@ void __nvgpu_track_kfree(struct gk20a *g, void *addr); * These are the Linux implementations of the various kmem functions defined by * nvgpu. This should not be included directly - instead include . */ -void *__nvgpu_kmalloc(struct gk20a *g, size_t size, unsigned long ip); -void *__nvgpu_kzalloc(struct gk20a *g, size_t size, unsigned long ip); -void *__nvgpu_kcalloc(struct gk20a *g, size_t n, size_t size, unsigned long ip); -void *__nvgpu_vmalloc(struct gk20a *g, unsigned long size, unsigned long ip); -void *__nvgpu_vzalloc(struct gk20a *g, unsigned long size, unsigned long ip); +void *__nvgpu_kmalloc(struct gk20a *g, size_t size, void *ip); +void *__nvgpu_kzalloc(struct gk20a *g, size_t size, void *ip); +void *__nvgpu_kcalloc(struct gk20a *g, size_t n, size_t size, void *ip); +void *__nvgpu_vmalloc(struct gk20a *g, unsigned long size, void *ip); +void *__nvgpu_vzalloc(struct gk20a *g, unsigned long size, void *ip); void __nvgpu_kfree(struct gk20a *g, void *addr); void __nvgpu_vfree(struct gk20a *g, void *addr); diff --git a/drivers/gpu/nvgpu/include/nvgpu/posix/kmem.h b/drivers/gpu/nvgpu/include/nvgpu/posix/kmem.h index 483ac3b3..efcdd3d5 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/posix/kmem.h +++ b/drivers/gpu/nvgpu/include/nvgpu/posix/kmem.h @@ -25,11 +25,11 @@ #include -void *__nvgpu_kmalloc(struct gk20a *g, size_t size, unsigned long ip); -void *__nvgpu_kzalloc(struct gk20a *g, size_t size, unsigned long ip); -void *__nvgpu_kcalloc(struct gk20a *g, size_t n, size_t size, unsigned long ip); -void *__nvgpu_vmalloc(struct gk20a *g, unsigned long size, unsigned long ip); -void *__nvgpu_vzalloc(struct gk20a *g, unsigned long size, unsigned long ip); +void *__nvgpu_kmalloc(struct gk20a *g, size_t size, void *ip); +void *__nvgpu_kzalloc(struct gk20a *g, size_t size, void *ip); +void *__nvgpu_kcalloc(struct gk20a *g, size_t n, size_t size, void *ip); +void *__nvgpu_vmalloc(struct gk20a *g, unsigned long size, void *ip); +void *__nvgpu_vzalloc(struct gk20a *g, unsigned long size, void *ip); void __nvgpu_kfree(struct gk20a *g, void *addr); void __nvgpu_vfree(struct gk20a *g, void *addr); diff --git a/drivers/gpu/nvgpu/include/nvgpu/timers.h b/drivers/gpu/nvgpu/include/nvgpu/timers.h index 83dd8d78..20becfdd 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/timers.h +++ b/drivers/gpu/nvgpu/include/nvgpu/timers.h @@ -24,6 +24,7 @@ #define __NVGPU_TIMERS_H__ #include +#include struct gk20a; @@ -85,10 +86,10 @@ int nvgpu_timeout_init(struct gk20a *g, struct nvgpu_timeout *timeout, int nvgpu_timeout_peek_expired(struct nvgpu_timeout *timeout); #define nvgpu_timeout_expired(__timeout) \ - __nvgpu_timeout_expired_msg(__timeout, (void *)_THIS_IP_, "") + __nvgpu_timeout_expired_msg(__timeout, _NVGPU_GET_IP_, "") #define nvgpu_timeout_expired_msg(__timeout, fmt, args...) \ - __nvgpu_timeout_expired_msg(__timeout, (void *)_THIS_IP_, \ + __nvgpu_timeout_expired_msg(__timeout, _NVGPU_GET_IP_, \ fmt, ##args) /* diff --git a/drivers/gpu/nvgpu/include/nvgpu/utils.h b/drivers/gpu/nvgpu/include/nvgpu/utils.h index 22102fa3..6184608a 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/utils.h +++ b/drivers/gpu/nvgpu/include/nvgpu/utils.h @@ -49,4 +49,10 @@ static inline u32 get_field(u32 reg, u32 mask) { return (reg & mask); } + +/* + * MISRA Rule 11.6 compliant IP address generator. + */ +#define _NVGPU_GET_IP_ ({ __label__ __here; __here: &&__here; }) + #endif /* NVGPU_UTILS_H */ diff --git a/drivers/gpu/nvgpu/os/linux/kmem.c b/drivers/gpu/nvgpu/os/linux/kmem.c index 10946a08..86572bcc 100644 --- a/drivers/gpu/nvgpu/os/linux/kmem.c +++ b/drivers/gpu/nvgpu/os/linux/kmem.c @@ -69,7 +69,7 @@ void nvgpu_big_free(struct gk20a *g, void *p) nvgpu_kfree(g, p); } -void *__nvgpu_kmalloc(struct gk20a *g, size_t size, unsigned long ip) +void *__nvgpu_kmalloc(struct gk20a *g, size_t size, void *ip) { void *alloc; @@ -85,7 +85,7 @@ void *__nvgpu_kmalloc(struct gk20a *g, size_t size, unsigned long ip) return alloc; } -void *__nvgpu_kzalloc(struct gk20a *g, size_t size, unsigned long ip) +void *__nvgpu_kzalloc(struct gk20a *g, size_t size, void *ip) { void *alloc; @@ -101,7 +101,7 @@ void *__nvgpu_kzalloc(struct gk20a *g, size_t size, unsigned long ip) return alloc; } -void *__nvgpu_kcalloc(struct gk20a *g, size_t n, size_t size, unsigned long ip) +void *__nvgpu_kcalloc(struct gk20a *g, size_t n, size_t size, void *ip) { void *alloc; @@ -117,7 +117,7 @@ void *__nvgpu_kcalloc(struct gk20a *g, size_t n, size_t size, unsigned long ip) return alloc; } -void *__nvgpu_vmalloc(struct gk20a *g, unsigned long size, unsigned long ip) +void *__nvgpu_vmalloc(struct gk20a *g, unsigned long size, void *ip) { void *alloc; @@ -132,7 +132,7 @@ void *__nvgpu_vmalloc(struct gk20a *g, unsigned long size, unsigned long ip) return alloc; } -void *__nvgpu_vzalloc(struct gk20a *g, unsigned long size, unsigned long ip) +void *__nvgpu_vzalloc(struct gk20a *g, unsigned long size, void *ip) { void *alloc; @@ -228,7 +228,7 @@ static struct nvgpu_mem_alloc *nvgpu_rem_alloc( static int __nvgpu_save_kmem_alloc(struct nvgpu_mem_alloc_tracker *tracker, unsigned long size, unsigned long real_size, - u64 addr, unsigned long ip) + u64 addr, void *ip) { int ret; struct nvgpu_mem_alloc *alloc; @@ -244,7 +244,7 @@ static int __nvgpu_save_kmem_alloc(struct nvgpu_mem_alloc_tracker *tracker, alloc->size = size; alloc->real_size = real_size; alloc->addr = addr; - alloc->ip = (void *)(uintptr_t)ip; + alloc->ip = ip; #ifdef __NVGPU_SAVE_KALLOC_STACK_TRACES stack_trace.max_entries = MAX_STACK_TRACE; @@ -322,7 +322,7 @@ static void __nvgpu_check_kalloc_size(size_t size) } void *__nvgpu_track_vmalloc(struct gk20a *g, unsigned long size, - unsigned long ip) + void *ip) { void *alloc = vmalloc(size); @@ -342,7 +342,7 @@ void *__nvgpu_track_vmalloc(struct gk20a *g, unsigned long size, } void *__nvgpu_track_vzalloc(struct gk20a *g, unsigned long size, - unsigned long ip) + void *ip) { void *alloc = vzalloc(size); @@ -361,7 +361,7 @@ void *__nvgpu_track_vzalloc(struct gk20a *g, unsigned long size, return alloc; } -void *__nvgpu_track_kmalloc(struct gk20a *g, size_t size, unsigned long ip) +void *__nvgpu_track_kmalloc(struct gk20a *g, size_t size, void *ip) { void *alloc = kmalloc(size, GFP_KERNEL); @@ -376,7 +376,7 @@ void *__nvgpu_track_kmalloc(struct gk20a *g, size_t size, unsigned long ip) return alloc; } -void *__nvgpu_track_kzalloc(struct gk20a *g, size_t size, unsigned long ip) +void *__nvgpu_track_kzalloc(struct gk20a *g, size_t size, void *ip) { void *alloc = kzalloc(size, GFP_KERNEL); @@ -392,7 +392,7 @@ void *__nvgpu_track_kzalloc(struct gk20a *g, size_t size, unsigned long ip) } void *__nvgpu_track_kcalloc(struct gk20a *g, size_t n, size_t size, - unsigned long ip) + void *ip) { void *alloc = kcalloc(n, size, GFP_KERNEL); -- cgit v1.2.2