From patchwork Sun Aug 25 08:48:44 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kousik Sanagavarapu X-Patchwork-Id: 13776724 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 3C867C5321E for ; Sun, 25 Aug 2024 09:00:55 +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=RdDSkwgr4tP8vvC2Lh81EsoGSqhFoF9r46WKr4u5n6Q=; b=fD9gYVR7NQtbWLefKNIh0AyA8Z qjaPCthnLfn+w6p5U0StXyg3Hs5liw8uRh3kQCi7tUF0Un4yf/XikOX9GX+Ngi1+pZWMcOt6OR3Lv yl6YPU5PSfOtKeAgMKGmYTJRhQrFnS+G7jbyV7FFuJze0sLxJleRfGhQSZYaTy42Ygk3wwSiaJUEg NHw0Rg4pMgTVOSD97NPSYfD8+7CxhrS3fxh8S8na6lVhPVdlTYRsNbCiX/jKox73T1D3sljAMm8eq 59rslj82ZAcdhFzop95OZFhwqhUx3sPd+uDeZaXgNIXTHn8MfIXK5z2JNt4k66lxxAwZO26+YLxl7 4zQSJ9og==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1si972-000000041Aq-3SL7; Sun, 25 Aug 2024 09:00:40 +0000 Received: from mail-pf1-x42d.google.com ([2607:f8b0:4864:20::42d]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1si94J-000000040ff-0DPB for linux-arm-kernel@lists.infradead.org; Sun, 25 Aug 2024 08:57:52 +0000 Received: by mail-pf1-x42d.google.com with SMTP id d2e1a72fcca58-7141feed424so2819812b3a.2 for ; Sun, 25 Aug 2024 01:57:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724576270; x=1725181070; 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=RdDSkwgr4tP8vvC2Lh81EsoGSqhFoF9r46WKr4u5n6Q=; b=PldrapZkISRcqxOiNtokWPb0Kzl2wJ+Yf3wIy1mPq5zi1rKCSkEZJWCDu7xB5A8aSd JzBANEjLtXoJkoNQxQJxcsdSJEenCZomPALr1MEzmZv1RoSpLt0IWEyCiQH8s4En0uN7 6LJvAhV2ikuP16OEvFD6OYS4cME5GN5/5tMXNvaATrsUbQp/qLW3fkOzljBF4ZgdgRmV t0pBUx5ozAJG/T8Ec2K+9HoKUXZxWT7wbRn7yAcqpiw+6uuOv35u14VUjsiYGjQCogY1 iKUoeiixbS0/wTgEJTmvH2NBZM5hGnR6KhCzbaNK6t8YKhhE5qLvOXQhxst5pp9tVfLS gz0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724576270; x=1725181070; 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=RdDSkwgr4tP8vvC2Lh81EsoGSqhFoF9r46WKr4u5n6Q=; b=PZhYSWUAeEGaPY+aDHV7YZmV2xk3chXaXLIr46KpTa8psRRWxGJwHLLOw+QScXAd4U iNO9NtOu3fqBkZd15JbgnDBbOL89kHSI9PJ4O4PP2l47IH5eIL0X+9qm9OLSe7F/bk6M KYYWVZIp9gtQixdpNeCribaoJb6jeIBZhatj2kr1amGhnhrbsP8Xbv5N9T+C4YTy1Wai uRw+QYZIvVYHnmJnyPUhgrSgLOaG2EZxtADPdUAbk5o1j8PcLeUkl6/sE0NUcWduhdPb PHgHPVhUL6S8o0VffvFuFqKMVwPrXtAjdg9Jmfk7PsyA7fxLMdJuFkLYKa3IJ+iKv2FF NtXQ== X-Forwarded-Encrypted: i=1; AJvYcCW6+YIx4Q90in/xZmvUAAte9oyHRmOslDDP3ij8W3Auor97KzZHJEC3t/w3+uw1KWg5BQ9UVZ8KtVpB67YQ7dhh@lists.infradead.org X-Gm-Message-State: AOJu0YxFocRCOHP7+xbNrHl56/tMwKbw9X6+2i47YzYFfcEYbskhQlQk VLFyEboqEd+ppcBT+Jqp3dyyLXogc10XOW9HWf5u+hi4IxhsqC4G8N40WV/d X-Google-Smtp-Source: AGHT+IHnYI0GVsC+HRYaFQj5uR/diEHP2T8oRwEjXY1h9XGwrqqq7Xfcp8V/76LBZgRP8GY0y4P4hA== X-Received: by 2002:a05:6a00:b8f:b0:702:3e36:b7c4 with SMTP id d2e1a72fcca58-71445cd49d4mr7759843b3a.5.1724576269357; Sun, 25 Aug 2024 01:57:49 -0700 (PDT) Received: from kousik.local ([2405:201:c006:3236:b871:d8f1:d936:dc0c]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7143425109asm5414348b3a.67.2024.08.25.01.57.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Aug 2024 01:57:49 -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 v4 3/4] soc: ti: knav_qmss_queue: do device_node auto cleanup Date: Sun, 25 Aug 2024 14:18:44 +0530 Message-ID: <20240825085714.10736-4-five231003@gmail.com> X-Mailer: git-send-email 2.46.0.290.g4f02c709e8.dirty In-Reply-To: <20240825085714.10736-1-five231003@gmail.com> References: <20240825085714.10736-1-five231003@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240825_015751_114860_9EC858F2 X-CRM114-Status: GOOD ( 19.73 ) 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 separate 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 f2055a76f84c..2f14841ac8a9 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;