From patchwork Thu Sep 24 15:00:12 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Madalin Bucur X-Patchwork-Id: 522371 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 2DE961402D0 for ; Fri, 25 Sep 2015 01:02:50 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753678AbbIXPCc (ORCPT ); Thu, 24 Sep 2015 11:02:32 -0400 Received: from mail-bn1bon0147.outbound.protection.outlook.com ([157.56.111.147]:58463 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752437AbbIXPCa (ORCPT ); Thu, 24 Sep 2015 11:02:30 -0400 Received: from CO2PR03CA0039.namprd03.prod.outlook.com (10.141.194.166) by CY1PR0301MB1274.namprd03.prod.outlook.com (10.161.214.22) with Microsoft SMTP Server (TLS) id 15.1.274.16; Thu, 24 Sep 2015 15:02:27 +0000 Received: from BN1BFFO11OLC002.protection.gbl (2a01:111:f400:7c10::1:164) by CO2PR03CA0039.outlook.office365.com (2a01:111:e400:1414::38) with Microsoft SMTP Server (TLS) id 15.1.286.15 via Frontend Transport; Thu, 24 Sep 2015 15:02:27 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; freescale.mail.onmicrosoft.com; dmarc=none action=none header.from=freescale.com; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BN1BFFO11OLC002.mail.protection.outlook.com (10.58.145.13) with Microsoft SMTP Server (TLS) id 15.1.274.4 via Frontend Transport; Thu, 24 Sep 2015 15:02:26 +0000 Received: from fsr-fed1764-003.ea.freescale.net (fsr-fed1764-003.ea.freescale.net [10.171.73.45]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id t8OF2Fkl018660; Thu, 24 Sep 2015 08:02:23 -0700 From: Madalin Bucur To: CC: , , , , , , , , , , , , Madalin Bucur Subject: [v3 1/8] devres: add devm_alloc_percpu() Date: Thu, 24 Sep 2015 18:00:12 +0300 Message-ID: <1443106819-5549-2-git-send-email-madalin.bucur@freescale.com> X-Mailer: git-send-email 1.8.2.3 In-Reply-To: <1443106819-5549-1-git-send-email-madalin.bucur@freescale.com> References: <1443106819-5549-1-git-send-email-madalin.bucur@freescale.com> Reply-To: X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11OLC002; 1:DHe1p2O2qt/Q57tEGkbdjlQNPOGRUKS9H4FX+V6il8UBQBsBniFmAH1Nq9aUj/Hb5c9EKTd3NwJh1NtNLlV5NE+/XYpObaFNsgkvwtCuNiHIxEqUNLCD3ulx+vXGfURbeUW9e6Jos/3Wf26tykqS7FKfasqPgMpAnXRrVmkFkfLYKlqFdyo0GYw90f3wNWs+EbOJhI+IHi4pc/FDuZ9TWx7UsN+sFwrLKqF9/+DILbKkkgzUbIASZonkM0+85Oeeh5aWsqa4VrGJAGhPlLrbUkXbQuD3rj9VPFe2ZBz4Tu/U4IoI3c5wTzg6L8LV4c3NwiOYHhMbVk34KT2daZfbMKOrhtOyI/5I6eUYruFsdsEchYpLV5cK9/kD3CTe5tYA0wE/u8nNhCx/Usorc7Tb6w== X-Forefront-Antispam-Report: CIP:192.88.158.2; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(43066003)(77096005)(189998001)(86362001)(76176999)(69596002)(4001540100001)(50986999)(97736004)(81156007)(5001830100001)(68736005)(62966003)(6806005)(36756003)(104016004)(107886002)(110136002)(5001960100002)(77156002)(2950100001)(11100500001)(85426001)(5003940100001)(64706001)(229853001)(87936001)(19580395003)(19580405001)(48376002)(5007970100001)(105606002)(5001860100001)(53806999)(47776003)(50466002)(2351001)(46102003)(106466001)(33646002)(50226001)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:CY1PR0301MB1274; H:az84smr01.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1274; 2:cW07q2tQrS/w2uIiYen4VQvcvc8h0Ll5wWQxnuyq1WxUOuoseTvlBTrQmKBx43nbqKL4hEzWhjkrj8DxmjK5lyQwOgDi0159QPyM60qbUYOqNWTuVkLLVwb2GoDA4v3c+IyKGZs+0Car24vRZEsqkcxdT5i+wSg98bDtySGcuzo=; 3:rZL1Le4MY0nafuFxRPMNTn6URiB5ytDGl1VeyUW08zoADM5jLxvJh4NjeA84o85EhdX7gdEOgZp21QA2AE6eXR5ELWxBmWRBVPqKFsLv2CL0Wu8jqkF5onMk0SzHxy+Qk/ivDubwTadws5TL7z5bivQ7IGvFsBDtjEI7I9GPmOY4LFB9xl6Ih3baUzllkIqG68MFrXDl8V9FnQcMM0nNTqUezGwlbGABJ5g20qYRLPg=; 25:na7aA4lrrIMSSw2p/+zH3R2AmyamYgowLWGU8j3L7M84TbNlTHabDfRyX7k4Zudj2MVJksGZWqqOkTUclkoeisqHIGdD0S8KrNvtFnIGuBjHsXmZ9Q24LE6qyt9ssevECdPiwWu3QHKZZ8xzpa94d1vCle1WQjnMZicgVJg/NlgA9/TihEV/T+rDeQOrmIfMqJax1plkBeT0LD37egZGDUo3jBbn7KeKq27gniOuMOsw6x5ZOca7tju0qlCUSFghKdZpUKpmxch/p+0ZvN8W0g== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1274; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1274; 20:nJV8vTOk7+/uyrxw8AJCkdDzyLnhnMjuRNn/qgKG3T9/W3lOQCgwfWAJZcdOqCPyr2bVF65b++xIaA9jbwhcI+yVznzHAYRJpPjenv/w5SgX52kzCSkWwBkTW83eMZwGzvJqz5KYN/XczxbNLWcOYzvJ5kf7W63q4JNSN5siJxH6EZO5OJaUEJQjVbzE9DlYnUXX9wzQuhUKFsyA/mS7WwkDj7j/q64Qtz15Y1YR120eFWs6CsBdPq4zFqsp5tF2AQkKIume2VTDO0OKegL5GG+6uPmpOcL+OmnWhVA/onqQ86uOseVciDukld0dAkxPjS1wJKaISlxYPWKLgfhUrawyMUysLOLNBQfwMsYxE4c=; 4:IeY/4OLgsoFfGFe7xeqnM/3kD/vHtUPaa+zSRvXOP4GSVGetIeKADMR1PGPEG3rMENKZ0JGeg9pjUWTpEdl22GCArW0fM5bom4IjZOzaX2x4p/QFuf6HtYj5AtD/njm6vZ1L+YlrRYSwtzCMdSfgkvkidwnAV/vW9DvM3CFhOIn46BSVouqjL7yiAUAFn8fukcvGKyfE3mTRkuY7jwr8ZofjkuGN6PtLwWZKUS0a3bYHjY9xSYH/KBWshtzgIJsS2hsbJZnbJjY/F4Ioou0xUS/WQTzdBoIMvxQ9OrTerTcKSIfK1VK9pRIy9lXW3PT3WAOK5ltZOF3vLm9jYTW7ilksaaM2fDMX/8OJYA26wUs= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(5005006)(520078)(3002001); SRVR:CY1PR0301MB1274; BCL:0; PCL:0; RULEID:; SRVR:CY1PR0301MB1274; X-Forefront-PRVS: 070912876F X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR0301MB1274; 23:hV4B6axCWTpDXabyYAZvmrqEZ+dmiZpjWQ6V4Q7?= =?us-ascii?Q?u58DdQs9DVKHQPCFuMKJti1/urQM7WG2qDMdl4dEf0dZxubB1zjEdFpGsXMX?= =?us-ascii?Q?nbFH96UG2XgSy7Ri8FLxJt0nbiDglcv31Bg0rVOlShddsorOc+MbH/fJrPfB?= =?us-ascii?Q?RZp1+AkyAvR9FN2/601aIEDMvmdb7Ucn+pLX5/89aKb6+5QHdLGWVdYJzlWd?= =?us-ascii?Q?BLdFu9ZtaMxICwH8G4F6gZh7VTZExK80InGcASeNqRq3IYWeFOHVim0Hh8Xb?= =?us-ascii?Q?V5KPayHn0w93/nmnoDhflgJ59ife9KbYJJxk/aA+NItKOlVmrxAQxZK7h6CN?= =?us-ascii?Q?5bd54PlzgHw1oUbWMJyRRLxJklulo6qUoR8UXVPvAJ9w7iTm32K7FfEE9Fpw?= =?us-ascii?Q?5mw92HItFUIYIz4MpOfrd5xls7nzHpJab/EqmCjUlQCdP90fGG6hvaeYTUgP?= =?us-ascii?Q?zV6yt04qMcXba1+rupE+9wfHZ91VdT9fZoLluW3ftLYAZ3ZGY3rOFa1dAxr+?= =?us-ascii?Q?aiC0qc3kQyHLsWtmUPGLcMBUUwwX5ldfTnhBvd7n4IHhpZJLjtQRu+61ApQF?= =?us-ascii?Q?U0u8+Ge944Chfi3HqaAFHH8PCc8ea75BGC/ightzvesUqXD9UnQ/XmO1AMnr?= =?us-ascii?Q?W6phxzYDs4rYNNgAezrBG3qcFtbTcbBMLbBTkOu98qy1mpIKkQlPUOgIbZ3m?= =?us-ascii?Q?1eg+TdHkX736kRHd8KkjnQFYsS3YDbWTdR9k/g84xixUowy8XmMWQPcnn5Kc?= =?us-ascii?Q?wHLZ2VmOaea4OUCNjPomrtHm41NjezneFlTQpYmFjIKF1BXkB8qV2jL6gw8J?= =?us-ascii?Q?lvwfFLsGv5nv0fxveHnKiLvwGDfPHvOU0blthXxDRx9GvzV5RZg62wf65QJf?= =?us-ascii?Q?TJLBAOpRtf9KOZnrUFXuUvldPXoEL+hiYdrjw0mZtiF1oojm+m4BDew6X7Q2?= =?us-ascii?Q?0mX0WpjQKarGJAe/llz109gAU1fQSCYIjPIfgQHKov2mC/G7tAEKRQyoe8Kt?= =?us-ascii?Q?XHpy/KIhZmP4CGTXGPqwseFdH2o0wrQaKW34W1dTrQayOjcy2duTHUV4zLtb?= =?us-ascii?Q?7UYb08FbydthKzm2WN3tzPAJU2Ux7mltDyRtQHisslqbKSJxZEsi1VHRM6B0?= =?us-ascii?Q?fIRF4kXuFDM6UdU8Zx/2AVQXLOa8DRxudQ1W2TdAX9IwVcXyqr55rAxvGtUq?= =?us-ascii?Q?GNNSelb2RxTMEjs5v+0kbuAQpz1ockO/uhyLZaq0qow4RuDaA0OM2e7ByVP6?= =?us-ascii?Q?4inNoU0si3osdCdBXrVOSyNfkLgnKynmRtSSFqYaZGbFwOffyoTy7WhusXEs?= =?us-ascii?Q?SoOil8vNaIFW2PZFfAfGkScc=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1274; 5:mK9YvUM7O5zPVL2iT76XTY9ikXj4GfeahxKRLTDCf8hHdLMHUS+ou7SokhdyyGsABn9kzk30QM4xU8V4ItmmtP0aTOZTyiaP8+Iya9ZrijUYIUWRXT6v0QxUk/ARGcKSMvQ0n18JaDHFYkB3B5VlPg==; 24:g1QkYWLGof/SCLeD6n4EmJehsN0/B8lqgqKGY8L0jbvp0J2wErEhK1D+/P1nCNcoRUAN2MXNR7HFUFlAuI92ePfMcRSGQ6FWxkYewSKkPHk=; 20:DfPf87QeONHOjETowjSCCzfqGSHa7q9ZtbU8lTUPTzoQ9ZMR1JC+WLDa8QGMVlnv709zRANijyX8Of1pASyBZw== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Sep 2015 15:02:26.4262 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0301MB1274 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Introduce managed counterparts for alloc_percpu() and free_percpu(). Add devm_alloc_percpu() and devm_free_percpu() into the managed interfaces list. Signed-off-by: Madalin Bucur Tested-by: Madalin-Cristian Bucur --- Documentation/driver-model/devres.txt | 4 +++ drivers/base/devres.c | 64 +++++++++++++++++++++++++++++++++++ include/linux/device.h | 19 +++++++++++ 3 files changed, 87 insertions(+) diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt index 831a536..595fd1b 100644 --- a/Documentation/driver-model/devres.txt +++ b/Documentation/driver-model/devres.txt @@ -312,6 +312,10 @@ MEM devm_kvasprintf() devm_kzalloc() +PER-CPU MEM + devm_alloc_percpu() + devm_free_percpu() + PCI pcim_enable_device() : after success, all PCI ops become managed pcim_pin_device() : keep PCI device enabled after release diff --git a/drivers/base/devres.c b/drivers/base/devres.c index 8754646..6c314cc 100644 --- a/drivers/base/devres.c +++ b/drivers/base/devres.c @@ -10,6 +10,7 @@ #include #include #include +#include #include "base.h" @@ -984,3 +985,66 @@ void devm_free_pages(struct device *dev, unsigned long addr) &devres)); } EXPORT_SYMBOL_GPL(devm_free_pages); + +static void devm_percpu_release(struct device *dev, void *pdata) +{ + void __percpu *p; + + p = *(void __percpu **)pdata; + free_percpu(p); +} + +static int devm_percpu_match(struct device *dev, void *data, void *p) +{ + struct devres *devr = container_of(data, struct devres, data); + + return *(void **)devr->data == p; +} + +/** + * __devm_alloc_percpu - Resource-managed alloc_percpu + * @dev: Device to allocate per-cpu memory for + * @size: Size of per-cpu memory to allocate + * @align: Alignement of per-cpu memory to allocate + * + * Managed alloc_percpu. Per-cpu memory allocated with this function is + * automatically freed on driver detach. + * + * RETURNS: + * Pointer to allocated memory on success, NULL on failure. + */ +void __percpu *__devm_alloc_percpu(struct device *dev, size_t size, + size_t align) +{ + void *p; + void __percpu *pcpu; + + pcpu = __alloc_percpu(size, align); + if (!pcpu) + return NULL; + + p = devres_alloc(devm_percpu_release, sizeof(void *), GFP_KERNEL); + if (!p) + return NULL; + + *(void __percpu **)p = pcpu; + + devres_add(dev, p); + + return pcpu; +} +EXPORT_SYMBOL_GPL(__devm_alloc_percpu); + +/** + * devm_free_percpu - Resource-managed free_percpu + * @dev: Device this memory belongs to + * @pdata: Per-cpu memory to free + * + * Free memory allocated with devm_alloc_percpu(). + */ +void devm_free_percpu(struct device *dev, void __percpu *pdata) +{ + WARN_ON(devres_destroy(dev, devm_percpu_release, devm_percpu_match, + (void *)pdata)); +} +EXPORT_SYMBOL_GPL(devm_free_percpu); diff --git a/include/linux/device.h b/include/linux/device.h index 5d7bc63..b563cc5 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -673,6 +673,25 @@ void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res); int devm_add_action(struct device *dev, void (*action)(void *), void *data); void devm_remove_action(struct device *dev, void (*action)(void *), void *data); +/** + * devm_alloc_percpu - Resource-managed alloc_percpu + * @dev: Device to allocate per-cpu memory for + * @type: Type to allocate per-cpu memory for + * + * Managed alloc_percpu. Per-cpu memory allocated with this function is + * automatically freed on driver detach. + * + * RETURNS: + * Pointer to allocated memory on success, NULL on failure. + */ +#define devm_alloc_percpu(dev, type) \ + (typeof(type) __percpu *)__devm_alloc_percpu(dev, sizeof(type), \ + __alignof__(type)) + +void __percpu *__devm_alloc_percpu(struct device *dev, size_t size, + size_t align); +void devm_free_percpu(struct device *dev, void __percpu *pdata); + struct device_dma_parameters { /* * a low level driver may set these to teach IOMMU code about