Merge "msm: ipa3: Fix to unmap sgt pages with correct size"

This commit is contained in:
qctecmdr 2020-08-05 10:59:23 -07:00 committed by Gerrit - the friendly Code Review server
commit 8f0f18d53d
2 changed files with 28 additions and 9 deletions

View File

@ -381,7 +381,7 @@ int ipa_smmu_store_sgt(struct sg_table **out_ch_ptr,
}
memcpy((*out_ch_ptr)->sgl, in_sgt_ptr->sgl,
nents*sizeof((*out_ch_ptr)->sgl));
nents*sizeof(struct scatterlist));
(*out_ch_ptr)->nents = nents;
(*out_ch_ptr)->orig_nents = in_sgt_ptr->orig_nents;
}

View File

@ -433,14 +433,33 @@ int ipa3_smmu_map_peer_buff(u64 iova, u32 size, bool map, struct sg_table *sgt,
}
}
} else {
res = iommu_unmap(smmu_domain,
rounddown(iova, PAGE_SIZE),
roundup(size + iova - rounddown(iova, PAGE_SIZE),
PAGE_SIZE));
if (res != roundup(size + iova - rounddown(iova, PAGE_SIZE),
PAGE_SIZE)) {
IPAERR("Fail to unmap 0x%llx\n", iova);
return -EINVAL;
if (sgt != NULL) {
va = rounddown(iova, PAGE_SIZE);
len = 0;
for_each_sg(sgt->sgl, sg, sgt->nents, i) {
len = PAGE_ALIGN(sg->offset + sg->length);
res = iommu_unmap(smmu_domain, va,
roundup(len, PAGE_SIZE));
if (res !=
roundup(len, PAGE_SIZE)) {
IPAERR("Fail to unmap iova=%llx\n",
iova);
return -EINVAL;
}
va += len;
count++;
}
} else {
res = iommu_unmap(smmu_domain,
rounddown(iova, PAGE_SIZE),
roundup(size + iova -
rounddown(iova, PAGE_SIZE),
PAGE_SIZE));
if (res != roundup(size + iova -
rounddown(iova, PAGE_SIZE), PAGE_SIZE)) {
IPAERR("Fail to unmap 0x%llx\n", iova);
return -EINVAL;
}
}
}
IPADBG("Peer buff %s 0x%llx\n", map ? "map" : "unmap", iova);