Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp2140001ybl; Sat, 14 Dec 2019 06:44:17 -0800 (PST) X-Google-Smtp-Source: APXvYqxHxkvbwN4eJNpm3olY8s325tgsBeSEr54A1DeQ2l2ozlSC+BMwhlVIgoy8It4biVsbPHIt X-Received: by 2002:a05:6830:1492:: with SMTP id s18mr21507866otq.285.1576334657343; Sat, 14 Dec 2019 06:44:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576334657; cv=none; d=google.com; s=arc-20160816; b=NaBekY9cVX8RYV1ohPV0NBPzcvrS9fHr+TuI1aK5BunobPwISwU25paqiIhaIESP4r u5nRYrBupZH9/doRnfwYe7hP8z4OlvNAcxbmjX8yjvdqsroeGvqcdrPaV0SDYuFhUC+a BpjaP/hvr+qNl4U9FOX7n/yIbOyFsEqH51zwQuqe6thJ1TDb4iqSVVMI/xeYrnfCKBKd WFOQ9v1QbQ4hlBOdA0L9qTXnmsXM5jD1qffV+Pd7Ghy9usqwpqdYYqze5GofKzGXOOL3 TRWDAg1h1/SLK0PveuRTGX/ZQFRfKZuduVLLj6JvoVgldZpzTuKBG27yHBQZT2zpISTw QcOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=Dpcdu0AcpH3UJmm6pJz2+6ZZmhxOFn4vV4Er/qkenpw=; b=QVqMUqjCrkS3Odlpmn6ZGHQIcWxPckhu2N8q6j+AZCnM6qOjckCRvybsEqFWBNzmS3 /M4jmN1iPyZHHf1cK1zMfkAN025gM/sPcXuHv5/pAKhK6eZ8huHzIXj6npky/aR1XT3v Rju8lXvM9qIcY8/DH3Ask0FRK2CePj3dFqtINlj8G944PoiTvFT/T4KHGba/CCCm1a4J d6Sc5GaXURIy6y4ZAQnbpBMLNj58SFwTVs/pLojBUxPHmyGSUdKnsIHmSRmZae6IXS1A caIiJSst6f9zOj/GmIp6EegA9qLgBdJ6Y0+Ufu0qcAOy38QhYxuKplAmGOeojbuVpBCi XZPw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v49si7726019otb.253.2019.12.14.06.44.05; Sat, 14 Dec 2019 06:44:17 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726705AbfLNOlH (ORCPT + 99 others); Sat, 14 Dec 2019 09:41:07 -0500 Received: from mout.kundenserver.de ([212.227.126.135]:45441 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725872AbfLNOlH (ORCPT ); Sat, 14 Dec 2019 09:41:07 -0500 Received: from orion.localdomain ([95.114.98.35]) by mrelayeu.kundenserver.de (mreue011 [212.227.15.167]) with ESMTPSA (Nemesis) id 1MPXxi-1iKbZU2Lw2-00MYOR; Sat, 14 Dec 2019 15:41:02 +0100 From: "Enrico Weigelt, metux IT consult" To: linux-kernel@vger.kernel.org Cc: rafael@kernel.org Subject: [PATCH] drivers: devres: add devres_add_auto_ptr() Date: Sat, 14 Dec 2019 15:40:32 +0100 Message-Id: <20191214144032.24062-1-info@metux.net> X-Mailer: git-send-email 2.11.0 X-Provags-ID: V03:K1:hrdThy5tTSwtzfNzGsrQrsoQfuU6JpoPS9+X4p0/p3FJiAzlCgc 1u8iA/TkQ6//f4bHhPShkk+HkzscwFSBeEs727oVNifijdH51/ud0R42lng/Esg3Fn5Azq6 t2ZUpeK4sK2MVtQEuEtFVI+liz/tf7+TCfGQl8ZCLZ6rvfWqR8imZIXJduFKsT0EKfIk9xb kLXAqTYn+yVxVpHe/Q7zw== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:psYwW+SNV6c=:tX3sRAtkfnCKNMiT3QteeH GcrMyVhXxD+DG9uOn1BuHqBehrZ3/Rs9i5JkjPQvDnGQUieOzUKTl8R8W5rUJHAncReoYOQHy CfzFQukk1EKTzc0gTqBfdvjl8Ej2eCF13DQVcDvXNq8Ge8a6IYJYPFgwOMlTkO6YtgKObfwuu WJdVif1Qqw1GgKrOsGcqA891xjDah3teJATvJMGEQzonGn+aCEYm+ytH3iUWTzqCTAopAtQKS KChKmQ/NZPoHn7kJtJ8OLLsV5fXsoAli4zR2ZVBLEgyIcsiIs0rM41xFI8yUmYo/YAPgZDL3k NW/OvXLdtoKJkJ2TZPaxy1N9z/akWtmyyUuv1kpCUaVCWGsW+yRF0L8+mOHwp7s3/J6yscYTo 82qyJ2ufA0kgN0BNfGsXZ4wYzuwZPEfKxYWCzAbK6xP5+EFpR5Tf2cpFzEp4n8uskuJ0K8RaW kJYLR+OiEm3QNCEPV4dlAihKN2G+WYYVNyqMUQHv0uqLAMptS3XsG/k1274V4hbY6dI6GlhPk klbeFToGYGsEvqG8PPPV9AjA/tAjvPo+wA9aqygXNSir6mVdBh7biCxIzJzckD22aPBfL7/cw pOJbrwYd/1W2eFG079v5SzZlOpIXbSnmLNA0tcvcDsEUAydonFLDMll/RqVHC5Owfft+t9UTK UIiTGAxJiuO+Bbpvt9IGYIL3SHoNlzRkxMvKE4zVnBUKo7QyA/9kiN/C+SG5jbSN8fSQOEQDA 26n9gKNCneDA9goaARsJ0e5IsGgvxXFFfHh6ymgLcr4t+UdwD82ECX1dJ2tjiIhaGKifobL98 nBfeHJmsx0GwjhGYi/XXVOAdoDTt43+gYY5VIPhHLjQzNPefbKIIFBwr9zhv+64ajEDc27TJW 1IRS7o0ibm1ssGrfevqg== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Adding a helper for allocating and adding a devres in one shot, in order to minimize boilerplate. In case of failure, it frees the resource and returns error. Signed-off-by: Enrico Weigelt, metux IT consult --- drivers/base/devres.c | 29 +++++++++++++++++++++++++++++ include/linux/device.h | 2 ++ 2 files changed, 31 insertions(+) diff --git a/drivers/base/devres.c b/drivers/base/devres.c index 0bbb328bd17f..6631d3748ebe 100644 --- a/drivers/base/devres.c +++ b/drivers/base/devres.c @@ -237,6 +237,35 @@ void devres_add(struct device *dev, void *res) } EXPORT_SYMBOL_GPL(devres_add); +/** + * devres_add_auto_ptr - Reigster pointer device resource + * @dev: Device to add resource to + * @release: release callback function + * @ptr: pointer to register + * + * Allocate a devres entry and register pointer @ptr to @dev. On driver + * detach, the associated release function will be invokied and devres + * will be freed automatically. + * + * The devres will be allocated w/ GFP_KERNEL + * + * In case of failure, the resource will be released automatically ! + */ +int devres_add_auto_ptr(struct device *dev, dr_release_t release, void *ptr) +{ + void **dr; + dr = devres_alloc(release, sizeof(ptr), GFP_KERNEL); + if (!dr) { + pr_err("devm: out of memory!\n"); + release(dev, ptr); + return -ENOMEM; + } + + devres_add(dev, dr); + return 0; +} +EXPORT_SYMBOL_GPL(devres_add_auto_ptr); + static struct devres *find_dr(struct device *dev, dr_release_t release, dr_match_t match, void *match_data) { diff --git a/include/linux/device.h b/include/linux/device.h index e226030c1df3..b8d8eef89fdf 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -905,6 +905,8 @@ extern void devres_for_each_res(struct device *dev, dr_release_t release, void *data); extern void devres_free(void *res); extern void devres_add(struct device *dev, void *res); +extern int devres_add_auto_ptr(struct device *dev, dr_release_t release, + void *ptr); extern void *devres_find(struct device *dev, dr_release_t release, dr_match_t match, void *match_data); extern void *devres_get(struct device *dev, void *new_res, -- 2.11.0