提交 f43aa025 编写于 作者: T Takashi Iwai

ALSA: hda - Fix another cache list management

Fix another silly bug in the amp cache list management.
Signed-off-by: NTakashi Iwai <tiwai@suse.de>
上级 0edb9454
...@@ -887,11 +887,10 @@ static struct hda_cache_head *get_alloc_hash(struct hda_cache_rec *cache, ...@@ -887,11 +887,10 @@ static struct hda_cache_head *get_alloc_hash(struct hda_cache_rec *cache,
{ {
u16 idx = key % (u16)ARRAY_SIZE(cache->hash); u16 idx = key % (u16)ARRAY_SIZE(cache->hash);
u16 cur = cache->hash[idx]; u16 cur = cache->hash[idx];
struct hda_cache_head *info_head = cache->buf.list;
struct hda_cache_head *info; struct hda_cache_head *info;
while (cur != 0xffff) { while (cur != 0xffff) {
info = &info_head[cur]; info = snd_array_elem(&cache->buf, cur);
if (info->key == key) if (info->key == key)
return info; return info;
cur = info->next; cur = info->next;
...@@ -901,7 +900,7 @@ static struct hda_cache_head *get_alloc_hash(struct hda_cache_rec *cache, ...@@ -901,7 +900,7 @@ static struct hda_cache_head *get_alloc_hash(struct hda_cache_rec *cache,
info = snd_array_new(&cache->buf); info = snd_array_new(&cache->buf);
if (!info) if (!info)
return NULL; return NULL;
cur = cache->buf.used - 1; /* the last entry */ cur = snd_array_index(&cache->buf, info);
info->key = key; info->key = key;
info->val = 0; info->val = 0;
info->next = cache->hash[idx]; info->next = cache->hash[idx];
...@@ -3414,7 +3413,7 @@ void *snd_array_new(struct snd_array *array) ...@@ -3414,7 +3413,7 @@ void *snd_array_new(struct snd_array *array)
array->list = nlist; array->list = nlist;
array->alloced = num; array->alloced = num;
} }
return array->list + (array->used++ * array->elem_size); return snd_array_elem(array, array->used++);
} }
/* free the given array elements */ /* free the given array elements */
......
...@@ -539,6 +539,16 @@ static inline void snd_array_init(struct snd_array *array, unsigned int size, ...@@ -539,6 +539,16 @@ static inline void snd_array_init(struct snd_array *array, unsigned int size,
array->alloc_align = align; array->alloc_align = align;
} }
static inline void *snd_array_elem(struct snd_array *array, unsigned int idx)
{
return array->list + idx * array->elem_size;
}
static inline unsigned int snd_array_index(struct snd_array *array, void *ptr)
{
return (unsigned long)(ptr - array->list) / array->elem_size;
}
/* /*
* Structures * Structures
*/ */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册