|
@@ -533,12 +533,17 @@ static void privcmd_close(struct vm_area_struct *vma)
|
|
|
{
|
|
|
struct page **pages = vma->vm_private_data;
|
|
|
int numpgs = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
|
|
|
+ int rc;
|
|
|
|
|
|
if (!xen_feature(XENFEAT_auto_translated_physmap) || !numpgs || !pages)
|
|
|
return;
|
|
|
|
|
|
- xen_unmap_domain_mfn_range(vma, numpgs, pages);
|
|
|
- free_xenballooned_pages(numpgs, pages);
|
|
|
+ rc = xen_unmap_domain_mfn_range(vma, numpgs, pages);
|
|
|
+ if (rc == 0)
|
|
|
+ free_xenballooned_pages(numpgs, pages);
|
|
|
+ else
|
|
|
+ pr_crit("unable to unmap MFN range: leaking %d pages. rc=%d\n",
|
|
|
+ numpgs, rc);
|
|
|
kfree(pages);
|
|
|
}
|
|
|
|