state of openjdks zlib on s390x
Eduard Stefes
eddy at linux.ibm.com
Tue Oct 21 14:26:10 UTC 2025
Hello,
Disclaimer: This is email could cause cause discussions and work.
# TLDR
zlib (and zlib-ng) on s390x use hardware compression. This
hardware compression implementation has currently some problems when
used by openjdk.
# current situation
- openjdk uses zlib(or zlib-ng) for most(all?) its data compression.
This includes also jar file creation.
- s390x has deflate implemented on hardware level(called dfltcc). This
implementation is up to 10x faster(empirical value) compared to the
standard software algorithm.
- The dfltcc implementation has some drawbacks vs the software
implementation:
- dfltcc will ALWAYS write to the output buffer, indifferent
of the flushing parameter passed to deflate()
- dfltcc does not generate reproducible output. This means
that it will always generate valid deflate data streams
that uncompress(inflate) to the same input. But the
compressed data may look different between two calls with
the same input data, because the hardware compressor depends
also on hardware variables that not visible to the external
api user.
# the problem
due to the differences of the hardware implementation, some tests in
the openjdk JREG tests fail(tracked here[1][2])
- java/util/zip/CloseInflaterDeflaterTest.java
fails due to dfltcc's flushing behaviour. The test should check if
the openjdk wrapper around the jni and native library will
successfully detect writes to closed output streams. This was
created because there where bugs with and race conditions in the
write/close/flush.
- tools/jlink/JLinkReproducibleTest.java:
- tools/jar/modularJar/JarToolModuleDescriptorReproducibilityTest.java:
This tests fail due to two calls to dfltcc will not generate the
same compressed data for the same input data. I want to
emphasize that RFC 1950 and 1951 do not guarantee the same output
for two deflate/zlib data streams if feed the same input data.
# proposed solutions
## flushing problem
IMHO the CloseInflaterDeflaterTest.java test relays on zlib behavior
where zlib explicitly has the freedom to change its behavior[3][1].
As a quick and dirty solution i would propose to backport the
disablement[4] of this test to openjdk-17 21 and 24.
I read and traced through the test, and for me it looks like the
behavior of the openjdk and jni wrappers will be the same regardless of
the underlying zlib. Therefor it seems ok to assume that: "If its okay
on x86 it will be ok on s390x"
However I think that this test might need a redesign. It relies on
flushing behavior of zlib the the library explicitly stated can change.
## reproducible compression
I don't know how much openjdk relies on reproducible data compression.
I assume it is preferable if its possible to create the same .jar twice
and get the same binary data. The zlib dfltcc implementation could be
controlled via an env variable to disable the hardware compression[5].
Also usually dftcc will only be used for certain compression levels and
this can also be changed via env variables[6].
Unfortunately this env variables are evaluated at library load and can
not be adjusted during runtime.
Moreover ubuntu setzt the default LEVEL_MASK to 0x7e[7]. This means
that the compression level is also not a reliabl method in order to
force zlib to use software instead of hardware compression.
Also zlib-ng lacks this env variables. Here the use of dfltcc cannot be
influenced at all.
This all leads me to the conclusion that there has to be a decision if
and how openjdk on s390x will be able to generate reproducible jars.
For the time being I suppose to also disable this tests and backport
the disablements down till openjdk-17.
# Finally
I hope i did not overwhelm you all with this email. As I don't have a
bugs.openjdk.org account, I thought the mailing list is the best place
to discuss this mater. If all are okay with disabling the tests I can
create the PR in gh.
cheers Eddy
[1] https://bugs.launchpad.net/ubuntu/+source/openjdk-21/+bug/2109016
[2] https://bugs.openjdk.org/browse/JDK-8339216
[3] https://github.com/madler/zlib/blob/develop/zlib.h#L286-L288
[4]
https://github.com/openjdk/jdk/commit/537447f8816129dad9a1edd21bd30f3edf69ea60
[5]
https://github.com/iii-i/zlib/blob/dfltcc/contrib/s390/dfltcc.c#L705-L706
[6]
https://github.com/iii-i/zlib/blob/dfltcc/contrib/s390/dfltcc.c#L714-L715
[7] https://git.launchpad.net/ubuntu/+source/zlib/tree/debian/rules#n53
More information about the jdk-dev
mailing list