Commit d83901e8 authored by Jie Yang's avatar Jie Yang Committed by Mark Brown

ASoC: Intel: Don't change offset of block allocator during fixed allocate

The offset of block allocator, ba->offset, should not be changed during
fixed address allocating, for the caller may treat it as the offset of
allocated memory and use it. In the case that we allocate more than 1
blocks, we should make sure this offset is correct.

Here introduces a temp allocator for the later continuous allocating.
Signed-off-by: default avatarJie Yang <yang.jie@intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 25f97549
...@@ -706,6 +706,7 @@ static int block_alloc_fixed(struct sst_dsp *dsp, struct sst_block_allocator *ba ...@@ -706,6 +706,7 @@ static int block_alloc_fixed(struct sst_dsp *dsp, struct sst_block_allocator *ba
struct list_head *block_list) struct list_head *block_list)
{ {
struct sst_mem_block *block, *tmp; struct sst_mem_block *block, *tmp;
struct sst_block_allocator ba_tmp = *ba;
u32 end = ba->offset + ba->size, block_end; u32 end = ba->offset + ba->size, block_end;
int err; int err;
...@@ -730,9 +731,9 @@ static int block_alloc_fixed(struct sst_dsp *dsp, struct sst_block_allocator *ba ...@@ -730,9 +731,9 @@ static int block_alloc_fixed(struct sst_dsp *dsp, struct sst_block_allocator *ba
if (ba->offset >= block->offset && ba->offset < block_end) { if (ba->offset >= block->offset && ba->offset < block_end) {
/* align ba to block boundary */ /* align ba to block boundary */
ba->size -= block_end - ba->offset; ba_tmp.size -= block_end - ba->offset;
ba->offset = block_end; ba_tmp.offset = block_end;
err = block_alloc_contiguous(dsp, ba, block_list); err = block_alloc_contiguous(dsp, &ba_tmp, block_list);
if (err < 0) if (err < 0)
return -ENOMEM; return -ENOMEM;
...@@ -767,10 +768,10 @@ static int block_alloc_fixed(struct sst_dsp *dsp, struct sst_block_allocator *ba ...@@ -767,10 +768,10 @@ static int block_alloc_fixed(struct sst_dsp *dsp, struct sst_block_allocator *ba
list_move(&block->list, &dsp->used_block_list); list_move(&block->list, &dsp->used_block_list);
list_add(&block->module_list, block_list); list_add(&block->module_list, block_list);
/* align ba to block boundary */ /* align ba to block boundary */
ba->size -= block_end - ba->offset; ba_tmp.size -= block_end - ba->offset;
ba->offset = block_end; ba_tmp.offset = block_end;
err = block_alloc_contiguous(dsp, ba, block_list); err = block_alloc_contiguous(dsp, &ba_tmp, block_list);
if (err < 0) if (err < 0)
return -ENOMEM; return -ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment