Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754199AbbHXJvr (ORCPT ); Mon, 24 Aug 2015 05:51:47 -0400 Received: from mail-bl2on0127.outbound.protection.outlook.com ([65.55.169.127]:22288 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754162AbbHXJvp (ORCPT ); Mon, 24 Aug 2015 05:51:45 -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; From: Zhao Qiang To: CC: , , , , , , , Zhao Qiang Subject: [PATCH v6 1/3] genalloc:support memory-allocation with bytes-alignment to genalloc Date: Mon, 24 Aug 2015 17:31:41 +0800 Message-ID: <1440408703-6113-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;BN1AFFO11FD046;1:XHoA2qXuqcQqDVN5qmGOY3xUrGoU3p4hEykO0rqFY8HUpfJcjUlZ0VrLD2lFwakBTXPtLMD+GDIb0KCwc3FUtamFhQcVo8iOpzKSkB0s4DdUKn4hPpcJB8bkGd5ipMMC1KqRl9BNvGGbw7O383O0KnyOrKpfb6DsjySLhzjm2ASwfjtatyb+b5K20G1+8qldjOuhgW/DFIh2YecSe0xpbIJg9kTT2vMdXqxeDZ7LV6hwlEj/h0gmzJnKL1nQ9mQmabtHfghASZMmgeDlzuYL4oPTYd+tPXJhqv/DcOr4wc05EWG4S6zXxILWWRPcPdQNquw76grZ6y1n2CmICqfgsIjZXCUMyz5L42aypydfsFaR5NNYwfS+AMFUS/SFZJyNAS8jAX19Gy5e2cxzU5WWZg== X-Forefront-Antispam-Report: CIP:192.88.158.2;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(3050300001)(339900001)(199003)(189002)(5001830100001)(2351001)(86362001)(97736004)(64706001)(19580405001)(77096005)(5001860100001)(47776003)(77156002)(68736005)(33646002)(189998001)(229853001)(4001540100001)(62966003)(81156007)(104016003)(2371004)(107886002)(5001960100002)(6806004)(50986999)(87936001)(50226001)(48376002)(69596002)(106466001)(50466002)(5003940100001)(110136002)(36756003)(4001450100002)(19580395003)(105606002)(5007970100001)(92566002)(85426001)(46102003)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:SN1PR0301MB1550;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;SN1PR0301MB1550;2:UUSanw2KTZutHWu9bqpyJ2r1CBJxujKQwzxH4CGf7/6afl3MW0LpOGMPjJoyYh3h+JNPmVWy9k3i4ff0MgWQOY9s+GE6M0WMXL9OKyGndtNuwAnrZkVf9qXtIBANfNkXQCI2f65cGB5wzD0iCTz/YnXgA1q9HERehpje267Pma4=;3:NVzjq5svPZ+CDJRkyNHFQUTbYCzqorlsrmFdVr/P+RiYvkWPfM9cP5pHDHJd61hv68offaXz14q4dQ4D5T04NKPIoGZRvPKKf/sv+2U43BS9j3ZcUV19b4Tsk5x/0P/cBohR6FmKmhSs6BF3r32ffZbNyWaVJzLMsHHzcSlKC0njvfm9SqRncYJlA1x5oDn+8yWLmmaGfkvtHvwJLU3HIQnI1ErNDG3ntxmi6NGbEEA=;25:+6u6DhT+nJNxj/xO/WXErRqjyF2PJWnsHz9QS4wjKcSVH2oJGWtvm4WvHicRaCXtNw5UIjy13xlkHSd61beE2OBarhbiINkx2oFIHHClrMb/6htpA436pqnqlKFZP6y4Rq+1+i2EHWH2VE63a0yW/1C5QGAKS7DlXaJ8ov5SsBglIz61BKAYH1LLxFMeUFrzXejiwUoevtAmk2z8dFS2n11MRv/tEoadRQVVxEp56txy2af5xhe+LVVS9PdZqxCVUKCB5bb17CRThkj+NvTT0w== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR0301MB1550; X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1550;20:RY7bmLaTLZfqNJe9M5ZuIpWHt7dpDXsSlCIBcCoYnDAHillyghOUHNgpyOP9rdEVUgMbZL/xLL2ZMcf+S9h/hzBGbBq6n4cJgzriTNKi0F/yHoBdnB5sUMuDsr2lI9Ndr6nurB7C5KMeaf28lxWfL9Y+viu7f2Qo0ob5P7Cnw1MdIdaypJ5fwtOooFWxKQyWeGe5QVnI7aN6NvZyjQDdChbEjBR82DzKK2dO79AT7m+8H1dy7eqoZW6zSH912+VUZNubqdgOZ4HVFI5svpKCBg491SI5hN06wQ1D8if5unSMKvYOwfNd384ZayFsQkPronRxfbOLAnYIkvKg0hYTo/nF7+96Q26pUHoNM2rYqKI=;4:WvaR5egTMXQCh+JsXGoXWgpoRmv0iv3Uoic12VQ4q2zOLUGjhngSXienCODouZijr3GPSC00SuqAsudkvp7sO8nBAMg+YJFoBrPQ8ublAbYPQYBrlgj6E7uDYVInJL2+3aKuvoISRjvKApeETTu2QiT0FoPvGer5jGlbcdDa9LpGXzuI0QlMqWYfJPvf7X22q8+onZhhU/jMsO9ovO9cPBsJ8yZ2YNpdzlm2vhCcMWoqMAkeTvQyX92AsqLiLcN2C8XGRNfmBF9QYP0XghlIkmsUoFSen4cU5PPiarMzBpvAeuRSBiS/OGmZKEzotfT2 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(5005006)(8121501046)(3002001);SRVR:SN1PR0301MB1550;BCL:0;PCL:0;RULEID:;SRVR:SN1PR0301MB1550; X-Forefront-PRVS: 06780E24F8 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN1PR0301MB1550;23:XiraBiErlVPYd9XTKk9shoZDIdb2RQR7kqIgV42?= =?us-ascii?Q?7LVpzsK0be9wwCDX3MMkl8zNqDoowh5lcsOb7trbWrHloIkL/uXlcBVroSV5?= =?us-ascii?Q?hR78hsLPbxeE+uTBSy6OFSv9yc0Acg2TjfBll3b5sWkozEZoZytjI74+FJO1?= =?us-ascii?Q?sN+Dgj9usNEJ4NOZo/HCy6hmsdW2ofjmZ0GmgSdUs8R4XgX0RXzGmhuwDHHk?= =?us-ascii?Q?EgxRsvOCtb0fhVDGD5+sgok35tLjjaQF1HDWirFUlfabkQXhB2rTD3sLDUen?= =?us-ascii?Q?+IWiwjdHA6mAz4H+/UA9YgR4/3Ta9dRhEvmxv04F9DJ89xQnXz/SG519+SrN?= =?us-ascii?Q?W1r8XNks+X/VijaD1Fbs7bqobQJ5BActTz6BeLOSALHD8IWj5yrugOKpwyIN?= =?us-ascii?Q?G3Y2pBXxdU7jvghh7xmf6/jc8abw5+sb1PdredBcJY5Hetjicdm23g1yo7j6?= =?us-ascii?Q?vQV0BVvow133TVlxOFHw15RmVEaDTJQFoEwJe1z2IzicRebCKalD+ZGtGUL0?= =?us-ascii?Q?e831iOU/plERe8uHWwsobth3g60soyYYEi1w3b4DM0IpyO4JuY8dDWazPmq5?= =?us-ascii?Q?bOd+aiX9sKb+Ahkvp0QGHfyAkAra1HkfbAC0FigvXkzO0nFkz12IiWmGNu9Z?= =?us-ascii?Q?9ruPyVrRhB3scC0S6R6bWXKWIc9adScx1OSkUhfWRVreC6VyAa9iW0bpa+LD?= =?us-ascii?Q?UrOoLPH7C78nI1ISt8UmutFbrCvg3OAAxqMU2dARQu6OT5FALRBjDeiO5TMK?= =?us-ascii?Q?K7VZXymptze4Crgy1az3uBilqZ+divATfQCHFBMRj9/YVOSiGdcdqrRIj69Y?= =?us-ascii?Q?o8cLcNBdW++dX9PzYBzGXMs7ob2NNIvmUYb/EUCNCriT0lO6j1+crdwXAZqF?= =?us-ascii?Q?I88bhbAK6oq3pZ9OihK4y6D6IMgeCf/skLeoxWt5ZbkNrv7+JdqYFd1g81y2?= =?us-ascii?Q?d3pnSrXGpJu45ltcZoIvZ2D7ZQm6vOz//cj2qZOxdrJedH+o07Dp92K2XV3z?= =?us-ascii?Q?+9CQb/jfhPMOG15vrj6S31L5iK75kQIC8R3JaE6ziA1H04NVpdGHpZsOl80P?= =?us-ascii?Q?5cM12XjsFkqShtdehF+QXOF2reyNK8NTJaBrDHNQwS/bGNB/2QTGXGWGGEml?= =?us-ascii?Q?vE0T/UohXoWP5CRDtIQr+GNUosPy74dxiLZAm5AUSY6r4H5dPiTUj76kNPM4?= =?us-ascii?Q?lC8av4TcAhBHedrV7t9mFW3nedz1CXjkyV9jhMqZ6biE9Zu9y6FU9Xi8V2YH?= =?us-ascii?Q?DxFvCDyWdgSxo1bFJ6lM=3D?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1550;5:CyzMqMfavJD4tsx0cvQcriuzCJ3XRs+C9jYbwsA5aFO2cyAkTBSz/o68Ad0jMLipUGLrlav0jCJ0aJqtqDouioIG3mgIeO52pfic+hrm0uNdRHPFWAJf0fmaHVwLnndgVfgCnVNAONTprX0XD0OFPw==;24:LNnVgyB1qzhq+RFBrTD/WPYQYB/gQUkKzXKEiDCKqzpANnjygKp1e0V2gKm44eRZnDxZCKkyhbCm/5hkSZVE1ovabTwAmnz81F0WTJ/GEF0=;20:0V/LX+EjpIPfazIZj51hbtT/6WH4tKwOmjSSIAtncs4jVvjrmTqI8VQHvLE29GOzFIHoaXcokqdtGCNrdDOzSg== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Aug 2015 09:37:17.0952 (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: SN1PR0301MB1550 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 7692 Lines: 211 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. include/linux/genalloc.h | 23 +++++++++++++++---- lib/genalloc.c | 58 +++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 72 insertions(+), 9 deletions(-) diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h index 1ccaab4..55da07e 100644 --- a/include/linux/genalloc.h +++ b/include/linux/genalloc.h @@ -34,6 +34,7 @@ struct device; struct device_node; +struct gen_pool; /** * Allocation callback function type definition @@ -47,7 +48,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 +74,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 +104,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 +117,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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/