From 3e288dd836d7faa035b2fbe693b7606516c8d815 Mon Sep 17 00:00:00 2001 From: Philip Elcan Date: Tue, 17 Sep 2019 17:23:23 -0400 Subject: [PATCH] gpu: nvgpu: unit: add SWUTS docs for posix-fault-injection This adds the SWUTS documentation for the posix fault injection unit test. JIRA NVGPU-3943 Change-Id: I3b76d7c29599a053a9d10b57387b21dc4c3a1ca9 Signed-off-by: Philip Elcan Reviewed-on: https://git-master.nvidia.com/r/2200022 Reviewed-by: mobile promotions Tested-by: mobile promotions --- userspace/SWUTS.h | 1 + userspace/SWUTS.sources | 3 + .../posix-fault-injection-dma-alloc.c | 12 +- .../posix-fault-injection-dma-alloc.h | 84 +++++++- .../posix-fault-injection-kmem.c | 35 +--- .../posix-fault-injection-kmem.h | 189 +++++++++++++++++- .../fault-injection/posix-fault-injection.c | 3 +- .../fault-injection/posix-fault-injection.h | 54 +++++ 8 files changed, 333 insertions(+), 48 deletions(-) create mode 100644 userspace/units/posix/fault-injection/posix-fault-injection.h diff --git a/userspace/SWUTS.h b/userspace/SWUTS.h index 3c8cdb46d..1ad0583ac 100644 --- a/userspace/SWUTS.h +++ b/userspace/SWUTS.h @@ -39,6 +39,7 @@ * - @ref SWUTS-mm-nvgpu-sgt * - @ref SWUTS-mm-vm * - @ref SWUTS-fuse + * - @ref SWUTS-posix-fault-injection * - @ref SWUTS-posix-sizes * - @ref SWUTS-posix-thread * - @ref SWUTS-sdl diff --git a/userspace/SWUTS.sources b/userspace/SWUTS.sources index e37dcf0d0..73fd73aac 100644 --- a/userspace/SWUTS.sources +++ b/userspace/SWUTS.sources @@ -10,5 +10,8 @@ INPUT += ../../../userspace/units/mm/allocators/buddy_allocator/buddy_allocator. INPUT += ../../../userspace/units/mm/nvgpu_mem/nvgpu_mem.h INPUT += ../../../userspace/units/mm/nvgpu_sgt/nvgpu_sgt.h INPUT += ../../../userspace/units/mm/vm/vm.h +INPUT += ../../../userspace/units/posix/fault-injection/posix-fault-injection.h +INPUT += ../../../userspace/units/posix/fault-injection/posix-fault-injection-kmem.h +INPUT += ../../../userspace/units/posix/fault-injection/posix-fault-injection-dma-alloc.h INPUT += ../../../userspace/units/posix/sizes/posix-sizes.h INPUT += ../../../userspace/units/posix/thread/posix-thread.h diff --git a/userspace/units/posix/fault-injection/posix-fault-injection-dma-alloc.c b/userspace/units/posix/fault-injection/posix-fault-injection-dma-alloc.c index 52ae42bea..5c19d5fb6 100644 --- a/userspace/units/posix/fault-injection/posix-fault-injection-dma-alloc.c +++ b/userspace/units/posix/fault-injection/posix-fault-injection-dma-alloc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2018-2019, NVIDIA CORPORATION. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -55,7 +55,6 @@ static bool verify_fi_disabled(struct unit_module *m) return true; } -/* This test is for test environment initialization */ int test_dma_alloc_init(struct unit_module *m, struct gk20a *g, void *__args) { @@ -67,10 +66,6 @@ int test_dma_alloc_init(struct unit_module *m, } } -/* - * This test verifies the default case for dma_alloc operations when fault - * injection is disabled. - */ int test_dma_alloc_fi_default(struct unit_module *m, struct gk20a *g, void *__args) { @@ -111,10 +106,6 @@ test_exit: return ret; } -/* - * This test enables fault injection for dma_alloc immediately then verifies the - * first call to a dma_alloc fails. - */ int test_dma_alloc_fi_enabled(struct unit_module *m, struct gk20a *g, void *__args) { @@ -160,7 +151,6 @@ test_exit: return ret; } -/* This is a test of delayed fault injection enabling for dma_alloc */ int test_dma_alloc_fi_delayed_enable(struct unit_module *m, struct gk20a *g, void *__args) { diff --git a/userspace/units/posix/fault-injection/posix-fault-injection-dma-alloc.h b/userspace/units/posix/fault-injection/posix-fault-injection-dma-alloc.h index 27faefc5e..ba2cc3392 100644 --- a/userspace/units/posix/fault-injection/posix-fault-injection-dma-alloc.h +++ b/userspace/units/posix/fault-injection/posix-fault-injection-dma-alloc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2018-2019, NVIDIA CORPORATION. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -23,12 +23,94 @@ #ifndef __UNIT_FAULT_INJECTION_DMA_ALLOC_H__ #define __UNIT_FAULT_INJECTION_DMA_ALLOC_H__ +struct gk20a; +struct unit_module; + +/** @addtogroup SWUTS-posix-fault-injection + * @{ + */ + +/** + * Test specification for: test_dma_alloc_init + * + * Description: Initialization required for dma alloc fault injection tests. + * + * Test Type: Other (Setup) + * + * Input: test_fault_injection_init() must have been called prior to this test. + * + * Steps: + * - Get the pointer to the dma alloc fault injection object. + * + * Output: Returns SUCCESS if the steps above were executed successfully. FAIL + * otherwise. + */ int test_dma_alloc_init(struct unit_module *m, struct gk20a *g, void *__args); + +/** + * Test specification for: test_dma_alloc_fi_default + * + * Description: This test simply tests the default case of fault injection + * disabled for calling dma alloc routines. + * + * Test Type: Feature Based + * + * Input: test_fault_injection_init() & test_dma_alloc_init() must have been + * called prior to this test. + * + * Steps: + * - Verify the dma alloc fault injection is disabled. + * - Call nvgpu_dma_alloc() verify the call succeeded. + * - Free the dma allocation. + * + * Output: Returns SUCCESS if the steps above were executed successfully. FAIL + * otherwise. + */ int test_dma_alloc_fi_default(struct unit_module *m, struct gk20a *g, void *__args); + +/** + * Test specification for: test_dma_alloc_fi_enabled + * + * Description: This test validates immediate fault injection for dma alloc + * routines. + * + * Test Type: Feature Based + * + * Input: test_fault_injection_init() & test_dma_alloc_init() must have been + * called prior to this test. + * + * Steps: + * - Enable dma alloc fault injection immediately. + * - Call nvgpu_dma_alloc() and verify an error is returned. + * + * Output: Returns SUCCESS if the steps above were executed successfully. FAIL + * otherwise. + */ int test_dma_alloc_fi_enabled(struct unit_module *m, struct gk20a *g, void *__args); + +/** + * Test specification for: test_dma_alloc_fi_delayed_enable + * + * Description: This test validates delayed enable of fault injection for dma + * alloc APIs. + * + * Test Type: Feature Based + * + * Input: test_fault_injection_init() & test_dma_alloc_init() must have been + * called prior to this test. + * + * Steps: + * - Enable dma alloc fault injection for after 2 calls. + * - Loop calling nvgpu_dma_alloc() and verify success until the 3rd call. + * - Cleanup the dma allocation. + * + * Output: Returns SUCCESS if the steps above were executed successfully. FAIL + * otherwise. + */ int test_dma_alloc_fi_delayed_enable(struct unit_module *m, struct gk20a *g, void *__args); + #endif /* __UNIT_FAULT_INJECTION_DMA_ALLOC_H__ */ diff --git a/userspace/units/posix/fault-injection/posix-fault-injection-kmem.c b/userspace/units/posix/fault-injection/posix-fault-injection-kmem.c index ceb7dc7bc..40fdf85e6 100644 --- a/userspace/units/posix/fault-injection/posix-fault-injection-kmem.c +++ b/userspace/units/posix/fault-injection/posix-fault-injection-kmem.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2018-2019, NVIDIA CORPORATION. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -55,7 +55,6 @@ static bool verify_fi_disabled(struct unit_module *m) return true; } -/* This test is for test environment initialization */ int test_kmem_init(struct unit_module *m, struct gk20a *g, void *__args) { @@ -67,10 +66,6 @@ int test_kmem_init(struct unit_module *m, } } -/* - * This test simply tests the default case of fault injection disabled for - * calling kmem cache routines. - */ int test_kmem_cache_fi_default(struct unit_module *m, struct gk20a *g, void *__args) { @@ -108,11 +103,6 @@ test_exit: return ret; } -/* - * This test enables fault injection for kmem immediately then verifies the - * first call to a kmem cache API (in this case nvgpu_kmem_cache_create()) - * fails. - */ int test_kmem_cache_fi_enabled(struct unit_module *m, struct gk20a *g, void *__args) { @@ -158,7 +148,6 @@ test_exit: return ret; } -/* This is a test of delayed fault injection for kmem_cache APIs */ int test_kmem_cache_fi_delayed_enable(struct unit_module *m, struct gk20a *g, void *__args) { @@ -228,10 +217,6 @@ test_exit: return ret; } -/* - * This test validates delayed disabling of fault injection for calling kmem - * cache routines. - */ int test_kmem_cache_fi_delayed_disable(struct unit_module *m, struct gk20a *g, void *__args) { @@ -298,10 +283,6 @@ test_exit: return ret; } -/* - * This test validates the default case for kmem kmalloc routines when fault - * injection is disabled. - */ int test_kmem_kmalloc_fi_default(struct unit_module *m, struct gk20a *g, void *__args) { @@ -340,10 +321,6 @@ test_exit: return ret; } -/* - * This test verifies that kmalloc routines return errors after fault - * injection is enabled immediately. - */ int test_kmem_kmalloc_fi_enabled(struct unit_module *m, struct gk20a *g, void *__args) { @@ -389,11 +366,6 @@ test_exit: return ret; } -/* - * This test validates that when a fault injection is enabled with a delayed - * number of calls, the kmem kmalloc routines only report errors after the - * delayed number of calls have been made. - */ int test_kmem_kmalloc_fi_delayed_enable(struct unit_module *m, struct gk20a *g, void *__args) { @@ -462,11 +434,6 @@ test_exit: return ret; } -/* - * This test verifies that if fault injection is enabled and then set to be - * disabled after a delayed number of calls, the kmalloc routines return errors - * until the number of calls have been made, then they return valid results. - */ int test_kmem_kmalloc_fi_delayed_disable(struct unit_module *m, struct gk20a *g, void *__args) { diff --git a/userspace/units/posix/fault-injection/posix-fault-injection-kmem.h b/userspace/units/posix/fault-injection/posix-fault-injection-kmem.h index c1a6ee05b..1740e976f 100644 --- a/userspace/units/posix/fault-injection/posix-fault-injection-kmem.h +++ b/userspace/units/posix/fault-injection/posix-fault-injection-kmem.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2018-2019, NVIDIA CORPORATION. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -23,24 +23,211 @@ #ifndef __UNIT_FAULT_INJECTION_KMEM_H__ #define __UNIT_FAULT_INJECTION_KMEM_H__ +struct gk20a; +struct unit_module; + +/** @addtogroup SWUTS-posix-fault-injection + * @{ + */ + +/** + * Test specification for: test_kmem_init + * + * Description: Initialization required for kmem fault injection tests. + * + * Test Type: Other (Setup) + * + * Input: test_fault_injection_init() must have been called prior to this test. + * + * Steps: + * - Get the pointer to the kmem fault injection object. + * + * Output: Returns SUCCESS if the steps above were executed successfully. FAIL + * otherwise. + */ int test_kmem_init(struct unit_module *m, struct gk20a *g, void *__args); + +/** + * Test specification for: test_kmem_cache_fi_default + * + * Description: This test simply tests the default case of fault injection + * disabled for calling kmem cache routines. + * + * Test Type: Feature Based + * + * Input: test_fault_injection_init() & test_kmem_init() must have been called + * prior to this test. + * + * Steps: + * - Verify the kmem fault injection is disabled. + * - Create a kmem cache object and verify the return is non-NULL. + * - Destroy the kmem cache object. + * + * Output: Returns SUCCESS if the steps above were executed successfully. FAIL + * otherwise. + */ int test_kmem_cache_fi_default(struct unit_module *m, struct gk20a *g, void *__args); + +/** + * Test specification for: test_kmem_cache_fi_enabled + * + * Description: This test validates immediate fault injection for kmem cache + * create. + * + * Test Type: Feature Based + * + * Input: test_fault_injection_init() & test_kmem_init() must have been called + * prior to this test. + * + * Steps: + * - Enable kmem fault injection immediately. + * - Create a kmem cache object and verify the return is NULL, indicating + * failure. + * + * Output: Returns SUCCESS if the steps above were executed successfully. FAIL + * otherwise. + */ int test_kmem_cache_fi_enabled(struct unit_module *m, struct gk20a *g, void *__args); + +/** + * Test specification for: test_kmem_cache_fi_delayed_enable + * + * Description: This test validates delayed enable of fault injection for kmem + * cache APIs. + * + * Test Type: Feature Based + * + * Input: test_fault_injection_init() & test_kmem_init() must have been called + * prior to this test. + * + * Steps: + * - Enable kmem fault injection for after 2 calls. + * - Create a kmem cache object and verify the return is non-NULL, indicating + * pass. + * - Allocate from the kmem cache object and verify the 1st call passes. + * - Allocate from the kmem cache object and verify the 2nd call fails. + * - Cleanup the allocated cache. + * + * Output: Returns SUCCESS if the steps above were executed successfully. FAIL + * otherwise. + */ int test_kmem_cache_fi_delayed_enable(struct unit_module *m, struct gk20a *g, void *__args); + +/** + * Test specification for: test_kmem_cache_fi_delayed_disable + * + * Description: This test validates delayed disable of fault injection for kmem + * cache APIs. + * + * Test Type: Feature Based + * + * Input: test_fault_injection_init() & test_kmem_init() must have been called + * prior to this test. + * + * Steps: + * - Enable kmem fault injection immediately. + * - Disable fault injection for after 1 call. + * - Create a kmem cache object and verify the return is NULL, indicating fail. + * - Create a kmem cache object and verify the return is non-NULL for the 2nd + * call, indicating pass and the fault injection was disabled. + * - Cleanup the allocated cache. + * + * Output: Returns SUCCESS if the steps above were executed successfully. FAIL + * otherwise. + */ int test_kmem_cache_fi_delayed_disable(struct unit_module *m, struct gk20a *g, void *__args); +/** + * Test specification for: test_kmem_kmalloc_fi_default + * + * Description: This test simply tests the default case of fault injection + * disabled for calling kmem kmalloc routines. + * + * Test Type: Feature Based + * + * Input: test_fault_injection_init() & test_kmem_init() must have been called + * prior to this test. + * + * Steps: + * - Verify the kmem fault injection is disabled. + * - Allocate memory with nvgpu_kmalloc() and verify the call passed. + * - Free the kmem kmalloc memory. + * + * Output: Returns SUCCESS if the steps above were executed successfully. FAIL + * otherwise. + */ int test_kmem_kmalloc_fi_default(struct unit_module *m, struct gk20a *g, void *__args); + +/** + * Test specification for: test_kmem_kmalloc_fi_enabled + * + * Description: This test validates immediate fault injection for kmem kmalloc. + * + * Test Type: Feature Based + * + * Input: test_fault_injection_init() & test_kmem_init() must have been called + * prior to this test. + * + * Steps: + * - Enable kmem fault injection immediately. + * - Allocate memory with nvgpu_kmalloc() and verify the result is NULL, + * indicating fail. + * + * Output: Returns SUCCESS if the steps above were executed successfully. FAIL + * otherwise. + */ int test_kmem_kmalloc_fi_enabled(struct unit_module *m, struct gk20a *g, void *__args); + +/** + * Test specification for: test_kmem_kmalloc_fi_delayed_enable + * + * Description: This test validates delayed enable of fault injection for kmem + * kmalloc APIs. + * + * Test Type: Feature Based + * + * Input: test_fault_injection_init() & test_kmem_init() must have been called + * prior to this test. + * + * Steps: + * - Enable kmem fault injection for after 2 calls. + * - Call nvgpu_kmalloc() 3 times and verify it fails only on the 3rd call. + * - Cleanup the allocated memory. + * + * Output: Returns SUCCESS if the steps above were executed successfully. FAIL + * otherwise. + */ int test_kmem_kmalloc_fi_delayed_enable(struct unit_module *m, struct gk20a *g, void *__args); + +/** + * Test specification for: test_kmem_kmalloc_fi_delayed_disable + * + * Description: This test validates delayed disable of fault injection for kmem + * kalloc APIs. + * + * Test Type: Feature Based + * + * Input: test_fault_injection_init() & test_kmem_init() must have been called + * prior to this test. + * + * Steps: + * - Enable kmem fault injection immediately. + * - Disable fault injection for after 2 calls. + * - Call nvgpu_kmalloc() in a loop and verify it fails until the 3rd call. + * - Cleanup the allocated cache. + * + * Output: Returns SUCCESS if the steps above were executed successfully. FAIL + * otherwise. + */ int test_kmem_kmalloc_fi_delayed_disable(struct unit_module *m, struct gk20a *g, void *__args); diff --git a/userspace/units/posix/fault-injection/posix-fault-injection.c b/userspace/units/posix/fault-injection/posix-fault-injection.c index 724f164ab..324ff633b 100644 --- a/userspace/units/posix/fault-injection/posix-fault-injection.c +++ b/userspace/units/posix/fault-injection/posix-fault-injection.c @@ -23,10 +23,11 @@ #include #include #include +#include "posix-fault-injection.h" #include "posix-fault-injection-kmem.h" #include "posix-fault-injection-dma-alloc.h" -static int test_fault_injection_init(struct unit_module *m, +int test_fault_injection_init(struct unit_module *m, struct gk20a *g, void *__args) { nvgpu_set_enabled(g, NVGPU_MM_UNIFIED_MEMORY, true); diff --git a/userspace/units/posix/fault-injection/posix-fault-injection.h b/userspace/units/posix/fault-injection/posix-fault-injection.h new file mode 100644 index 000000000..2398d1480 --- /dev/null +++ b/userspace/units/posix/fault-injection/posix-fault-injection.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef UNIT_FAULT_INJECTION_H +#define UNIT_FAULT_INJECTION_H + +struct gk20a; +struct unit_module; + +/** @addtogroup SWUTS-posix-fault-injection + * @{ + * + * Software Unit Test Specification for posix-fault-injection + */ + +/** + * Test specification for: test_fault_injection_init + * + * Description: General initialization required for posix fault injection tests. + * + * Test Type: Other (Setup) + * + * Input: None + * + * Steps: + * - Set the enabled flag NVGPU_MM_UNIFIED_MEMORY flag required for the mm unit + * to function properly for these tests. + * + * Output: Returns SUCCESS if the steps above were executed successfully. FAIL + * otherwise. + */ +int test_fault_injection_init(struct unit_module *m, + struct gk20a *g, void *__args); + +#endif /* UNIT_FAULT_INJECTION_H */ \ No newline at end of file