From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932069AbbJNHYQ (ORCPT ); Wed, 14 Oct 2015 03:24:16 -0400 Received: from mail-by2on0124.outbound.protection.outlook.com ([207.46.100.124]:62976 "EHLO na01-by2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751421AbbJNHWh (ORCPT ); Wed, 14 Oct 2015 03:22:37 -0400 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; From: Zhao Qiang To: CC: , , , , , , , Zhao Qiang Subject: [PATCH v12 1/6] genalloc:support memory-allocation with bytes-alignment to genalloc Date: Wed, 14 Oct 2015 15:16:03 +0800 Message-ID: <1444806968-4627-1-git-send-email-qiang.zhao@freescale.com> X-Mailer: git-send-email 2.1.0.27.g96db324 X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11FD012;1:w3RPIqhXf9fKG1VQaQAHUhr+CH363fNV6Jc39slxGZIxv3h+oOTVQnrCjChgl+UWC3Ljpn0LwSDil6ktgiW8JiuE09h78/Peq1kLg0uWcT15Q1eHUQQX26foqKTlJX8h9PJ08iem6TpufdIC5BTex6GQSzyPk+5RPtKIMICWRhjWGNG9Y6/TNgapTPpOgo2rNrcyi7iiVBHBE5EYjZPPBlGKdNjVviPCjQitTuknqtZ2jGQwlzCgqVl+sldhw9snLR9E5RCCRK9R7+8qrg0cBGrTQkrkscWbu4Ox+ZpQBEvuqGGPYCphw+2+WVbIb+IFT/JfWVO7nbgTnyDStwiqKBVBv+o80mBjFqFX/Ayf43aIZOPn3Jg4US2CCIzRuN0Q+H8gSann1PwCd4U746ferQ== 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)(36756003)(5007970100001)(92566002)(50986999)(50466002)(33646002)(4001450100002)(69596002)(86362001)(229853001)(2351001)(48376002)(85426001)(106466001)(5001920100001)(87936001)(81156007)(50226001)(47776003)(104016004)(189998001)(97736004)(77096005)(5003940100001)(105606002)(11100500001)(19580405001)(46102003)(64706001)(2371004)(110136002)(107886002)(19580395003)(6806005)(5001960100002)(5008740100001)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:DM2PR0301MB0782;H:az84smr01.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;DM2PR0301MB0782;2:bz1nb+qJm73vNuhAMqJHjxEvMKYnlx4C4mbIxkwdQ5DdQsfhKfAsx+SQ+Y0Oi4rrUTLeHvNm0b1Ac52uoALOG3eAaWcTEN6As9eirkhh4P628t7NGjo51beaN3p7CZneKvJe+vX7qjdD6x7zwt2G6bVu+WjSLKvxyeELHKsun9E=;3:Z+2Jk5t7gf1vIKrEqbHNLxQ63P8Ar36ZRy3wkhlkDTCGDDzrICll7+6NYXmc0c/apezF0ohdVzyn/TCWPwvIv6RQXcF0NqPDiY2e4DjPnWDodGI7JOovp0RbKS8aYhlr1m00bTvmdz3k5YE3EMoZOSjMQ0f71wXUYedwqahcjIJ+5kDzBY2MK8vSnfu2bf3F0GMHtg6GbMv+RXTySAmt43pih6YVGc5u4JydWIcnT4A=;25:ZB/sMTgiHUdPAAFSSeHySk7LYv/w4AK+NV6SkjKzm530//NxDZUu4WNYN3wdZzFRh27IlJZx8K2uPF+yJ3tM4+QXPMPouZDTHKqbTVHj6nFCVGTQzJ9n4QPHO/7B2dOZ5wigk+n69JCs68wQLv6WQW6WCXObd762jobGkAXNwYBhFcpC07tIpY4B6yNmWLE2fpLUN88tmNwFz27NWNYoiCgKMAZ6uf69rZ0bRl8DzOVDiCoiFrQaJchvX8nNRBxeoke+Y9zW8xr9e+gxL371Jw== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM2PR0301MB0782; X-Microsoft-Exchange-Diagnostics: 1;DM2PR0301MB0782;20:Fq33nAio5IYrsNNkCIfE7o94LOWLJ4cSZoQN7uQsuVO4TEFLjOICh0tl//yvuNy2FmQYw1JfJrt81t464DMT7pP9q4ZZu61nF/w6P7VshL+CUAqfYxus6SuO70BCLcAzJrlAEinfyh3EIElQyEB0SYRtCUNiYL7iEV4DySzP9SltHT+qMt6mSGZ/MTd3jg52IDFMdF30UI1/LAOwTF5MUpFJ8ITPBIUyqd0uyEE8rKs4HqnNd1OaQsOOCUaXeIIUBISswpRClsom6898qNxNb2tUqNUEp7osO0w5dH8yzNumQktxqKCrnGs0rIwphpxy/yNp1i5/YfUf+l4IhUB//Wi3LHnOtfgXmG9fXFbGDhA=;4:ttwIGJb9ElW3pSNT8eTA59q49bqppI5hNNBrLVPUmWELqVzuEKJ355LoQqLeM0fPFYm1dyoO0GVWzdrRoNFKIz/qxa5vgS0JDjczrGfbRN5JGHm8MS3xi6lcnf4nq8oesYfGPzTrX1bE2hJpWf7GeL9zEzX2TbNdX8c+pdqR2v27RWB+1f7fbjiytJxi+zj85XFIPx8nvRW0D8Z6pLJtexY2xJBbnZRh9h5R2isYqgJHbnZYEy0Rh0AJ3kOL7LqmfIWriYj4PjzGu+Wh+wBVAcI9J9aX02hww+7j3gk1UfCcJjPSgBxxbvn1FukOLBqBrwt+t9PHFqwDjq/wPVGX28Fas0UrnBS8vSKEpUHTI+M= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(520078)(5005006)(8121501046)(3002001);SRVR:DM2PR0301MB0782;BCL:0;PCL:0;RULEID:;SRVR:DM2PR0301MB0782; X-Forefront-PRVS: 0729050452 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DM2PR0301MB0782;23:O9oB0vyvoXDPcdbnWz3YTt61G8sRPOCF7gtZZgu?= =?us-ascii?Q?i+04oMBeH2Psv6YR/pb3R716mwcql8QiTnmlptBeDeVr5T+h1QR41bEWYs5l?= =?us-ascii?Q?GUmIYVAvIVgItLA1nA6nqJGL3aT+3nNxf12VjNQII49DG3s4LrIH5M/GH4gZ?= =?us-ascii?Q?m7WOUt8qXH5LGQdzIs1ol+gpoMr7O2/ZqRKP0cKyo265RnrOulN/SXAfe0X8?= =?us-ascii?Q?WAF+vSOxYyp4x4VIBMXKrtpDe/D8xsS+D9zwOsXuczA1SEoDqCSD3Tx82yrX?= =?us-ascii?Q?ouZo9AR2T/yMp4WvquknrFT7Wk+xSbap9MEt99K7FiwSMMwUn6AorhCYUfU0?= =?us-ascii?Q?mRw521tJH/9feS1tYtYYO1QlFtH4vQiBTSA8aMevnMisNybOhRsmbZW9FAhU?= =?us-ascii?Q?gSOyce3zGqjCQp67PnOyMDDXFd3GHYsHeNk7sy9/QA40mG+1MZOL31r96ZQu?= =?us-ascii?Q?5vitVBaL2D2rxwtKvbadSgChfaxRlMvn6t+EYqYxplZSA/vsXeRjHs2KDur3?= =?us-ascii?Q?8UiPqw0BV8BHEBrQF98z+UBe85qwRE/cxlankMzPhZVV3yQWNw295JQq49q9?= =?us-ascii?Q?bN8b1XQnKob5Jo16tA1soO5yvZEQo+XFhmAvNU/MTzHduHIVp1KFh+fAwvHh?= =?us-ascii?Q?5hGOdMc97Lsgnu4CtuInO3Bch4WkWiXVUsKE162qyj6a8eFV/aSE5V36wxQN?= =?us-ascii?Q?3muWfei/nVwJDwjy8N2PwUX4eIpck7cAmIIu1qF8UDvyuubg2X5PQQY8FXhy?= =?us-ascii?Q?iKCjIGy3Ep2IVI8AGdkAiZUG/hTtULQ+btbTMN2xJMjm+oLaaJOmHmvfhKfV?= =?us-ascii?Q?Xxe/4UA7J6Kb5PielQzeqqnI2eJXlh0zCv32t07Qvl4FDMtQpBN4Ub8Pkd/P?= =?us-ascii?Q?LkNTxXOVuV3bxDKUHrQo2mORXI4501ark45GtI/QkXXmt1cZ27eYWRlIsSVL?= =?us-ascii?Q?vIsZwHdDDdBpLH8c+wfMSpm12U+v2uWnKfa5ZL/no615WlI2iachtySQ/ryT?= =?us-ascii?Q?RLAlu2KGNJq1DaYccNEG+0Ttd6dq5Ud8JFUPq5ZsOU7HEBgqgWZvoo1erZoW?= =?us-ascii?Q?9QzkxdwU+QpkFVFwdt59zhY0PIaiz1joZNSeGd4uy2y4Q+pjlcfwGjKcIL6i?= =?us-ascii?Q?2AXUBMIuM4Nf0RAy7PFUhqfmfQ0qXQGeUbfgwqEP7inySByYHCyOsui7CXJv?= =?us-ascii?Q?+DggFgzCUAJe6Phc=3D?= X-Microsoft-Exchange-Diagnostics: 1;DM2PR0301MB0782;5:6PdTV4WM7az/xwFBZyfae0n7JUjXWE7WX7A1UH4Ao+a5dP2NXKisX4KXQIfnccmjvoh1lSein1KcS9AEcSuzsvLR0E0eQCYsIfEsr+nHubvKaEI6/+ZELWxRDW4+CutU8nj9Hk5EwAz5Hlv/O7JdSA==;24:y1NQPvTJ5Ck7CS/F5OnYjnC585BRFeqj1JyPUaQmu4gj0+mp0A2Fu5orlv5UyrlVjNGTClGggbPXZG+1YxFJgY4ZtoreawUlK0qZEYX0iVU=;20:oBT0px7SkyxgDrBexR4LDCw1H9eOHqkdkfOVtolUAgdvYK/Z42JCrkmGJ69W20XckscH+rC2ShyFaiPs+NoOKA== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Oct 2015 07:22:34.2955 (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: DM2PR0301MB0782 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Bytes alignment is required to manage some special RAM, so add gen_pool_first_fit_align to genalloc, meanwhile add gen_pool_alloc_data to pass data to gen_pool_first_fit_align(modify gen_pool_alloc as a wrapper) Signed-off-by: Zhao Qiang --- Changes for v6: - patches set v6 include a new patch because of using - genalloc to manage QE MURAM, patch 0001 is the new - patch, adding bytes alignment for allocation for use. Changes for v7: - cpm muram also need to use genalloc to manage, it has a function to reserve a specific region of muram, add offset to genpool_data for start addr to be allocated. Changes for v8: - remove supporting reserving a specific region from this patch add a new patch to support it. Changes for v9: - Nil Changes for v10: - Nil Changes for v11: - Nil Changes for v12: - Nil include/linux/genalloc.h | 24 ++++++++++++++++---- lib/genalloc.c | 58 +++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 73 insertions(+), 9 deletions(-) diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h index 1ccaab4..aaf3dc2 100644 --- a/include/linux/genalloc.h +++ b/include/linux/genalloc.h @@ -30,10 +30,12 @@ #ifndef __GENALLOC_H__ #define __GENALLOC_H__ +#include #include struct device; struct device_node; +struct gen_pool; /** * Allocation callback function type definition @@ -47,7 +49,7 @@ typedef unsigned long (*genpool_algo_t)(unsigned long *map, unsigned long size, unsigned long start, unsigned int nr, - void *data); + void *data, struct gen_pool *pool); /* * General purpose special memory pool descriptor. @@ -73,6 +75,13 @@ struct gen_pool_chunk { unsigned long bits[0]; /* bitmap for allocating memory chunk */ }; +/* + * gen_pool data descriptor for gen_pool_first_fit_align. + */ +struct genpool_data_align { + int align; /* alignment by bytes for starting address */ +}; + extern struct gen_pool *gen_pool_create(int, int); extern phys_addr_t gen_pool_virt_to_phys(struct gen_pool *pool, unsigned long); extern int gen_pool_add_virt(struct gen_pool *, unsigned long, phys_addr_t, @@ -96,6 +105,7 @@ static inline int gen_pool_add(struct gen_pool *pool, unsigned long addr, } extern void gen_pool_destroy(struct gen_pool *); extern unsigned long gen_pool_alloc(struct gen_pool *, size_t); +extern unsigned long gen_pool_alloc_data(struct gen_pool *, size_t, void *data); extern void *gen_pool_dma_alloc(struct gen_pool *pool, size_t size, dma_addr_t *dma); extern void gen_pool_free(struct gen_pool *, unsigned long, size_t); @@ -108,14 +118,20 @@ extern void gen_pool_set_algo(struct gen_pool *pool, genpool_algo_t algo, void *data); extern unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size, - unsigned long start, unsigned int nr, void *data); + unsigned long start, unsigned int nr, void *data, + struct gen_pool *pool); + +extern unsigned long gen_pool_first_fit_align(unsigned long *map, + unsigned long size, unsigned long start, unsigned int nr, + void *data, struct gen_pool *pool); extern unsigned long gen_pool_first_fit_order_align(unsigned long *map, unsigned long size, unsigned long start, unsigned int nr, - void *data); + void *data, struct gen_pool *pool); extern unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size, - unsigned long start, unsigned int nr, void *data); + unsigned long start, unsigned int nr, void *data, + struct gen_pool *pool); extern struct gen_pool *devm_gen_pool_create(struct device *dev, int min_alloc_order, int nid); diff --git a/lib/genalloc.c b/lib/genalloc.c index d214866..b8762b1 100644 --- a/lib/genalloc.c +++ b/lib/genalloc.c @@ -269,6 +269,24 @@ EXPORT_SYMBOL(gen_pool_destroy); */ unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size) { + return gen_pool_alloc_data(pool, size, pool->data); +} +EXPORT_SYMBOL(gen_pool_alloc); + +/** + * gen_pool_alloc_data - allocate special memory from the pool + * @pool: pool to allocate from + * @size: number of bytes to allocate from the pool + * @data: data passed to algorithm + * + * Allocate the requested number of bytes from the specified pool. + * Uses the pool allocation function (with first-fit algorithm by default). + * Can not be used in NMI handler on architectures without + * NMI-safe cmpxchg implementation. + */ +unsigned long gen_pool_alloc_data(struct gen_pool *pool, size_t size, + void *data) +{ struct gen_pool_chunk *chunk; unsigned long addr = 0; int order = pool->min_alloc_order; @@ -290,7 +308,7 @@ unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size) end_bit = chunk_size(chunk) >> order; retry: start_bit = pool->algo(chunk->bits, end_bit, start_bit, nbits, - pool->data); + data, pool); if (start_bit >= end_bit) continue; remain = bitmap_set_ll(chunk->bits, start_bit, nbits); @@ -309,7 +327,7 @@ retry: rcu_read_unlock(); return addr; } -EXPORT_SYMBOL(gen_pool_alloc); +EXPORT_SYMBOL(gen_pool_alloc_data); /** * gen_pool_dma_alloc - allocate special memory from the pool for DMA usage @@ -500,15 +518,42 @@ EXPORT_SYMBOL(gen_pool_set_algo); * @start: The bitnumber to start searching at * @nr: The number of zeroed bits we're looking for * @data: additional data - unused + * @pool: pool to find the fit region memory from */ unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size, - unsigned long start, unsigned int nr, void *data) + unsigned long start, unsigned int nr, void *data, + struct gen_pool *pool) { return bitmap_find_next_zero_area(map, size, start, nr, 0); } EXPORT_SYMBOL(gen_pool_first_fit); /** + * gen_pool_first_fit_align - find the first available region + * of memory matching the size requirement (alignment constraint) + * @map: The address to base the search on + * @size: The bitmap size in bits + * @start: The bitnumber to start searching at + * @nr: The number of zeroed bits we're looking for + * @data: data for alignment + * @pool: pool to get order from + */ +unsigned long gen_pool_first_fit_align(unsigned long *map, unsigned long size, + unsigned long start, unsigned int nr, void *data, + struct gen_pool *pool) +{ + struct genpool_data_align *alignment; + unsigned long align_mask; + int order; + + alignment = data; + order = pool->min_alloc_order; + align_mask = ((alignment->align + (1UL << order) - 1) >> order) - 1; + return bitmap_find_next_zero_area(map, size, start, nr, align_mask); +} +EXPORT_SYMBOL(gen_pool_first_fit_align); + +/** * gen_pool_first_fit_order_align - find the first available region * of memory matching the size requirement. The region will be aligned * to the order of the size specified. @@ -517,10 +562,11 @@ EXPORT_SYMBOL(gen_pool_first_fit); * @start: The bitnumber to start searching at * @nr: The number of zeroed bits we're looking for * @data: additional data - unused + * @pool: pool to find the fit region memory from */ unsigned long gen_pool_first_fit_order_align(unsigned long *map, unsigned long size, unsigned long start, - unsigned int nr, void *data) + unsigned int nr, void *data, struct gen_pool *pool) { unsigned long align_mask = roundup_pow_of_two(nr) - 1; @@ -536,12 +582,14 @@ EXPORT_SYMBOL(gen_pool_first_fit_order_align); * @start: The bitnumber to start searching at * @nr: The number of zeroed bits we're looking for * @data: additional data - unused + * @pool: pool to find the fit region memory from * * Iterate over the bitmap to find the smallest free region * which we can allocate the memory. */ unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size, - unsigned long start, unsigned int nr, void *data) + unsigned long start, unsigned int nr, void *data, + struct gen_pool *pool) { unsigned long start_bit = size; unsigned long len = size + 1; -- 2.1.0.27.g96db324