Skip to content

Test failures for python-isal on aarch64 #316

@ellert

Description

@ellert

When compiling https://github.com/pycompression/python-isal on aarch64 there are some test failures.

The following tests from python-isal fail on aarch64:

=========================== short test summary info ============================
FAILED tests/test_compat.py::test_decompress_wbits[131072-1-15-1] - igzip_lib.IsalError: Error -6 Incorrect checksum found
FAILED tests/test_compat.py::test_decompress_wbits[131072-1-31-1] - igzip_lib.IsalError: Error -6 Incorrect checksum found
FAILED tests/test_compat.py::test_decompress_decompressobj[131072-1-15-1] - igzip_lib.IsalError: Error -6 Incorrect checksum found
FAILED tests/test_compat.py::test_decompress_decompressobj[131072-1-31-1] - igzip_lib.IsalError: Error -6 Incorrect checksum found
============ 4 failed, 9437 passed, 6 skipped, 2 warnings in 26.12s ============

The failures are not related to the python-isal code, but are related to the aarch64 assembler version of decode_huffman_code_block_stateless in ISA-L. If this is not used the tests do not fail.

diff --git a/igzip/aarch64/igzip_multibinary_aarch64_dispatcher.c b/igzip/aarch64/igzip_multibinary_aarch64_dispatcher.c
index cadec0c..71f61a2 100644
--- a/igzip/aarch64/igzip_multibinary_aarch64_dispatcher.c
+++ b/igzip/aarch64/igzip_multibinary_aarch64_dispatcher.c
@@ -234,9 +234,9 @@ DEFINE_INTERFACE_DISPATCHER(isal_deflate_hash_lvl3)
 DEFINE_INTERFACE_DISPATCHER(decode_huffman_code_block_stateless)
 {
 #if defined(__linux__)
-        unsigned long auxval = getauxval(AT_HWCAP);
-        if (auxval & HWCAP_CRC32)
-                return PROVIDER_INFO(decode_huffman_code_block_stateless_aarch64);
+        /* unsigned long auxval = getauxval(AT_HWCAP); */
+        /* if (auxval & HWCAP_CRC32) */
+        /*         return PROVIDER_INFO(decode_huffman_code_block_stateless_aarch64); */
 #elif defined(__APPLE__)
         if (sysctlEnabled(SYSCTL_CRC32_KEY))
                 return PROVIDER_INFO(decode_huffman_code_block_stateless_aarch64);

The above is obviously not the proper patch, the assembler code should be debugged and fixed instead. I don't know enough assembler to debug this. Since the change above is just a workaround I didn't create a pull request and filed an issue instead.

The long test failure log is copied below:

=================================== FAILURES ===================================
_____________________ test_decompress_wbits[131072-1-15-1] _____________________
data_size = 131072, level = 1, wbits = 15, memLevel = 1
    @pytest.mark.parametrize(["data_size", "level", "wbits", "memLevel"],
                             itertools.product([128 * 1024], range(4),
                                               WBITS_RANGE, range(1, 10)))
    def test_decompress_wbits(data_size, level, wbits, memLevel):
        data = DATA[:data_size]
        compressobj = zlib.compressobj(level=level, wbits=wbits, memLevel=memLevel)
        compressed = compressobj.compress(data) + compressobj.flush()
>       decompressed = isal_zlib.decompress(compressed, wbits=wbits)
E       igzip_lib.IsalError: Error -6 Incorrect checksum found
tests/test_compat.py:76: IsalError
_____________________ test_decompress_wbits[131072-1-31-1] _____________________
data_size = 131072, level = 1, wbits = 31, memLevel = 1
    @pytest.mark.parametrize(["data_size", "level", "wbits", "memLevel"],
                             itertools.product([128 * 1024], range(4),
                                               WBITS_RANGE, range(1, 10)))
    def test_decompress_wbits(data_size, level, wbits, memLevel):
        data = DATA[:data_size]
        compressobj = zlib.compressobj(level=level, wbits=wbits, memLevel=memLevel)
        compressed = compressobj.compress(data) + compressobj.flush()
>       decompressed = isal_zlib.decompress(compressed, wbits=wbits)
E       igzip_lib.IsalError: Error -6 Incorrect checksum found
tests/test_compat.py:76: IsalError
_________________ test_decompress_decompressobj[131072-1-15-1] _________________
data_size = 131072, level = 1, wbits = 15, memLevel = 1
    @pytest.mark.parametrize(["data_size", "level", "wbits", "memLevel"],
                             itertools.product([128 * 1024], range(4),
                                               WBITS_RANGE, range(1, 10)))
    def test_decompress_decompressobj(data_size, level, wbits, memLevel):
        data = DATA[:data_size]
        compressobj = zlib.compressobj(level=level, wbits=wbits, memLevel=memLevel)
        compressed = compressobj.compress(data) + compressobj.flush()
        decompressobj = isal_zlib.decompressobj(wbits=wbits)
>       decompressed = decompressobj.decompress(compressed) + decompressobj.flush()
E       igzip_lib.IsalError: Error -6 Incorrect checksum found
tests/test_compat.py:111: IsalError
_________________ test_decompress_decompressobj[131072-1-31-1] _________________
data_size = 131072, level = 1, wbits = 31, memLevel = 1
    @pytest.mark.parametrize(["data_size", "level", "wbits", "memLevel"],
                             itertools.product([128 * 1024], range(4),
                                               WBITS_RANGE, range(1, 10)))
    def test_decompress_decompressobj(data_size, level, wbits, memLevel):
        data = DATA[:data_size]
        compressobj = zlib.compressobj(level=level, wbits=wbits, memLevel=memLevel)
        compressed = compressobj.compress(data) + compressobj.flush()
        decompressobj = isal_zlib.decompressobj(wbits=wbits)
>       decompressed = decompressobj.decompress(compressed) + decompressobj.flush()
E       igzip_lib.IsalError: Error -6 Incorrect checksum found
tests/test_compat.py:111: IsalError

The tests cycles through many sets of possible parameters, but the failure is only seen on two of the many sets:

  • data_size = 131072, level = 1, wbits = 15, memLevel = 1
  • data_size = 131072, level = 1, wbits = 31, memLevel = 1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions