Skip to content

Commit 32254a8

Browse files
committed
audio: kpb: fix buffer_stream_invalidate size in micselect copy helpers
In all four kpb_micselect_copy16/32 variants (HiFi3 and generic), the call to buffer_stream_invalidate(source, size) used the output byte count (produced_bytes) as the invalidation size. When in_channels > micsel_channels, the actual input span read by the copy loop is: samples_per_chan * in_channels * sample_size which is larger than the output span (size). Under-invalidating the source buffer on CONFIG_INCOHERENT platforms can cause stale cache reads. Fix: compute samples_per_chan before the invalidate call and pass the correct input span to buffer_stream_invalidate() in all four helpers. Signed-off-by: Tomasz Leman <tomasz.m.leman@intel.com>
1 parent a467602 commit 32254a8

1 file changed

Lines changed: 10 additions & 8 deletions

File tree

src/audio/kpb.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,12 +1039,13 @@ static void kpb_micselect_copy16(struct comp_buffer *sink,
10391039
AE_SETCBEGIN0(audio_stream_get_addr(ostream));
10401040
AE_SETCEND0(audio_stream_get_end_addr(ostream));
10411041

1042-
buffer_stream_invalidate(source, size);
1042+
const size_t samples_per_chan = size / (sizeof(ae_int16) * micsel_channels);
1043+
1044+
buffer_stream_invalidate(source, samples_per_chan * in_channels * sizeof(ae_int16));
10431045
const ae_int16 *in_ptr = audio_stream_get_rptr(istream);
10441046
ae_int16x4 d16 = AE_ZERO16();
10451047
const size_t in_offset = in_channels * sizeof(ae_int16);
10461048
const size_t out_offset = micsel_channels * sizeof(ae_int16);
1047-
const size_t samples_per_chan = size / (sizeof(uint16_t) * micsel_channels);
10481049
ae_int16 *out_ptr;
10491050

10501051
for (ch = 0; ch < micsel_channels; ch++) {
@@ -1072,13 +1073,14 @@ static void kpb_micselect_copy32(struct comp_buffer *sink,
10721073
AE_SETCBEGIN0(audio_stream_get_addr(ostream));
10731074
AE_SETCEND0(audio_stream_get_end_addr(ostream));
10741075

1075-
buffer_stream_invalidate(source, size);
1076+
const size_t samples_per_chan = size / (sizeof(ae_int32) * micsel_channels);
1077+
1078+
buffer_stream_invalidate(source, samples_per_chan * in_channels * sizeof(ae_int32));
10761079

10771080
const ae_int32 *in_ptr = audio_stream_get_rptr(istream);
10781081
ae_int32x2 d32 = AE_ZERO32();
10791082
const size_t in_offset = in_channels * sizeof(ae_int32);
10801083
const size_t out_offset = micsel_channels * sizeof(ae_int32);
1081-
const size_t samples_per_chan = size / (sizeof(uint32_t) * micsel_channels);
10821084
ae_int32 *out_ptr;
10831085

10841086
for (ch = 0; ch < micsel_channels; ch++) {
@@ -1100,15 +1102,15 @@ static void kpb_micselect_copy16(struct comp_buffer *sink,
11001102
{
11011103
struct audio_stream *istream = &source->stream;
11021104
struct audio_stream *ostream = &sink->stream;
1103-
1104-
buffer_stream_invalidate(source, size);
11051105
size_t out_samples;
11061106
uint32_t ch;
11071107

11081108
const int16_t *in_data;
11091109
int16_t *out_data;
11101110
const size_t samples_per_chan = size / (sizeof(uint16_t) * micsel_channels);
11111111

1112+
buffer_stream_invalidate(source, samples_per_chan * in_channels * sizeof(uint16_t));
1113+
11121114
for (ch = 0; ch < micsel_channels; ch++) {
11131115
out_samples = 0;
11141116
in_data = audio_stream_get_rptr(istream);
@@ -1132,14 +1134,14 @@ static void kpb_micselect_copy32(struct comp_buffer *sink,
11321134
{
11331135
struct audio_stream *istream = &source->stream;
11341136
struct audio_stream *ostream = &sink->stream;
1135-
1136-
buffer_stream_invalidate(source, size);
11371137
size_t out_samples;
11381138
uint32_t ch;
11391139
const int32_t *in_data;
11401140
int32_t *out_data;
11411141
const size_t samples_per_chan = size / (sizeof(uint32_t) * micsel_channels);
11421142

1143+
buffer_stream_invalidate(source, samples_per_chan * in_channels * sizeof(uint32_t));
1144+
11431145
for (ch = 0; ch < micsel_channels; ch++) {
11441146
out_samples = 0;
11451147
in_data = audio_stream_get_rptr(istream);

0 commit comments

Comments
 (0)