Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e5e8c5b9 authored by Joerg Roedel's avatar Joerg Roedel
Browse files

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: default avatarJoerg Roedel <joerg.roedel@amd.com>
parent 92db1e6a
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -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);
	}