|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Ping: [PATCH v6] dmar: device scope mem leak fix
----- Original Message -----
From: JBeulich@xxxxxxxx
To: kevin.tian@xxxxxxxxx, yang.z.zhang@xxxxxxxxx
Cc: xen-devel@xxxxxxxxxxxxx, boris.ostrovsky@xxxxxxxxxx,
elena.ufimtseva@xxxxxxxxxx, konrad.wilk@xxxxxxxxxx, tim@xxxxxxx
Sent: Monday, July 13, 2015 12:18:33 PM GMT -05:00 US/Canada Eastern
Subject: Ping: [PATCH v6] dmar: device scope mem leak fix
>>> On 07.07.15 at 17:17, <elena.ufimtseva@xxxxxxxxxx> wrote:
> From: Elena Ufimtseva <elena.ufimtseva@xxxxxxxxxx>
>
> Release memory allocated for scope.devices dmar units on various
> failure paths and when disabling dmar. Set device count after
> successful memory allocation, not before, in device scope parsing function.
>
> Signed-off-by: Elena Ufimtseva <elena.ufimtseva@xxxxxxxxxx>
> ---
> Changes in v6:
>
> - eliminated unrelated code move;
>
> - fix introduces in v5 memory leak;
>
>
>
> Changes in v5;
>
> - make scope_devices_free actually safe;
>
>
>
> Changes in v4:
>
> - make scope_devices_free safe to call with NULL scope pointer;
>
> - since scope_devices_free is safe to call, use it in failure path
>
> in acpi_parse_one_drhd;
>
>
>
> Changes in v3:
>
> - make freeing memory for scope devices and zeroing device counter
>
> as a function;
>
> - make sure parse_one_rmrr has memory leak fix in this patch;
>
> - make sure ret values are not lost acpi_parse_one_drhd;
>
>
>
> Changes in v2:
>
> - release memory for devices scope on error paths in acpi_parse_one_drhd
>
> and acpi_parse_one_atsr and set the count to zero;
>
> xen/drivers/passthrough/vtd/dmar.c | 24 ++++++++++++++++++++++--
> 1 file changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/xen/drivers/passthrough/vtd/dmar.c
> b/xen/drivers/passthrough/vtd/dmar.c
> index 2b07be9..8ed1e24 100644
> --- a/xen/drivers/passthrough/vtd/dmar.c
> +++ b/xen/drivers/passthrough/vtd/dmar.c
> @@ -81,6 +81,15 @@ static int __init acpi_register_rmrr_unit(struct
> acpi_rmrr_unit *rmrr)
> return 0;
> }
>
> +static void scope_devices_free(struct dmar_scope *scope)
> +{
> + if ( !scope )
> + return;
> +
> + scope->devices_cnt = 0;
> + xfree(scope->devices);
> +}
> +
> static void __init disable_all_dmar_units(void)
> {
> struct acpi_drhd_unit *drhd, *_drhd;
> @@ -90,16 +99,19 @@ static void __init disable_all_dmar_units(void)
> list_for_each_entry_safe ( drhd, _drhd, &acpi_drhd_units, list )
> {
> list_del(&drhd->list);
> + scope_devices_free(&drhd->scope);
> xfree(drhd);
> }
> list_for_each_entry_safe ( rmrr, _rmrr, &acpi_rmrr_units, list )
> {
> list_del(&rmrr->list);
> + scope_devices_free(&rmrr->scope);
> xfree(rmrr);
> }
> list_for_each_entry_safe ( atsr, _atsr, &acpi_atsr_units, list )
> {
> list_del(&atsr->list);
> + scope_devices_free(&atsr->scope);
> xfree(atsr);
> }
> }
> @@ -318,13 +330,13 @@ static int __init acpi_parse_dev_scope(
> if ( (cnt = scope_device_count(start, end)) < 0 )
> return cnt;
>
> - scope->devices_cnt = cnt;
> if ( cnt > 0 )
> {
> scope->devices = xzalloc_array(u16, cnt);
> if ( !scope->devices )
> return -ENOMEM;
> }
> + scope->devices_cnt = cnt;
>
> while ( start < end )
> {
> @@ -427,7 +439,7 @@ static int __init acpi_parse_dev_scope(
>
> out:
> if ( ret )
> - xfree(scope->devices);
> + scope_devices_free(scope);
>
> return ret;
> }
> @@ -542,6 +554,7 @@ acpi_parse_one_drhd(struct acpi_dmar_header *header)
> " Workaround BIOS bug: ignore the DRHD due to all "
> "devices under its scope are not PCI discoverable!\n");
>
> + scope_devices_free(&dmaru->scope);
> iommu_free(dmaru);
> xfree(dmaru);
> }
> @@ -562,9 +575,11 @@ acpi_parse_one_drhd(struct acpi_dmar_header *header)
> out:
> if ( ret )
> {
> + scope_devices_free(&dmaru->scope);
> iommu_free(dmaru);
> xfree(dmaru);
> }
> +
> return ret;
> }
>
> @@ -658,6 +673,7 @@ acpi_parse_one_rmrr(struct acpi_dmar_header *header)
> " Ignore the RMRR (%"PRIx64", %"PRIx64") due to "
> "devices under its scope are not PCI discoverable!\n",
> rmrru->base_address, rmrru->end_address);
> + scope_devices_free(&rmrru->scope);
> xfree(rmrru);
> }
> else if ( base_addr > end_addr )
> @@ -665,6 +681,7 @@ acpi_parse_one_rmrr(struct acpi_dmar_header *header)
> dprintk(XENLOG_WARNING VTDPREFIX,
> " The RMRR (%"PRIx64", %"PRIx64") is incorrect!\n",
> rmrru->base_address, rmrru->end_address);
> + scope_devices_free(&rmrru->scope);
> xfree(rmrru);
> ret = -EFAULT;
> }
> @@ -727,7 +744,10 @@ acpi_parse_one_atsr(struct acpi_dmar_header *header)
> }
>
> if ( ret )
> + {
> + scope_devices_free(&atsru->scope);
> xfree(atsru);
> + }
> else
> acpi_register_atsr_unit(atsru);
> return ret;
> --
> 2.1.3
On its way Jan!
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |