dma-debug: check for sg_call_ents in best-fit algorithm too

If we don't check for sg_call_ents the hash_bucket_find function might
still return the wrong dma_debug_entry for sg mappings.

Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
This commit is contained in:
Joerg Roedel 2009-06-11 10:03:42 +02:00
parent 92db1e6af7
commit e5e8c5b90a

View File

@ -262,11 +262,12 @@ static struct dma_debug_entry *hash_bucket_find(struct hash_bucket *bucket,
*/ */
matches += 1; matches += 1;
match_lvl = 0; match_lvl = 0;
entry->size == ref->size ? ++match_lvl : match_lvl; entry->size == ref->size ? ++match_lvl : 0;
entry->type == ref->type ? ++match_lvl : match_lvl; entry->type == ref->type ? ++match_lvl : 0;
entry->direction == ref->direction ? ++match_lvl : match_lvl; entry->direction == ref->direction ? ++match_lvl : 0;
entry->sg_call_ents == ref->sg_call_ents ? ++match_lvl : 0;
if (match_lvl == 3) { if (match_lvl == 4) {
/* perfect-fit - return the result */ /* perfect-fit - return the result */
return entry; return entry;
} else if (match_lvl > last_lvl) { } else if (match_lvl > last_lvl) {
@ -1076,16 +1077,14 @@ void debug_dma_unmap_sg(struct device *dev, struct scatterlist *sglist,
.dev_addr = sg_dma_address(s), .dev_addr = sg_dma_address(s),
.size = sg_dma_len(s), .size = sg_dma_len(s),
.direction = dir, .direction = dir,
.sg_call_ents = 0, .sg_call_ents = nelems,
}; };
if (mapped_ents && i >= mapped_ents) if (mapped_ents && i >= mapped_ents)
break; break;
if (!i) { if (!i)
ref.sg_call_ents = nelems;
mapped_ents = get_nr_mapped_entries(dev, s); mapped_ents = get_nr_mapped_entries(dev, s);
}
check_unmap(&ref); check_unmap(&ref);
} }