From patchwork Fri Jan 30 18:49:25 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 44057 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-lb0-f198.google.com (mail-lb0-f198.google.com [209.85.217.198]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id B4F4F20CA8 for ; Fri, 30 Jan 2015 18:52:37 +0000 (UTC) Received: by mail-lb0-f198.google.com with SMTP id l4sf2822939lbv.1 for ; Fri, 30 Jan 2015 10:52:36 -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=S0djCWKfKJwh/6WJwRGNnwoL4yX0Xrs6XVQlTpppdis=; b=N9UlQook06qbqe2fxD03sVzTlsoiD9kwzabrBjOIlT6nGpmj9AAFl4Zc4XlvGIk8CF 6LKhBeu1wPN4m+5uXiMWUPbY9fDL+WqFMdjl/jvlOp1UWtEUWjOOw60qjcoGhGpQmDeZ OG9D89LwyR+2MX1IserIPvIshGV9Ur7Hdf0wTZId+8M4R64UFykTUvsXobX63GQVIjKJ C0JkUwyUUuMBUE3vhZw1ipwOhnIGUjzboDBEBI6J6P46Svt0WzGPbn7N53eUNORABW7Y opyEyb5Pv/X39+FFP9N7wCT+cFU+gwdlj3IzjH/A2BYBZRqQlmF+qfCH4vM7am6pUagM 23Iw== X-Gm-Message-State: ALoCoQnnufn8XEovP7kVYR4tT6wRR1zN/O/KwIw2qePXLp5cwAuoxqmzuaDzgKilncU4cp2EM8GW X-Received: by 10.112.161.201 with SMTP id xu9mr1046606lbb.11.1422643956700; Fri, 30 Jan 2015 10:52:36 -0800 (PST) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.25.134 with SMTP id c6ls431631lag.103.gmail; Fri, 30 Jan 2015 10:52:36 -0800 (PST) X-Received: by 10.112.162.167 with SMTP id yb7mr8232527lbb.76.1422643956297; Fri, 30 Jan 2015 10:52:36 -0800 (PST) Received: from mail-lb0-f175.google.com (mail-lb0-f175.google.com. [209.85.217.175]) by mx.google.com with ESMTPS id o4si10760223lbc.57.2015.01.30.10.52.36 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 30 Jan 2015 10:52:36 -0800 (PST) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.175 as permitted sender) client-ip=209.85.217.175; Received: by mail-lb0-f175.google.com with SMTP id 10so37853688lbg.6 for ; Fri, 30 Jan 2015 10:52:36 -0800 (PST) X-Received: by 10.152.5.226 with SMTP id v2mr8106522lav.34.1422643955998; Fri, 30 Jan 2015 10:52:35 -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.35.133 with SMTP id h5csp377826lbj; Fri, 30 Jan 2015 10:52:35 -0800 (PST) X-Received: by 10.220.84.138 with SMTP id j10mr3991999vcl.45.1422643951539; Fri, 30 Jan 2015 10:52:31 -0800 (PST) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id ag6si1783405vdd.6.2015.01.30.10.52.30 (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 30 Jan 2015 10:52:31 -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 1YHGe4-0007G6-1c; Fri, 30 Jan 2015 18:50:20 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1YHGe0-0007FD-O5 for xen-devel@lists.xenproject.org; Fri, 30 Jan 2015 18:50:16 +0000 Received: from [85.158.139.211] by server-15.bemta-5.messagelabs.com id 86/50-02758-762DBC45; Fri, 30 Jan 2015 18:50:15 +0000 X-Env-Sender: julien.grall@linaro.org X-Msg-Ref: server-13.tower-206.messagelabs.com!1422643814!11419428!1 X-Originating-IP: [74.125.82.54] 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 12816 invoked from network); 30 Jan 2015 18:50:14 -0000 Received: from mail-wg0-f54.google.com (HELO mail-wg0-f54.google.com) (74.125.82.54) by server-13.tower-206.messagelabs.com with RC4-SHA encrypted SMTP; 30 Jan 2015 18:50:14 -0000 Received: by mail-wg0-f54.google.com with SMTP id b13so28390153wgh.13 for ; Fri, 30 Jan 2015 10:50:14 -0800 (PST) X-Received: by 10.181.29.201 with SMTP id jy9mr191068wid.17.1422643814625; Fri, 30 Jan 2015 10:50:14 -0800 (PST) Received: from chilopoda.uk.xensource.com. ([185.25.64.249]) by mx.google.com with ESMTPSA id n1sm169040wib.11.2015.01.30.10.50.12 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 30 Jan 2015 10:50:13 -0800 (PST) From: Julien Grall To: xen-devel@lists.xenproject.org Date: Fri, 30 Jan 2015 18:49:25 +0000 Message-Id: <1422643768-23614-11-git-send-email-julien.grall@linaro.org> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1422643768-23614-1-git-send-email-julien.grall@linaro.org> References: <1422643768-23614-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 v3 10/13] 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.217.175 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 --- This patch was sent on Linux ML back to January 2014. It has never been pushed upstream as the only use was for Calxeda. Note that SMMU bindings for Calxeda is not upstreamed. --- 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);