diff options
author | Joerg Roedel <joerg.roedel@amd.com> | 2009-06-11 10:03:42 +0200 |
---|---|---|
committer | Joerg Roedel <joerg.roedel@amd.com> | 2009-06-15 11:08:54 +0200 |
commit | e5e8c5b90a1ae249930fcf7403f3757686cf1a7b (patch) | |
tree | ce562ec0d0a9ffed4d16bd5569d21cd8ed222096 /lib/dma-debug.c | |
parent | 92db1e6af747faa129e236d68386af26a0efc12b (diff) | |
download | lwn-e5e8c5b90a1ae249930fcf7403f3757686cf1a7b.tar.gz lwn-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>
Diffstat (limited to 'lib/dma-debug.c')
-rw-r--r-- | lib/dma-debug.c | 15 |
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); } |