dma-debug: check for sg_call_ents in best-fit algorithm too
Joerg Roedel [Thu, 11 Jun 2009 08:03:42 +0000 (10:03 +0200)]
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>

lib/dma-debug.c

index ad65fc0..c71e2dd 100644 (file)
@@ -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);
        }