From patchwork Fri Jan 16 14:24:05 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 43239 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wg0-f71.google.com (mail-wg0-f71.google.com [74.125.82.71]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 43693240D8 for ; Fri, 16 Jan 2015 14:26:03 +0000 (UTC) Received: by mail-wg0-f71.google.com with SMTP id k14sf11242954wgh.2 for ; Fri, 16 Jan 2015 06:26:02 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id:in-reply-to :references:cc:subject:precedence:list-id:list-unsubscribe:list-post :list-help:list-subscribe:mime-version:content-type :content-transfer-encoding:sender:errors-to:x-original-sender :x-original-authentication-results:mailing-list:list-archive; bh=Yl8C8XmmkM+SkB4B5wFyuFrR56iuEMKccyMUqj+S9kQ=; b=ZfG8OzuGON5AfcnwvMSNcddN360Kc3EuHWjUqx6MkCYcnnmiFI3WzHeFYR+Euyz38/ j1sRIhiDJ23sPcdGE/kfyE7Rkc9xproyYgT8ZOTCNIw6kxR10HNmhnC/PCYSjpeQ1Jko GbxyaeOVjzBAxd3ZYNhGzF2ssHwY+auy5/wHAeUOMDOxxBp1qnH7TOvPM8mFCXRlnr5a iTyzbNeFyx0nffYjlq0WRYt9diPfAZsAVBP0ebI7gZ+lWZvsyzw9HWClSfRnYgPTg2s6 QBnP/crOKXftnATttDolDhuiMBsKB1bXhMqQMQqP6pre8k3D5t6gte9EjExkJunyf744 HQcw== X-Gm-Message-State: ALoCoQlYSrPWbYqM5AZHz5IKg7lq72zkbzNyleWwEAYvRVOg+LOX5NFW91E+UfVbGyGkgErJOqtU X-Received: by 10.152.170.201 with SMTP id ao9mr341796lac.5.1421418362341; Fri, 16 Jan 2015 06:26:02 -0800 (PST) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.36.73 with SMTP id o9ls327238laj.65.gmail; Fri, 16 Jan 2015 06:26:02 -0800 (PST) X-Received: by 10.112.204.233 with SMTP id lb9mr16013816lbc.43.1421418362195; Fri, 16 Jan 2015 06:26:02 -0800 (PST) Received: from mail-la0-f54.google.com (mail-la0-f54.google.com. [209.85.215.54]) by mx.google.com with ESMTPS id je4si3182632lbc.47.2015.01.16.06.26.02 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 16 Jan 2015 06:26:02 -0800 (PST) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.54 as permitted sender) client-ip=209.85.215.54; Received: by mail-la0-f54.google.com with SMTP id pv20so19135877lab.13 for ; Fri, 16 Jan 2015 06:26:02 -0800 (PST) X-Received: by 10.112.30.71 with SMTP id q7mr15942728lbh.41.1421418362022; Fri, 16 Jan 2015 06:26:02 -0800 (PST) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.9.200 with SMTP id c8csp325205lbb; Fri, 16 Jan 2015 06:26:01 -0800 (PST) X-Received: by 10.224.67.132 with SMTP id r4mr25977616qai.1.1421418360656; Fri, 16 Jan 2015 06:26:00 -0800 (PST) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id c13si6060772qaq.105.2015.01.16.06.26.00 (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 16 Jan 2015 06:26:00 -0800 (PST) Received-SPF: none (google.com: xen-devel-bounces@lists.xen.org does not designate permitted sender hosts) client-ip=50.57.142.19; Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1YC7pn-0004QT-KA; Fri, 16 Jan 2015 14:25:11 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1YC7pl-0004N9-LC for xen-devel@lists.xenproject.org; Fri, 16 Jan 2015 14:25:09 +0000 Received: from [85.158.137.68] by server-7.bemta-3.messagelabs.com id 9D/BA-17958-44F19B45; Fri, 16 Jan 2015 14:25:08 +0000 X-Env-Sender: julien.grall@linaro.org X-Msg-Ref: server-12.tower-31.messagelabs.com!1421418308!20071802!1 X-Originating-IP: [74.125.82.170] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 6.12.5; banners=-,-,- X-VirusChecked: Checked Received: (qmail 4699 invoked from network); 16 Jan 2015 14:25:08 -0000 Received: from mail-we0-f170.google.com (HELO mail-we0-f170.google.com) (74.125.82.170) by server-12.tower-31.messagelabs.com with RC4-SHA encrypted SMTP; 16 Jan 2015 14:25:08 -0000 Received: by mail-we0-f170.google.com with SMTP id w61so20556988wes.1 for ; Fri, 16 Jan 2015 06:25:08 -0800 (PST) X-Received: by 10.180.85.35 with SMTP id e3mr6753918wiz.14.1421418307956; Fri, 16 Jan 2015 06:25:07 -0800 (PST) Received: from chilopoda.uk.xensource.com. ([185.25.64.249]) by mx.google.com with ESMTPSA id x6sm6270862wjf.24.2015.01.16.06.25.06 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 16 Jan 2015 06:25:07 -0800 (PST) From: Julien Grall To: xen-devel@lists.xenproject.org Date: Fri, 16 Jan 2015 14:24:05 +0000 Message-Id: <1421418247-30068-11-git-send-email-julien.grall@linaro.org> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1421418247-30068-1-git-send-email-julien.grall@linaro.org> References: <1421418247-30068-1-git-send-email-julien.grall@linaro.org> Cc: ian.campbell@citrix.com, Andreas Herrmann , Julien Grall , tim@xen.org, stefano.stabellini@citrix.com, Andreas Herrmann Subject: [Xen-devel] [PATCH v2 10/12] xen/iommu: smmu: Check for duplicate stream IDs when registering master devices X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Post: , List-Help: , List-Subscribe: , MIME-Version: 1.0 Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: julien.grall@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.54 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Archive: From: Andreas Herrmann If DT information lists one stream ID twice for the master devices of an SMMU this can cause a multi match when stream ID matching is used. For stream ID indexing this might trigger an overwrite of an S2CR that is already in use. So better check for duplicates when DT information is parsed. Taken from the linux ML: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-January/226099.html Cc: Andreas Herrmann Signed-off-by: Andreas Herrmann Signed-off-by: Julien Grall --- xen/drivers/passthrough/arm/smmu.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c index 6cd47b7..bfc1069 100644 --- a/xen/drivers/passthrough/arm/smmu.c +++ b/xen/drivers/passthrough/arm/smmu.c @@ -51,6 +51,9 @@ /* Maximum number of stream IDs assigned to a single device */ #define MAX_MASTER_STREAMIDS MAX_PHANDLE_ARGS +/* Maximum stream ID */ +#define ARM_SMMU_MAX_STREAMID (SZ_64K - 1) + /* Maximum number of context banks per SMMU */ #define ARM_SMMU_MAX_CBS 128 @@ -519,7 +522,8 @@ static int insert_smmu_master(struct arm_smmu_device *smmu, static int register_smmu_master(struct arm_smmu_device *smmu, struct device *dev, - struct of_phandle_args *masterspec) + struct of_phandle_args *masterspec, + unsigned long *smmu_sids) { int i; struct arm_smmu_master *master; @@ -556,6 +560,12 @@ static int register_smmu_master(struct arm_smmu_device *smmu, masterspec->np->name, smmu->num_mapping_groups); return -ERANGE; } + + if (test_and_set_bit(streamid, smmu_sids)) { + dev_err(dev, "duplicate stream ID (%d)\n", streamid); + return -EEXIST; + } + master->cfg.streamids[i] = streamid; } return insert_smmu_master(smmu, master); @@ -1977,6 +1987,7 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct rb_node *node; struct of_phandle_args masterspec; + unsigned long *smmu_sids; int num_irqs, i, err; smmu = devm_kzalloc(dev, sizeof(*smmu), GFP_KERNEL); @@ -2035,20 +2046,30 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev) if (err) return err; + smmu_sids = kzalloc(BITS_TO_LONGS(ARM_SMMU_MAX_STREAMID) * + sizeof(long), GFP_KERNEL); + if (!smmu_sids) { + dev_err(dev, + "failed to allocate bitmap for stream ID tracking\n"); + return -ENOMEM; + } + i = 0; smmu->masters = RB_ROOT; while (!of_parse_phandle_with_args(dev->of_node, "mmu-masters", "#stream-id-cells", i, &masterspec)) { - err = register_smmu_master(smmu, dev, &masterspec); + err = register_smmu_master(smmu, dev, &masterspec, smmu_sids); if (err) { dev_err(dev, "failed to add master %s\n", masterspec.np->name); + kfree(smmu_sids); goto out_put_masters; } i++; } + kfree(smmu_sids); dev_notice(dev, "registered %d master devices\n", i); parse_driver_options(smmu);