From 1e7c3cb038f06b0625e50f32e740afe4433296fd Mon Sep 17 00:00:00 2001 From: Petlozu Pravareshwar Date: Wed, 14 Aug 2019 00:10:34 +0530 Subject: [PATCH] gpu: nvgpu: add fault injection for posix routines This adds the ability to enable fault injection for some of the POSIX implementation of the nvgpu condition and thread routines. JIRA NVGPU-2679 Change-Id: I6abb9d5ba3fbe8921e48a135e440c179702dcf6b Signed-off-by: Petlozu Pravareshwar Reviewed-on: https://git-master.nvidia.com/r/2174647 GVS: Gerrit_Virtual_Submit Reviewed-by: Vijayakumar Subbu Reviewed-by: Alex Waterman Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/include/nvgpu/posix/cond.h | 4 ++++ .../gpu/nvgpu/include/nvgpu/posix/thread.h | 4 ++++ drivers/gpu/nvgpu/os/posix/cond.c | 19 +++++++++++++++++++ drivers/gpu/nvgpu/os/posix/thread.c | 19 +++++++++++++++++++ 4 files changed, 46 insertions(+) diff --git a/drivers/gpu/nvgpu/include/nvgpu/posix/cond.h b/drivers/gpu/nvgpu/include/nvgpu/posix/cond.h index 12feecaa1..1b8f164e1 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/posix/cond.h +++ b/drivers/gpu/nvgpu/include/nvgpu/posix/cond.h @@ -35,6 +35,10 @@ struct nvgpu_cond { pthread_condattr_t attr; }; +#ifdef NVGPU_UNITTEST_FAULT_INJECTION_ENABLEMENT +struct nvgpu_posix_fault_inj *nvgpu_cond_get_fault_injection(void); +#endif + int nvgpu_cond_timedwait(struct nvgpu_cond *c, unsigned int *ms); void nvgpu_cond_signal_locked(struct nvgpu_cond *cond); int nvgpu_cond_broadcast_locked(struct nvgpu_cond *cond); diff --git a/drivers/gpu/nvgpu/include/nvgpu/posix/thread.h b/drivers/gpu/nvgpu/include/nvgpu/posix/thread.h index 2e0bdf47c..9eff7508d 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/posix/thread.h +++ b/drivers/gpu/nvgpu/include/nvgpu/posix/thread.h @@ -57,6 +57,10 @@ struct nvgpu_thread { char tname[NVGPU_THREAD_POSIX_MAX_NAMELEN]; }; +#ifdef NVGPU_UNITTEST_FAULT_INJECTION_ENABLEMENT +struct nvgpu_posix_fault_inj *nvgpu_thread_get_fault_injection(void); +#endif + int nvgpu_thread_create_priority(struct nvgpu_thread *thread, void *data, int (*threadfn)(void *data), int priority, const char *name); diff --git a/drivers/gpu/nvgpu/os/posix/cond.c b/drivers/gpu/nvgpu/os/posix/cond.c index eadb3e0c2..ede5b544f 100644 --- a/drivers/gpu/nvgpu/os/posix/cond.c +++ b/drivers/gpu/nvgpu/os/posix/cond.c @@ -22,11 +22,30 @@ #include #include +#ifdef NVGPU_UNITTEST_FAULT_INJECTION_ENABLEMENT +#include +#endif + +#ifdef NVGPU_UNITTEST_FAULT_INJECTION_ENABLEMENT +_Thread_local struct nvgpu_posix_fault_inj cond_fi = { + .enabled = false,.counter = 0U,}; + +struct nvgpu_posix_fault_inj *nvgpu_cond_get_fault_injection(void) +{ + return &cond_fi; +} +#endif int nvgpu_cond_init(struct nvgpu_cond *cond) { int ret; +#ifdef NVGPU_UNITTEST_FAULT_INJECTION_ENABLEMENT + if (nvgpu_posix_fault_injection_handle_call(&cond_fi)) { + return -EINVAL; + } +#endif + ret = pthread_condattr_init(&cond->attr); if (ret != 0) { return ret; diff --git a/drivers/gpu/nvgpu/os/posix/thread.c b/drivers/gpu/nvgpu/os/posix/thread.c index 3eaa4205b..af0203234 100644 --- a/drivers/gpu/nvgpu/os/posix/thread.c +++ b/drivers/gpu/nvgpu/os/posix/thread.c @@ -23,6 +23,19 @@ #include #include #include +#ifdef NVGPU_UNITTEST_FAULT_INJECTION_ENABLEMENT +#include +#endif + +#ifdef NVGPU_UNITTEST_FAULT_INJECTION_ENABLEMENT +_Thread_local struct nvgpu_posix_fault_inj thread_fi = { + .enabled = false,.counter = 0U,}; + +struct nvgpu_posix_fault_inj *nvgpu_thread_get_fault_injection(void) +{ + return &thread_fi; +} +#endif /** * Use pthreads to mostly emulate the Linux kernel APIs. There are some things @@ -61,6 +74,12 @@ int nvgpu_thread_create(struct nvgpu_thread *thread, pthread_attr_t attr; int ret; +#ifdef NVGPU_UNITTEST_FAULT_INJECTION_ENABLEMENT + if (nvgpu_posix_fault_injection_handle_call(&thread_fi)) { + return -EINVAL; + } +#endif + (void) memset(thread, 0, sizeof(*thread)); /*