From patchwork Sun Jul 7 05:14:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kousik Sanagavarapu X-Patchwork-Id: 13725971 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2C29FC30653 for ; Sun, 7 Jul 2024 05:55:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=PkYP94kjr/8aPWc+0tv0/ZqO8o4iHRZmdZ252DF4P2Y=; b=4iZw63M4Q9lME5T6OEv7AyThyu c683BHA3uECMQkMCZLIjaHwvl3ghvxfbAxczBR5AzbpKOmHgwkTU9H0JbpsVI8ChPB2kHomJ0b9NY +QWojg8vsePxELLslGZfBBMqZcFc/hxhKZTPZFzpBC+5RMgxXA0ytNqUEO5QylGVMmpoz63RsRT7p OWbF43gnyGCfQGfddEhem9RVwH8VEEuAwy7bT2TNTSGEF4JSZKYrZjJVzE2urhsphGL43KKRI/prA vYJ2ZkZvq4xxyPW6r2Cg/VaVFhZbA2PED56kIEZ9rfNR7aB8JQLYCiGQ4oJJk5VmZFpcyd6qe1+l6 nxhUXl4w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sQKrM-00000001OLb-09YW; Sun, 07 Jul 2024 05:54:52 +0000 Received: from mail-oa1-x29.google.com ([2001:4860:4864:20::29]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sQKqo-00000001O8A-0KB4 for linux-arm-kernel@lists.infradead.org; Sun, 07 Jul 2024 05:54:19 +0000 Received: by mail-oa1-x29.google.com with SMTP id 586e51a60fabf-25e397c51b2so1321438fac.3 for ; Sat, 06 Jul 2024 22:54:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720331656; x=1720936456; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=PkYP94kjr/8aPWc+0tv0/ZqO8o4iHRZmdZ252DF4P2Y=; b=TzXnkQHGHR8WIXQMA2hPgOyDXz3aWtUHpCn2ETYI4cL7qPZbWWxZl7ii8VK8D4tTyg nhp5FfKeUCG/kPtxJUfxf1ZnGMHS8tt10pX3VP70KNW1r05dRz72RNODZkY5jMfpPVmN ZG70Kp39i2dmcjZO4ZF3Ios08mmFRCbRfsrBwXa9PSXo2XPnXiMh3cxkDdxhSYhHrBgd Yon11WhqLr4lAknCrHUwCbwGBxwy4vQW5tXscTa8MJMLipiEFkoA82VHbWdCtD2mxCSj zm6WUIPcd6lamyU2QK5WKWh058efH0NMHD1cDoub/+8wAyYr6VYH+HKxhpBJqXg2BjfD ML8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720331656; x=1720936456; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PkYP94kjr/8aPWc+0tv0/ZqO8o4iHRZmdZ252DF4P2Y=; b=r0wK6sFaxeOQUmmrFzpwNRaRAIZrYk9w1klwAbkLp0WwUyqY4WBnoBAtc1IPTra1R5 BO3WKym9H8sFGTUm1Nit3F2I3Pp/iJ1uHYPMtfqujszkDSrYOFmeNgwfpU+bWHQj4uPS MyrHb7M+YDfzt1FIyXXOmzL4fX68kS0SB1iBHNijGUSjoKM2GOXhdM7hocbQ3gTo6lt8 7N+pTJ43pfqY/KJeZaIlc42/y9aQ+4h9TQXf4FaGTey+TGbHYt/scydMgKWh4mTI7PZh XIC8uozUQ2LgALSx8dPeBgWSMTV5Uz9AfMSypUWmcSK011D7WU0o5ggHQcMk+5RPncy0 YzAA== X-Forwarded-Encrypted: i=1; AJvYcCXXIUI0PxGCvCzGrCAyaQCQrXyHX9YzI0cld+qGUuGFHnpPl6hU/zpXm02qdgSCixarjNQbkh7aKbS1UHn2kTZ1H6TY9wSvUSCPCQud5/D8ahi7zP0= X-Gm-Message-State: AOJu0YzjdmRWrWttIVxklMtqrbaAXmlRs0RGWYo+vKTEY57+CMXBQV7v 4zAXTtAmjmC0g9vWXunH/9/5PmBHXBNh+FODtUFRgg05C5JR/tif X-Google-Smtp-Source: AGHT+IEu5EHIYcnfrC8/ox3w5DEvJ6bgrLaIpMPaGoA9D9FGa+MnvW04XbpcHN+amV5ID3TB24rIOQ== X-Received: by 2002:a05:6870:d8c8:b0:24c:adc0:ffa1 with SMTP id 586e51a60fabf-25e2b5aec6fmr7214256fac.0.1720331656199; Sat, 06 Jul 2024 22:54:16 -0700 (PDT) Received: from kousik.local ([2405:201:c006:312d:252d:94b8:b79c:d7bb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b2e5fe3dfsm94429b3a.97.2024.07.06.22.54.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 06 Jul 2024 22:54:15 -0700 (PDT) From: Kousik Sanagavarapu To: Nishanth Menon , Jonathan Cameron , Santosh Shilimkar , Nathan Chancellor , Julia Lawall Cc: Shuah Khan , Javier Carrasco , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Kousik Sanagavarapu , Jonathan Cameron Subject: [PATCH v3 3/4] soc: ti: knav_qmss_queue: do device_node auto cleanup Date: Sun, 7 Jul 2024 10:44:18 +0530 Message-ID: <20240707055341.3656-4-five231003@gmail.com> X-Mailer: git-send-email 2.45.2.561.g66ac6e4bcd In-Reply-To: <20240707055341.3656-1-five231003@gmail.com> References: <20240707055341.3656-1-five231003@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240706_225418_145685_480DCEA2 X-CRM114-Status: GOOD ( 19.96 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Use scope based cleanup, instead of manual of_node_put() calls, which automatically free()s "struct device_node". While at it, refactor the code from knav_queue_probe() into the seperate functions to make auto cleanup look more neat. Doing the cleanup this way has the advantage of reducing the chance of memory leaks in case we need to read from new OF nodes in the future when we probe. Suggested-by: Julia Lawall Reviewed-by: Jonathan Cameron Signed-off-by: Kousik Sanagavarapu --- drivers/soc/ti/knav_qmss_queue.c | 100 ++++++++++++++++--------------- 1 file changed, 53 insertions(+), 47 deletions(-) diff --git a/drivers/soc/ti/knav_qmss_queue.c b/drivers/soc/ti/knav_qmss_queue.c index 06fb5505c22c..f4b603719055 100644 --- a/drivers/soc/ti/knav_qmss_queue.c +++ b/drivers/soc/ti/knav_qmss_queue.c @@ -1076,14 +1076,20 @@ static const char *knav_queue_find_name(struct device_node *node) } static int knav_queue_setup_regions(struct knav_device *kdev, - struct device_node *regions) + struct device_node *node) { struct device *dev = kdev->dev; + struct device_node *regions __free(device_node) = + of_get_child_by_name(node, "descriptor-regions"); struct knav_region *region; struct device_node *child; u32 temp[2]; int ret; + if (!regions) + return dev_err_probe(dev, -ENODEV, + "descriptor-regions not specified\n"); + for_each_child_of_node(regions, child) { region = devm_kzalloc(dev, sizeof(*region), GFP_KERNEL); if (!region) { @@ -1121,10 +1127,9 @@ static int knav_queue_setup_regions(struct knav_device *kdev, INIT_LIST_HEAD(®ion->pools); list_add_tail(®ion->list, &kdev->regions); } - if (list_empty(&kdev->regions)) { - dev_err(dev, "no valid region information found\n"); - return -ENODEV; - } + if (list_empty(&kdev->regions)) + return dev_err_probe(dev, -ENODEV, + "no valid region information found\n"); /* Next, we run through the regions and set things up */ for_each_region(kdev, region) @@ -1306,10 +1311,16 @@ static int knav_setup_queue_range(struct knav_device *kdev, } static int knav_setup_queue_pools(struct knav_device *kdev, - struct device_node *queue_pools) + struct device_node *node) { + struct device_node *queue_pools __free(device_node) = + of_get_child_by_name(node, "queue-pools"); struct device_node *type, *range; + if (!queue_pools) + return dev_err_probe(kdev->dev, -ENODEV, + "queue-pools not specified\n"); + for_each_child_of_node(queue_pools, type) { for_each_child_of_node(type, range) { /* return value ignored, we init the rest... */ @@ -1318,10 +1329,9 @@ static int knav_setup_queue_pools(struct knav_device *kdev, } /* ... and barf if they all failed! */ - if (list_empty(&kdev->queue_ranges)) { - dev_err(kdev->dev, "no valid queue range found\n"); - return -ENODEV; - } + if (list_empty(&kdev->queue_ranges)) + return dev_err_probe(kdev->dev, -ENODEV, + "no valid queue range found\n"); return 0; } @@ -1389,14 +1399,20 @@ static void __iomem *knav_queue_map_reg(struct knav_device *kdev, } static int knav_queue_init_qmgrs(struct knav_device *kdev, - struct device_node *qmgrs) + struct device_node *node) { struct device *dev = kdev->dev; + struct device_node *qmgrs __free(device_node) = + of_get_child_by_name(node, "qmgrs"); struct knav_qmgr_info *qmgr; struct device_node *child; u32 temp[2]; int ret; + if (!qmgrs) + return dev_err_probe(dev, -ENODEV, + "queue manager info not specified\n"); + for_each_child_of_node(qmgrs, child) { qmgr = devm_kzalloc(dev, sizeof(*qmgr), GFP_KERNEL); if (!qmgr) { @@ -1668,6 +1684,26 @@ static int knav_queue_start_pdsps(struct knav_device *kdev) return 0; } +static int knav_queue_setup_pdsps(struct knav_device *kdev, + struct device_node *node) +{ + struct device_node *pdsps __free(device_node) = + of_get_child_by_name(node, "pdsps"); + + if (pdsps) { + int ret; + + ret = knav_queue_init_pdsps(kdev, pdsps); + if (ret) + return ret; + + ret = knav_queue_start_pdsps(kdev); + if (ret) + return ret; + } + return 0; +} + static inline struct knav_qmgr_info *knav_find_qmgr(unsigned id) { struct knav_qmgr_info *qmgr; @@ -1755,7 +1791,6 @@ MODULE_DEVICE_TABLE(of, keystone_qmss_of_match); static int knav_queue_probe(struct platform_device *pdev) { struct device_node *node = pdev->dev.of_node; - struct device_node *qmgrs, *queue_pools, *regions, *pdsps; struct device *dev = &pdev->dev; u32 temp[2]; int ret; @@ -1799,39 +1834,17 @@ static int knav_queue_probe(struct platform_device *pdev) kdev->num_queues = temp[1]; /* Initialize queue managers using device tree configuration */ - qmgrs = of_get_child_by_name(node, "qmgrs"); - if (!qmgrs) { - dev_err(dev, "queue manager info not specified\n"); - ret = -ENODEV; - goto err; - } - ret = knav_queue_init_qmgrs(kdev, qmgrs); - of_node_put(qmgrs); + ret = knav_queue_init_qmgrs(kdev, node); if (ret) goto err; /* get pdsp configuration values from device tree */ - pdsps = of_get_child_by_name(node, "pdsps"); - if (pdsps) { - ret = knav_queue_init_pdsps(kdev, pdsps); - if (ret) - goto err; - - ret = knav_queue_start_pdsps(kdev); - if (ret) - goto err; - } - of_node_put(pdsps); + ret = knav_queue_setup_pdsps(kdev, node); + if (ret) + goto err; /* get usable queue range values from device tree */ - queue_pools = of_get_child_by_name(node, "queue-pools"); - if (!queue_pools) { - dev_err(dev, "queue-pools not specified\n"); - ret = -ENODEV; - goto err; - } - ret = knav_setup_queue_pools(kdev, queue_pools); - of_node_put(queue_pools); + ret = knav_setup_queue_pools(kdev, node); if (ret) goto err; @@ -1853,14 +1866,7 @@ static int knav_queue_probe(struct platform_device *pdev) if (ret) goto err; - regions = of_get_child_by_name(node, "descriptor-regions"); - if (!regions) { - dev_err(dev, "descriptor-regions not specified\n"); - ret = -ENODEV; - goto err; - } - ret = knav_queue_setup_regions(kdev, regions); - of_node_put(regions); + ret = knav_queue_setup_regions(kdev, node); if (ret) goto err;