summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Roedel <joerg.roedel@amd.com>2009-06-11 10:03:42 +0200
committerJoerg Roedel <joerg.roedel@amd.com>2009-06-15 11:08:54 +0200
commite5e8c5b90a1ae249930fcf7403f3757686cf1a7b (patch)
treece562ec0d0a9ffed4d16bd5569d21cd8ed222096
parent92db1e6af747faa129e236d68386af26a0efc12b (diff)
downloadlinux-e5e8c5b90a1ae249930fcf7403f3757686cf1a7b.tar.gz
linux-e5e8c5b90a1ae249930fcf7403f3757686cf1a7b.tar.bz2
linux-e5e8c5b90a1ae249930fcf7403f3757686cf1a7b.zip
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>
-rw-r--r--lib/dma-debug.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/lib/dma-debug.c b/lib/dma-debug.c
index ad65fc0317d9..c71e2dd2750f 100644
--- a/lib/dma-debug.c
+++ b/lib/dma-debug.c
@@ -262,11 +262,12 @@ static struct dma_debug_entry *hash_bucket_find(struct hash_bucket *bucket,
*/
matches += 1;
match_lvl = 0;
- entry->size == ref->size ? ++match_lvl : match_lvl;
- entry->type == ref->type ? ++match_lvl : match_lvl;
- entry->direction == ref->direction ? ++match_lvl : match_lvl;
+ entry->size == ref->size ? ++match_lvl : 0;
+ entry->type == ref->type ? ++match_lvl : 0;
+ 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 */
return entry;
} 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),
.size = sg_dma_len(s),
.direction = dir,
- .sg_call_ents = 0,
+ .sg_call_ents = nelems,
};
if (mapped_ents && i >= mapped_ents)
break;
- if (!i) {
- ref.sg_call_ents = nelems;
+ if (!i)
mapped_ents = get_nr_mapped_entries(dev, s);
- }
check_unmap(&ref);
}