Force 16-byte buffer alignment for SIMD #83
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Hello,
I stumbled upon this when I investigated jackd consistently crashing in some
configurations of OSS on FreeBSD. In summary, the buffer size is reset
according to the number of samples requested by the driver backend. If this
number is not a multiple of 4, jackd will misalign its buffers for SSE SIMD
instructions and die with SIGBUS when processing them. The proposed fix
introduces some padding to align the buffers, in case this happens.
Please note that even though these odd buffer sizes seem to be unusual, the
problem is not necessarily tied to the OSS backend.
More details can be found in the commit message and in the original bug report:
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=234574
The proposed patch is the same as currently applied in the FreeBSD ports tree.
Thanks for your consideration
Florian Walpen
Commit message:
With build option USE_DYNSIMD, SSE SIMD instructions are enabled that require
16-byte aligned buffer data. Multiple buffers are allocated in one contiguous
block of memory, the buffer size is determined by the number of 4-byte float
samples (nframes) per buffer. If this number is not set to a multiple of 4, the
offset of subsequent buffers will be misaligned and jackd crashes with SIGBUS.
An example of this actually happening would be using 24 bit sample size in the
OSS backend, where the page sized system buffers may result in an odd number of
samples per buffer. See
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=234574
for a detailed bug report.
This change effectively adds some padding by rounding up the allocated buffer
size to a multiple of 16 bytes, given that both:
a) SIMD instructions are enabled in the build.
b) The requested buffer size is not already a multiple of 16 bytes.
All other cases should be unaffected. The existing buffer handling, copy and
mix code seems to be well prepared for padded buffers, with the number of
samples (nframes) and buffer offsets kept separately.