From patchwork Tue Dec 4 11:20:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ioana Ciornei X-Patchwork-Id: 10711555 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1016613AF for ; Tue, 4 Dec 2018 11:21:07 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 003E42B306 for ; Tue, 4 Dec 2018 11:21:07 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E85142B591; Tue, 4 Dec 2018 11:21:06 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.7 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,RCVD_IN_SORBS_WEB autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 6143B2B306 for ; Tue, 4 Dec 2018 11:21:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:In-Reply-To:References: Message-ID:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=qSzqWiPvcDLZyN/EubTnMfZwDILUzQfEPYR+Gs2zFAo=; b=I6OUiRMFMkrwLa 6ZbZQZuYwLkMMCF/VV2VTpw6zt4JNBxr4/PiDJmxWnHb16/tu0tF8zev1yzmRBZMB8S4kYZjTMnJO 5bSARo9DuQvjW3VDxTQPGdKEqfwNp4IrV2ywUefrZX33GOv/rErfaNCdgHlAv8REMxLLYigvSYNqB coLreBr5vuPFDJhS6Wz0mwjIScVoUKP98Y5L+lhC96es8qQVX0RkWosiIZoTjt2lmxt4sFK5guYvI tZBgl9M/Wa5e6dixKvGQuPIGqKaxrw70pxumoJocV2ToDDS3YikRzlh6nnHSTgOvacbPEgwx799Dw db4e2tCSnaosTlRF48cg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gU8lD-0002I2-EJ; Tue, 04 Dec 2018 11:21:03 +0000 Received: from mail-eopbgr130042.outbound.protection.outlook.com ([40.107.13.42] helo=EUR01-HE1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gU8kq-0001hi-Qu for linux-arm-kernel@lists.infradead.org; Tue, 04 Dec 2018 11:20:44 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nM6lI+PqhojVE+yCV6szGaLmLOluPZO8zGqWZvq7B0s=; b=XH/ZRFnCeqobaTIO7P/PNNDfIzzw/PSEYsEYWwrI+674DwqgGjBrVuPHpDGL9n05pykiNWs3u6FcvDne1HGJrci8sn+yYS4WEvcJyqoL+XvXwU0BfVTrH7gJwVUAhsotZRB5lPVAxP3HiSlE1454mTH9YjXWImNLFWBCLuMjC0g= Received: from AM5PR0402MB2785.eurprd04.prod.outlook.com (10.175.41.15) by AM5PR0402MB2721.eurprd04.prod.outlook.com (10.175.40.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1382.22; Tue, 4 Dec 2018 11:20:29 +0000 Received: from AM5PR0402MB2785.eurprd04.prod.outlook.com ([fe80::9d72:48b9:59c6:6dfa]) by AM5PR0402MB2785.eurprd04.prod.outlook.com ([fe80::9d72:48b9:59c6:6dfa%4]) with mapi id 15.20.1382.020; Tue, 4 Dec 2018 11:20:29 +0000 From: Ioana Ciornei To: Roy Pledge , Youri Querry , Leo Li Subject: [PATCH v2 2/2] soc: fsl: dpio: use a cpumask to identify which cpus are unused Thread-Topic: [PATCH v2 2/2] soc: fsl: dpio: use a cpumask to identify which cpus are unused Thread-Index: AQHUi8Nc+JCofmNIZU+pIcUraudpTg== Date: Tue, 4 Dec 2018 11:20:29 +0000 Message-ID: <1543922408-22950-3-git-send-email-ioana.ciornei@nxp.com> References: <1543922408-22950-1-git-send-email-ioana.ciornei@nxp.com> In-Reply-To: <1543922408-22950-1-git-send-email-ioana.ciornei@nxp.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: VI1PR07CA0135.eurprd07.prod.outlook.com (2603:10a6:802:16::22) To AM5PR0402MB2785.eurprd04.prod.outlook.com (2603:10a6:203:98::15) authentication-results: spf=none (sender IP is ) smtp.mailfrom=ioana.ciornei@nxp.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [86.34.165.90] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; AM5PR0402MB2721; 6:xiA4lFkg/NqnqU5ztk18wkXcX0Xro+k7ka1Je/BpWGe+7yY6/eWwZrXxVm0Imxwdvooud6Dsdsr+sO33bkiQl+Yx6G2opqtLee0P0pxqxa9TGpY/sv5An4elnpjr1epJCKO76JVb3rFMMoeRW7wlAqVlxaK5EZEx6T1Zzzar6TEocsvAtAfoqqjwAC7sUIvSLvMJe7bobSSs18ApHjR3xQ0XYNt03EKAQxe2OH+6JL1hEmdb4oHN4mds6cyuPs76NfjiRaYdXslr2mWS3o5sI5HQQm8qpMJkVgrg3N4tCZro/KUB6Fklx60HeVnYCYfH8o0XT3cKDrAOIg/QfxDyNlmzRR8kiGgwRSlN6xojf0jeMIH2PfG4QfKVt4BZ3ZBybJKUXhPKuK29z7I3WdQTMX1c8MgGHuUmYpbwohgXiThjEkcgcCdh7P5XJLV4RBozC8beE6VMqwO0eBMKdc6tnQ==; 5:NCRzxjDA+rEa3nGkZ3FjRlCy6SRQCnpWcDvSasXKsNZwmNGInsiWhfgAOIXg9zO08slNQ6zANpzSU6RH5aPrbSGLrj9ZEDOPoVBoGKZMpblzaxgjFbopSToAI4PW+Sy3qvAQOCGVA9nL3+ZV/ktpYLk0R4VW7skGk3hy0b2pBRQ=; 7:/OESKqNc5PRd/x/3Ur0wA6ZZpO4TwQby0gj2ABur1gJkiwl66wzhZqYqKTcYCLNbZ8SzSP8t8s2PjNyV1DgVKufT/7Rzq45mHwU/ajdkkfOGf3UHEk5U+eCz4unOTQCptwMjF/eyREOahUkxjCxwuA== x-ms-office365-filtering-correlation-id: 430eff27-e50b-4c34-baa5-08d659da7f41 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390098)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:AM5PR0402MB2721; x-ms-traffictypediagnostic: AM5PR0402MB2721: x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(93006095)(93001095)(3231455)(999002)(944501493)(52105112)(3002001)(10201501046)(6055026)(148016)(149066)(150057)(6041310)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123560045)(20161123558120)(201708071742011)(7699051)(76991095); SRVR:AM5PR0402MB2721; BCL:0; PCL:0; RULEID:; SRVR:AM5PR0402MB2721; x-forefront-prvs: 0876988AF0 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(346002)(376002)(366004)(39860400002)(136003)(396003)(199004)(189003)(476003)(5660300001)(71190400001)(14444005)(102836004)(25786009)(6436002)(52116002)(71200400001)(66066001)(76176011)(386003)(26005)(7736002)(186003)(68736007)(256004)(6636002)(6486002)(305945005)(99286004)(14454004)(6506007)(110136005)(54906003)(106356001)(105586002)(97736004)(11346002)(486006)(53936002)(478600001)(44832011)(6512007)(6116002)(2616005)(36756003)(4326008)(8676002)(81156014)(3846002)(8936002)(316002)(81166006)(86362001)(446003)(2906002); DIR:OUT; SFP:1101; SCL:1; SRVR:AM5PR0402MB2721; H:AM5PR0402MB2785.eurprd04.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: s37hJVFfyxppVIaVix0bxzVNNM1adQiq5Zln0abjveeSOaXMHHtHOZgpNMe1an4n/dTAeknsRK+rKEhBX8G3lur/HIC/WfamHYWFbaNXgMBV+eVUaFnUUnQ3exNQojt/Jzh5z9ciuFBX47qrT0iR+Rj6PXGbeOs7PpqLglajZBtbkK9loO6g0gE4/GUMeZaH+E7O5rxNM0nzhafPZ3eUd806RnBmj87HZOfg07A7DN00zsfq2ScAl1unusu17Oi6DyVXzlAdSqek88XSAuO8Ff5egiYrnbsdWFgPH2KBhQihX+lP/I7CZANlHiGk02Zke9r0bz5v6FE9ca2wZj/vdZlmkjY/IS8fhz+K682vDTo= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 430eff27-e50b-4c34-baa5-08d659da7f41 X-MS-Exchange-CrossTenant-originalarrivaltime: 04 Dec 2018 11:20:29.5493 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0402MB2721 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20181204_032041_301209_9F09C3B8 X-CRM114-Status: GOOD ( 20.04 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ioana Ciocoi Radulescu , Ioana Ciornei , "linux-kernel@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , Horia Geanta Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP The current implementation of the dpio driver uses a static next_cpu variable to keep track of the index of the next cpu available. This approach does not handle well unbinding and binding dpio devices in a random order. For example, unbinding a dpio and then binding it again with the driver, will generate the below error: $ echo dpio.5 > /sys/bus/fsl-mc/drivers/fsl_mc_dpio/unbind $ echo dpio.5 > /sys/bus/fsl-mc/drivers/fsl_mc_dpio/bind [ 103.946380] fsl_mc_dpio dpio.5: probe failed. Number of DPIOs exceeds NR_CPUS. [ 103.955157] fsl_mc_dpio dpio.5: fsl_mc_driver_probe failed: -34 -bash: echo: write error: No such device Fix this error by keeping a global cpumask of unused cpus that will be updated at every dpaa2_dpio_[probe,remove]. Signed-off-by: Ioana Ciornei --- Changes in v2: - added kernel-doc comment to the dpaa2_io_get_cpu function drivers/soc/fsl/dpio/dpio-driver.c | 25 ++++++++++++++++--------- drivers/soc/fsl/dpio/dpio-service.c | 13 +++++++++++++ include/soc/fsl/dpaa2-io.h | 2 ++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/drivers/soc/fsl/dpio/dpio-driver.c b/drivers/soc/fsl/dpio/dpio-driver.c index e58fcc9..832175c 100644 --- a/drivers/soc/fsl/dpio/dpio-driver.c +++ b/drivers/soc/fsl/dpio/dpio-driver.c @@ -30,6 +30,8 @@ struct dpio_priv { struct dpaa2_io *io; }; +static cpumask_var_t cpus_unused_mask; + static irqreturn_t dpio_irq_handler(int irq_num, void *arg) { struct device *dev = (struct device *)arg; @@ -86,7 +88,7 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) struct dpio_priv *priv; int err = -ENOMEM; struct device *dev = &dpio_dev->dev; - static int next_cpu = -1; + int possible_next_cpu; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) @@ -128,17 +130,14 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) desc.dpio_id = dpio_dev->obj_desc.id; /* get the cpu to use for the affinity hint */ - if (next_cpu == -1) - next_cpu = cpumask_first(cpu_online_mask); - else - next_cpu = cpumask_next(next_cpu, cpu_online_mask); - - if (!cpu_possible(next_cpu)) { + possible_next_cpu = cpumask_first(cpus_unused_mask); + if (possible_next_cpu >= nr_cpu_ids) { dev_err(dev, "probe failed. Number of DPIOs exceeds NR_CPUS.\n"); err = -ERANGE; goto err_allocate_irqs; } - desc.cpu = next_cpu; + desc.cpu = possible_next_cpu; + cpumask_clear_cpu(possible_next_cpu, cpus_unused_mask); /* * Set the CENA regs to be the cache inhibited area of the portal to @@ -211,7 +210,7 @@ static int dpaa2_dpio_remove(struct fsl_mc_device *dpio_dev) { struct device *dev; struct dpio_priv *priv; - int err; + int err = 0, cpu; dev = &dpio_dev->dev; priv = dev_get_drvdata(dev); @@ -220,6 +219,9 @@ static int dpaa2_dpio_remove(struct fsl_mc_device *dpio_dev) dpio_teardown_irqs(dpio_dev); + cpu = dpaa2_io_get_cpu(priv->io); + cpumask_set_cpu(cpu, cpus_unused_mask); + err = fsl_mc_portal_allocate(dpio_dev, 0, &dpio_dev->mc_io); if (err) { dev_err(dev, "MC portal allocation failed\n"); @@ -267,11 +269,16 @@ static int dpaa2_dpio_remove(struct fsl_mc_device *dpio_dev) static int dpio_driver_init(void) { + if (!zalloc_cpumask_var(&cpus_unused_mask, GFP_KERNEL)) + return -ENOMEM; + cpumask_copy(cpus_unused_mask, cpu_online_mask); + return fsl_mc_driver_register(&dpaa2_dpio_driver); } static void dpio_driver_exit(void) { + free_cpumask_var(cpus_unused_mask); fsl_mc_driver_unregister(&dpaa2_dpio_driver); } module_init(dpio_driver_init); diff --git a/drivers/soc/fsl/dpio/dpio-service.c b/drivers/soc/fsl/dpio/dpio-service.c index 21c3e32..3b60258 100644 --- a/drivers/soc/fsl/dpio/dpio-service.c +++ b/drivers/soc/fsl/dpio/dpio-service.c @@ -215,6 +215,19 @@ irqreturn_t dpaa2_io_irq(struct dpaa2_io *obj) } /** + * dpaa2_io_get_cpu() - get the cpu associated with a given DPIO object + * + * @d: the given DPIO object. + * + * Return the cpu associated with the DPIO object + */ +int dpaa2_io_get_cpu(struct dpaa2_io *d) +{ + return d->dpio_desc.cpu; +} +EXPORT_SYMBOL(dpaa2_io_get_cpu); + +/** * dpaa2_io_service_register() - Prepare for servicing of FQDAN or CDAN * notifications on the given DPIO service. * @d: the given DPIO service. diff --git a/include/soc/fsl/dpaa2-io.h b/include/soc/fsl/dpaa2-io.h index ab51e40..1c1764f 100644 --- a/include/soc/fsl/dpaa2-io.h +++ b/include/soc/fsl/dpaa2-io.h @@ -90,6 +90,8 @@ struct dpaa2_io_notification_ctx { void *dpio_private; }; +int dpaa2_io_get_cpu(struct dpaa2_io *d); + int dpaa2_io_service_register(struct dpaa2_io *service, struct dpaa2_io_notification_ctx *ctx); void dpaa2_io_service_deregister(struct dpaa2_io *service,