All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Williamson <alex.williamson@redhat.com>
To: Jesper Juhl <jj@chaosbits.net>
Cc: linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
	Jesse Barnes <jbarnes@virtuousgeek.org>,
	iommu@lists.linux-foundation.org,
	Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>,
	Shaohua Li <shaohua.li@intel.com>,
	David Woodhouse <dwmw2@infradead.org>
Subject: Re: [PATCH][RFC] Intel IOMMU: get_domain_for_dev() leaks a bit of mem if dmar_find_matched_drhd_unit() fails.
Date: Thu, 10 Feb 2011 09:59:34 -0700	[thread overview]
Message-ID: <1297357174.2963.4.camel@x201> (raw)
In-Reply-To: <alpine.LNX.2.00.1102062102390.13593@swampdragon.chaosbits.net>

On Sun, 2011-02-06 at 21:11 +0100, Jesper Juhl wrote:
> I believe that there's a small memory leak in 
> drivers/pci/intel-iommu.c:get_domain_for_dev().
> 
> If the call to alloc_domain() succeeds but the subsequent call to 
> dmar_find_matched_drhd_unit() fails, then the current code will return 
> NULL without calling domain_exit(domain) which will leak the memory that 
> alloc_domain() allocated.
> 
> The easy fix for that is to simply move the call to alloc_domain() below 
> the call to dmar_find_matched_drhd_unit() since the latter does not depend 
> on the former.
> 
> I also made the change of moving the assignment to local variable 'iommu' 
> below both calls since there is no point in doing that work if either of 
> those those calls fail.
> 
> I also changed the 'return NULL' in the dmar_find_matched_drhd_unit() 
> failure case to a 'goto error' since I figured that if rechecking 
> 'find_domain(pdev)' makes sense after a alloc_domain() failure then it 
> would also make sense after a dmar_find_matched_drhd_unit() failure.

I don't think this change buys us anything.  The goto error here seems
to be a hope that another cpu may have beat us and succeeded at
something we failed.  In the case of matching the pci device to a drhd,
this should be deterministic (unless maybe we're racing a hot added
drhd).  The rest seems fine to me.  Thanks,

Alex

> Patch is only compile tested and I'm not very familliar with this code at 
> all, so please review carefully before applying and please feel free to 
> provide feedback if this patch is somehow not making sense.
> 
> Signed-off-by: Jesper Juhl <jj@chaosbits.net>
> ---
>  intel-iommu.c |   11 +++++------
>  1 file changed, 5 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
> index 4789f8e..dfbdb08 100644
> --- a/drivers/pci/intel-iommu.c
> +++ b/drivers/pci/intel-iommu.c
> @@ -1820,19 +1820,18 @@ static struct dmar_domain *get_domain_for_dev(struct pci_dev *pdev, int gaw)
>  		}
>  	}
>  
> -	domain = alloc_domain();
> -	if (!domain)
> -		goto error;
> -
>  	/* Allocate new domain for the device */
>  	drhd = dmar_find_matched_drhd_unit(pdev);
>  	if (!drhd) {
>  		printk(KERN_ERR "IOMMU: can't find DMAR for device %s\n",
>  			pci_name(pdev));
> -		return NULL;
> +		goto error;
>  	}
> -	iommu = drhd->iommu;
> +	domain = alloc_domain();
> +	if (!domain)
> +		goto error;
>  
> +	iommu = drhd->iommu;
>  	ret = iommu_attach_domain(domain, iommu);
>  	if (ret) {
>  		domain_exit(domain);
> 
> 




  reply	other threads:[~2011-02-10 17:00 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-06 20:11 [PATCH][RFC] Intel IOMMU: get_domain_for_dev() leaks a bit of mem if dmar_find_matched_drhd_unit() fails Jesper Juhl
2011-02-10 16:59 ` Alex Williamson [this message]
2011-02-10 18:17   ` [PATCH] " Jesper Juhl
2011-03-28 20:52     ` Jesper Juhl

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1297357174.2963.4.camel@x201 \
    --to=alex.williamson@redhat.com \
    --cc=anil.s.keshavamurthy@intel.com \
    --cc=dwmw2@infradead.org \
    --cc=iommu@lists.linux-foundation.org \
    --cc=jbarnes@virtuousgeek.org \
    --cc=jj@chaosbits.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=shaohua.li@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.