From: Laurent Pinchart <laurent.pinchart-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org>
To: Joerg Roedel <joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
Cc: iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linux-sh-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH] iommu/ipmmu-vmsa: Fix IOMMU lookup when multiple IOMMUs are registered
Date: Wed, 28 Jan 2015 10:40:32 +0200 [thread overview]
Message-ID: <1937580.GPTjQ28sbs@avalon> (raw)
In-Reply-To: <1422134030-11121-1-git-send-email-laurent.pinchart+renesas-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org>
Hi Joerg,
Could you please pick this patch up for v3.20 ?
On Saturday 24 January 2015 23:13:50 Laurent Pinchart wrote:
> When adding a new device the driver loops over all registered IOMMUs and
> calls the ipmmu_find_utlbs() function to parse the DT iommus attribute.
> The function returns an error when the IOMMU referenced in DT doesn't
> match the current IOMMU. The caller incorrectly breaks from the loop
> immediately when the error is reported, resulting in only the first
> IOMMU being considered.
>
> Fix this, and while at it move code that isn't specific to an IOMMU
> instance out of the loop.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org>
> ---
> drivers/iommu/ipmmu-vmsa.c | 49 +++++++++++++++++++------------------------
> 1 file changed, 21 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c
> index 791c3daec7c0..407324132587 100644
> --- a/drivers/iommu/ipmmu-vmsa.c
> +++ b/drivers/iommu/ipmmu-vmsa.c
> @@ -1007,45 +1007,28 @@ static phys_addr_t ipmmu_iova_to_phys(struct
> iommu_domain *io_domain, }
>
> static int ipmmu_find_utlbs(struct ipmmu_vmsa_device *mmu, struct device
> *dev, - unsigned int **_utlbs)
> + unsigned int *utlbs, unsigned int num_utlbs)
> {
> - unsigned int *utlbs;
> unsigned int i;
> - int count;
> -
> - count = of_count_phandle_with_args(dev->of_node, "iommus",
> - "#iommu-cells");
> - if (count < 0)
> - return -EINVAL;
> -
> - utlbs = kcalloc(count, sizeof(*utlbs), GFP_KERNEL);
> - if (!utlbs)
> - return -ENOMEM;
>
> - for (i = 0; i < count; ++i) {
> + for (i = 0; i < num_utlbs; ++i) {
> struct of_phandle_args args;
> int ret;
>
> ret = of_parse_phandle_with_args(dev->of_node, "iommus",
> "#iommu-cells", i, &args);
> if (ret < 0)
> - goto error;
> + return ret;
>
> of_node_put(args.np);
>
> if (args.np != mmu->dev->of_node || args.args_count != 1)
> - goto error;
> + return -EINVAL;
>
> utlbs[i] = args.args[0];
> }
>
> - *_utlbs = utlbs;
> -
> - return count;
> -
> -error:
> - kfree(utlbs);
> - return -EINVAL;
> + return 0;
> }
>
> static int ipmmu_add_device(struct device *dev)
> @@ -1053,10 +1036,10 @@ static int ipmmu_add_device(struct device *dev)
> struct ipmmu_vmsa_archdata *archdata;
> struct ipmmu_vmsa_device *mmu;
> struct iommu_group *group = NULL;
> - unsigned int *utlbs = NULL;
> + unsigned int *utlbs;
> unsigned int i;
> - int num_utlbs = 0;
> - int ret;
> + int num_utlbs;
> + int ret = -ENODEV;
>
> if (dev->archdata.iommu) {
> dev_warn(dev, "IOMMU driver already assigned to device %s\n",
> @@ -1065,11 +1048,21 @@ static int ipmmu_add_device(struct device *dev)
> }
>
> /* Find the master corresponding to the device. */
> +
> + num_utlbs = of_count_phandle_with_args(dev->of_node, "iommus",
> + "#iommu-cells");
> + if (num_utlbs < 0)
> + return -ENODEV;
> +
> + utlbs = kcalloc(num_utlbs, sizeof(*utlbs), GFP_KERNEL);
> + if (!utlbs)
> + return -ENOMEM;
> +
> spin_lock(&ipmmu_devices_lock);
>
> list_for_each_entry(mmu, &ipmmu_devices, list) {
> - num_utlbs = ipmmu_find_utlbs(mmu, dev, &utlbs);
> - if (num_utlbs) {
> + ret = ipmmu_find_utlbs(mmu, dev, utlbs, num_utlbs);
> + if (!ret) {
> /*
> * TODO Take a reference to the MMU to protect
> * against device removal.
> @@ -1080,7 +1073,7 @@ static int ipmmu_add_device(struct device *dev)
>
> spin_unlock(&ipmmu_devices_lock);
>
> - if (num_utlbs <= 0)
> + if (ret < 0)
> return -ENODEV;
>
> for (i = 0; i < num_utlbs; ++i) {
--
Regards,
Laurent Pinchart
WARNING: multiple messages have this Message-ID (diff)
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Joerg Roedel <joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
Cc: iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linux-sh-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH] iommu/ipmmu-vmsa: Fix IOMMU lookup when multiple IOMMUs are registered
Date: Wed, 28 Jan 2015 08:40:32 +0000 [thread overview]
Message-ID: <1937580.GPTjQ28sbs@avalon> (raw)
In-Reply-To: <1422134030-11121-1-git-send-email-laurent.pinchart+renesas-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org>
Hi Joerg,
Could you please pick this patch up for v3.20 ?
On Saturday 24 January 2015 23:13:50 Laurent Pinchart wrote:
> When adding a new device the driver loops over all registered IOMMUs and
> calls the ipmmu_find_utlbs() function to parse the DT iommus attribute.
> The function returns an error when the IOMMU referenced in DT doesn't
> match the current IOMMU. The caller incorrectly breaks from the loop
> immediately when the error is reported, resulting in only the first
> IOMMU being considered.
>
> Fix this, and while at it move code that isn't specific to an IOMMU
> instance out of the loop.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> ---
> drivers/iommu/ipmmu-vmsa.c | 49 +++++++++++++++++++------------------------
> 1 file changed, 21 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c
> index 791c3daec7c0..407324132587 100644
> --- a/drivers/iommu/ipmmu-vmsa.c
> +++ b/drivers/iommu/ipmmu-vmsa.c
> @@ -1007,45 +1007,28 @@ static phys_addr_t ipmmu_iova_to_phys(struct
> iommu_domain *io_domain, }
>
> static int ipmmu_find_utlbs(struct ipmmu_vmsa_device *mmu, struct device
> *dev, - unsigned int **_utlbs)
> + unsigned int *utlbs, unsigned int num_utlbs)
> {
> - unsigned int *utlbs;
> unsigned int i;
> - int count;
> -
> - count = of_count_phandle_with_args(dev->of_node, "iommus",
> - "#iommu-cells");
> - if (count < 0)
> - return -EINVAL;
> -
> - utlbs = kcalloc(count, sizeof(*utlbs), GFP_KERNEL);
> - if (!utlbs)
> - return -ENOMEM;
>
> - for (i = 0; i < count; ++i) {
> + for (i = 0; i < num_utlbs; ++i) {
> struct of_phandle_args args;
> int ret;
>
> ret = of_parse_phandle_with_args(dev->of_node, "iommus",
> "#iommu-cells", i, &args);
> if (ret < 0)
> - goto error;
> + return ret;
>
> of_node_put(args.np);
>
> if (args.np != mmu->dev->of_node || args.args_count != 1)
> - goto error;
> + return -EINVAL;
>
> utlbs[i] = args.args[0];
> }
>
> - *_utlbs = utlbs;
> -
> - return count;
> -
> -error:
> - kfree(utlbs);
> - return -EINVAL;
> + return 0;
> }
>
> static int ipmmu_add_device(struct device *dev)
> @@ -1053,10 +1036,10 @@ static int ipmmu_add_device(struct device *dev)
> struct ipmmu_vmsa_archdata *archdata;
> struct ipmmu_vmsa_device *mmu;
> struct iommu_group *group = NULL;
> - unsigned int *utlbs = NULL;
> + unsigned int *utlbs;
> unsigned int i;
> - int num_utlbs = 0;
> - int ret;
> + int num_utlbs;
> + int ret = -ENODEV;
>
> if (dev->archdata.iommu) {
> dev_warn(dev, "IOMMU driver already assigned to device %s\n",
> @@ -1065,11 +1048,21 @@ static int ipmmu_add_device(struct device *dev)
> }
>
> /* Find the master corresponding to the device. */
> +
> + num_utlbs = of_count_phandle_with_args(dev->of_node, "iommus",
> + "#iommu-cells");
> + if (num_utlbs < 0)
> + return -ENODEV;
> +
> + utlbs = kcalloc(num_utlbs, sizeof(*utlbs), GFP_KERNEL);
> + if (!utlbs)
> + return -ENOMEM;
> +
> spin_lock(&ipmmu_devices_lock);
>
> list_for_each_entry(mmu, &ipmmu_devices, list) {
> - num_utlbs = ipmmu_find_utlbs(mmu, dev, &utlbs);
> - if (num_utlbs) {
> + ret = ipmmu_find_utlbs(mmu, dev, utlbs, num_utlbs);
> + if (!ret) {
> /*
> * TODO Take a reference to the MMU to protect
> * against device removal.
> @@ -1080,7 +1073,7 @@ static int ipmmu_add_device(struct device *dev)
>
> spin_unlock(&ipmmu_devices_lock);
>
> - if (num_utlbs <= 0)
> + if (ret < 0)
> return -ENODEV;
>
> for (i = 0; i < num_utlbs; ++i) {
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2015-01-28 8:40 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-24 21:13 [PATCH] iommu/ipmmu-vmsa: Fix IOMMU lookup when multiple IOMMUs are registered Laurent Pinchart
2015-01-24 21:13 ` Laurent Pinchart
[not found] ` <1422134030-11121-1-git-send-email-laurent.pinchart+renesas-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org>
2015-01-28 8:40 ` Laurent Pinchart [this message]
2015-01-28 8:40 ` Laurent Pinchart
2015-01-30 12:48 ` Joerg Roedel
2015-01-30 12:48 ` Joerg Roedel
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=1937580.GPTjQ28sbs@avalon \
--to=laurent.pinchart-rylnwiuwjnjg/c1bvhzhaw@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org \
--cc=linux-sh-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
/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.