From patchwork Thu Feb 29 16:03:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Szczepanek X-Patchwork-Id: 137507 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8E26D43C3B; Thu, 29 Feb 2024 17:04:11 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 09F3742EE6; Thu, 29 Feb 2024 17:03:47 +0100 (CET) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mails.dpdk.org (Postfix) with ESMTP id B3EDC42DBD for ; Thu, 29 Feb 2024 17:03:39 +0100 (CET) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E98D8152B; Thu, 29 Feb 2024 08:04:17 -0800 (PST) Received: from ampere-altra-2-1.usa.Arm.com (ampere-altra-2-1.usa.arm.com [10.118.91.158]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 168623F6C4; Thu, 29 Feb 2024 08:03:39 -0800 (PST) From: Paul Szczepanek To: dev@dpdk.org Cc: Paul Szczepanek Subject: [PATCH v6 4/4] test: add unit test for ptr compression Date: Thu, 29 Feb 2024 16:03:08 +0000 Message-Id: <20240229160308.365277-5-paul.szczepanek@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240229160308.365277-1-paul.szczepanek@arm.com> References: <20230927150854.3670391-2-paul.szczepanek@arm.com> <20240229160308.365277-1-paul.szczepanek@arm.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Test compresses and decompresses pointers with various combinations of memory regions and alignments and verifies the pointers are recovered correctly. Signed-off-by: Paul Szczepanek --- app/test/meson.build | 1 + app/test/test_eal_ptr_compress.c | 108 +++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 app/test/test_eal_ptr_compress.c -- 2.25.1 diff --git a/app/test/meson.build b/app/test/meson.build index 4183d66b0e..3e172b154d 100644 --- a/app/test/meson.build +++ b/app/test/meson.build @@ -66,6 +66,7 @@ source_file_deps = { 'test_dmadev_api.c': ['dmadev'], 'test_eal_flags.c': [], 'test_eal_fs.c': [], + 'test_eal_ptr_compress.c': [], 'test_efd.c': ['efd', 'net'], 'test_efd_perf.c': ['efd', 'hash'], 'test_errno.c': [], diff --git a/app/test/test_eal_ptr_compress.c b/app/test/test_eal_ptr_compress.c new file mode 100644 index 0000000000..c1c9a98be7 --- /dev/null +++ b/app/test/test_eal_ptr_compress.c @@ -0,0 +1,108 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2014 Intel Corporation + */ + +#include "test.h" +#include +#include + +#include + +#define MAX_ALIGN_EXPONENT 3 +#define PTRS_SIZE 16 +#define NUM_BASES 2 +#define NUM_REGIONS 4 +#define MAX_32BIT_REGION ((uint64_t)UINT32_MAX + 1) +#define MAX_16BIT_REGION (UINT16_MAX + 1) + +static int +test_eal_ptr_compress_params( + void *base, + uint64_t mem_sz, + unsigned int align_exp, + unsigned int num_ptrs, + bool use_32_bit) +{ + unsigned int i; + unsigned int align = 1 << align_exp; + void *ptrs[PTRS_SIZE] = {0}; + void *ptrs_out[PTRS_SIZE] = {0}; + uint32_t offsets32[PTRS_SIZE] = {0}; + uint16_t offsets16[PTRS_SIZE] = {0}; + + for (i = 0; i < num_ptrs; i++) { + /* make pointers point at memory in steps of align */ + /* alternate steps from the start and end of memory region */ + if ((i & 1) == 1) + ptrs[i] = (char *)base + mem_sz - i * align; + else + ptrs[i] = (char *)base + i * align; + } + + if (use_32_bit) { + rte_ptr_compress_32(base, ptrs, offsets32, num_ptrs, align_exp); + rte_ptr_decompress_32(base, offsets32, ptrs_out, num_ptrs, + align_exp); + } else { + rte_ptr_compress_16(base, ptrs, offsets16, num_ptrs, align_exp); + rte_ptr_decompress_16(base, offsets16, ptrs_out, num_ptrs, + align_exp); + } + + TEST_ASSERT_BUFFERS_ARE_EQUAL(ptrs, ptrs_out, sizeof(void *) * num_ptrs, + "Decompressed pointers corrupted\nbase pointer: %p, " + "memory region size: %" PRIu64 ", alignment exponent: %u, " + "num of pointers: %u, using %s offsets", + base, mem_sz, align_exp, num_ptrs, + use_32_bit ? "32-bit" : "16-bit"); + + return 0; +} + +static int +test_eal_ptr_compress(void) +{ + unsigned int j, k, n; + int ret = 0; + void * const bases[NUM_BASES] = { (void *)0, (void *)UINT16_MAX }; + /* maximum size for pointers aligned by consecutive powers of 2 */ + const uint64_t region_sizes_16[NUM_REGIONS] = { + MAX_16BIT_REGION, + MAX_16BIT_REGION * 2, + MAX_16BIT_REGION * 4, + MAX_16BIT_REGION * 8, + }; + const uint64_t region_sizes_32[NUM_REGIONS] = { + MAX_32BIT_REGION, + MAX_32BIT_REGION * 2, + MAX_32BIT_REGION * 4, + MAX_32BIT_REGION * 8, + }; + + for (j = 0; j < NUM_REGIONS; j++) { + for (k = 0; k < NUM_BASES; k++) { + for (n = 1; n < PTRS_SIZE; n++) { + ret |= test_eal_ptr_compress_params( + bases[k], + region_sizes_16[j], + j /* exponent of alignment */, + n, + false + ); + ret |= test_eal_ptr_compress_params( + bases[k], + region_sizes_32[j], + j /* exponent of alignment */, + n, + true + ); + if (ret != 0) + return ret; + } + } + } + + return ret; +} + +REGISTER_FAST_TEST(eal_ptr_compress_autotest, true, true, test_eal_ptr_compress);