Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751737AbbGIIZ6 (ORCPT ); Thu, 9 Jul 2015 04:25:58 -0400 Received: from mail-bn1bon0138.outbound.protection.outlook.com ([157.56.111.138]:33528 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750915AbbGIIZy (ORCPT ); Thu, 9 Jul 2015 04:25:54 -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: [RFC] genalloc:add an gen_pool_alloc_align func to genalloc Date: Thu, 9 Jul 2015 15:47:43 +0800 Message-ID: <1436428063-893-1-git-send-email-B45475@freescale.com> X-Mailer: git-send-email 2.1.0.27.g96db324 X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD030;1:5xPk4UO7mBn0+V8AqwSOV2ObEHHp9grUi5iHkvXMAKz9nB9oHe9npo4+btfF/pMYn1PPMWDVUws4SqF+nuPhwB/rL3qJ9c2+XiXbV4mNBGRhx5d1ujI1Hwb97vR0zG295HPOdlZxUQTkJaqX4ZmEFNm5O9I4syw0e5tqJaQ2cljkpsgUKburQMeiPtMcOz9fgkSf2ziXMD1ltPvDvPfKzeMeowyiOyDL18DX/U8ZHl/Z0KfJYg9hOvtnsUo0inOrHo70cGYcFMUoXJqXu1ufIvi65OTcUYDjc/loicA3yP3Z0VUV22DZK+oUGXyQ8fanrY6tMhnDo+16RUCqLYs+6A== X-Forefront-Antispam-Report: CIP:192.88.158.2;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(339900001)(189002)(199003)(105606002)(50986999)(19580405001)(19580395003)(46102003)(87936001)(50466002)(47776003)(50226001)(48376002)(6806004)(77156002)(62966003)(92566002)(36756003)(77096005)(85426001)(5003940100001)(110136002)(107886002)(5001960100002)(229853001)(2351001)(189998001)(104016003)(106466001)(42262002)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:BY2PR0301MB0776;H:az84smr01.freescale.net;FPR:;SPF:Fail;MLV:sfv;MX:1;A:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;BY2PR0301MB0776;2:fN+Nmi6Mvlmt//MVtGG7mHH3j34ZkZ/4JGx0srnLo0SbZVeJ8AfzRUOrpBCyRU8Y;3:K+ppIcuJ2i4N9aJ2YNWwurACDcv7aEQS6rjXufv+MQuC1bko2k/VcRa+1UIKTayiyyBF/GQcZQqiu+6NfffljHszWXFDmJGjE0Zh6RTlTyYm/r7dLewjYoD2QWeqHuf3so2j/zpLCKx4of4CpCA0n2A3nUvF0ASiA1n0Se8pqdYJ5KlfIvKdEkhjBmkOBQpzGZPKNVR7uou/+LSOOxz80jIrx0HbC5kuExMoiJ8PJT8=;25:UT4bYYGNyGMJhonW+9GaZaDlOLgyOXPM7401sCnotFUoGJSE++AvR70EVlritpBsp0TxjL0bop1XMqejn3gD2QsnoHBXHzHBA0QpTvw1KVTqqUyCXkOr8SCYtPKZuIMQ6I+L6saOSFQTIaF3QHTfQ4+4XBKbV9LydO2Q2iHQoi1x+8AInKokvLTsrjNNsCrokKimPcRii1c/ygvORxXQWKwPR2XleV9njcxDtiqiew7aVC6cHkcRzQaqtbSAhIQA3+atWcaZr0T76x2TpyCvkg==;20:FaLHCx/GgVD2/YVQINur9xIz87KnwFrBWc5u0PPNcPj88VLTipPw9S0eH3eDHjkekNT2eYsDr8XYlFvXCpDWkzV5xemwrq4d7KkI5at3e0gNZNBOhfNPdkmqeAVnZ0yfMhJTOs3pHP6VkAvMtQUdJDP0Et+1EI2geobLD3ZamND20SimnxIrd/uWi+55X207zcJ9Gd7AGD0/G9EI/xsjb5ZpAOEFMEOFaLYucskTFwUOHnhJXEfcDhca0m7/lxoPTVYSgyXJyoCtnQTW6dgB313JXbxscUaDYXxYYymVct9i1XHMAXgy+3UU43ShgswyXmDYmqYvoKHU11D6v2vtcbvpJtMbW3hKwi1iPhS1OCw= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR0301MB0776; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(5005006)(3002001);SRVR:BY2PR0301MB0776;BCL:0;PCL:0;RULEID:;SRVR:BY2PR0301MB0776; X-Microsoft-Exchange-Diagnostics: 1;BY2PR0301MB0776;4:7ACFxYCSKz4lt8fto3ZeC8vlVYFK8tST0tHmFnPLLB78dylLf9CLWuskp1urj3obvpKk13yWI0tjsPI2O5bKA/0TimY2ThIiLDMCEHgi9Yf+ovqt1N9sotLwGtjImsYCEjA7c8N+D8RvVqCkahQvhZg/yE4xeJ1E9SCAeOdmtThKVT6ySafctS00h4S4sYme/U+ej/M1aypLtDOsZIEhciqCRhhJEI+JLDR/cx3SDOTQk2RmI/A/CgHlYaBaM0cNSno+fF1yMHcoTDIq+6dgy2EH6bKFOOi1dHxXTVtAhzA= X-Forefront-PRVS: 0632519F33 X-Microsoft-Exchange-Diagnostics: 1;BY2PR0301MB0776;23:OvCuKBSu/DTC0ztf0RnTFlA4T0QbQSNzZXyUE41t4vcxiYgkOpmVBUA7uoDAqIo5X+EYtVU+YV7ULkRlH6IYmgxplt2jVtdLMzda7Qd2BqDzyAOHDCouJ32aS6YUzOvoVT8j3HDDj88mNmDltCVli5CHMvDt1p7WECmrcneISb3+6/IF/GFHQU7r/LE1uEj8ZuQuV0MbN1CUOW77AwLqbKrRJCYfCoytCaoOqKrlKwc6VFFRCanQBOuVwWeQWDIJGdgZDzzQ4ZpeykBWkWw5j6oaZJxd94oRfra20flrEDsEDnXiFdqFuLeblQUuAy7Wy7JBj6sxvteK/BjdWDYUh74juffZZiENZqitoPeyr7ETgS7kQ9URlttCFFFhKpW4ROBIuzZR874sZId6Okl0ffmWR0NqnLG08F3C1Ochy+JXg6c6POPRIbbVwBgJSt4PSALjXd+Po9MOv00njQPxhoyinf0P0RsUR4keCtAsQufHVlDSWsQqpIeBCKbcHwc5e6FgXWTp85mxGjWK/iZTbqvdkochLpqfpkxu2oQHxYhIYXbCz0i21hdEAvhePJ2Q3kTm1b7ONehPZoZCz70pMvtavxWUTMPBQnPL0N0sABjajI67AEKP96IjUuwz8HH+naR/lXpTtFLYDeHhn6GEoJh5LoD//dy+4dxBeV6bA/HGA6TJMqVavtdRJBrwD6tBQ14fzCU8Q73QbeAkdrC/3xaqPyAImMdEj4OIa8bS4Mhzi/lw++Bl+hIEW41T1ILGq01uFbIipYfZ1qOjFoHz9Vy95DSmU1B4/MoImdZ6cr2dv6cjFThgTWrkhcuDFA0ieGLxMOhnFl1XWFJPpYkLe7bD2qrQ77UeT50ojawFm4m6/Tb4GcHbram6uavNREh61dapKfLxRZasidCeif8v1A== X-Microsoft-Exchange-Diagnostics: 1;BY2PR0301MB0776;5:HvmcHCiFZO+XDwGThjmgrXBLG6oRlJjjCYX/IvmpJQB9h+NwKohJhD8dRB0F/YuOJMLZA6aWtkEv48sfMO1NoWd/+LL5P3lwr4svdUIcU6oxfdFbde5ue//5Cha6SyiC74rGOw9Vhtz+aK7nb6Q5cw==;24:Dy3m9/my0+xrlRerAH3KtFX0/YxMCJX27u/tt4xnmFbprUoaZ1mu2OMYAoCPlIDTKYnlf3DKH0XXJg+nldPY8ySYGovdejxt2eFFtXXQwc4=;20:2lSAv0QaTFj3f86OwsL59fzXRuCgyiD5NH3BYlZOwY+BuRsEQ8AIKb/6l+QvKjdHTceQduh6bD47mlUgBCakYw== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Jul 2015 07:52:27.3023 (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: BY2PR0301MB0776 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6506 Lines: 170 Bytes alignment is required to manage some special ram, so add gen_pool_alloc_align func to genalloc. rename gen_pool_alloc to gen_pool_alloc_align with a align parameter, then provide gen_pool_alloc to call gen_pool_alloc_align with align = 1 Byte. Signed-off-by: Zhao Qiang --- FSL's IP block QE require this function to manage muram. QE supported only PowerPC, and its code was put under arch/powerpc directory, using arch/powerpc/lib/rheap.c to manage muram. Now it support both arm(ls1021,ls1043,ls2085 and such on) and powerpc, the code need to move from arch/powerpc to public direcory, Scott wood hopes to use genalloc to manage the muram, after discussing with scott, we decide to add gen_pool_alloc_align to meet the requirement for bytes-alignment. include/linux/genalloc.h | 10 +++++++--- lib/genalloc.c | 38 ++++++++++++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h index 1ccaab4..65fdf14 100644 --- a/include/linux/genalloc.h +++ b/include/linux/genalloc.h @@ -96,6 +96,8 @@ 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_align(struct gen_pool *, size_t, + unsigned long align); 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 +110,16 @@ 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, + unsigned long align_mask); 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, unsigned long align_mask); 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, + unsigned long align_mask); 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..dd63448 100644 --- a/lib/genalloc.c +++ b/lib/genalloc.c @@ -258,19 +258,22 @@ void gen_pool_destroy(struct gen_pool *pool) EXPORT_SYMBOL(gen_pool_destroy); /** - * gen_pool_alloc - allocate special memory from the pool + * gen_pool_alloc_align - allocate special memory from the pool * @pool: pool to allocate from * @size: number of bytes to allocate from the pool + * @align: number of bytes to align * * 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(struct gen_pool *pool, size_t size) +unsigned long gen_pool_alloc_align(struct gen_pool *pool, size_t size, + unsigned long align) { struct gen_pool_chunk *chunk; unsigned long addr = 0; + unsigned long align_mask; int order = pool->min_alloc_order; int nbits, start_bit = 0, end_bit, remain; @@ -281,6 +284,7 @@ unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size) if (size == 0) return 0; + align_mask = ((align + (1UL << order) - 1) >> order) - 1; nbits = (size + (1UL << order) - 1) >> order; rcu_read_lock(); list_for_each_entry_rcu(chunk, &pool->chunks, next_chunk) { @@ -290,7 +294,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); + pool->data, align_mask); if (start_bit >= end_bit) continue; remain = bitmap_set_ll(chunk->bits, start_bit, nbits); @@ -309,6 +313,22 @@ retry: rcu_read_unlock(); return addr; } +EXPORT_SYMBOL(gen_pool_alloc_align); + +/** + * gen_pool_alloc - allocate special memory from the pool + * @pool: pool to allocate from + * @size: number of bytes to allocate from the pool + * + * 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(struct gen_pool *pool, size_t size) +{ + return gen_pool_alloc_align(pool, size, 1); +} EXPORT_SYMBOL(gen_pool_alloc); /** @@ -502,9 +522,10 @@ EXPORT_SYMBOL(gen_pool_set_algo); * @data: additional data - unused */ 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, + unsigned long align_mask) { - return bitmap_find_next_zero_area(map, size, start, nr, 0); + return bitmap_find_next_zero_area(map, size, start, nr, align_mask); } EXPORT_SYMBOL(gen_pool_first_fit); @@ -520,7 +541,7 @@ EXPORT_SYMBOL(gen_pool_first_fit); */ 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, unsigned long align_mask) { unsigned long align_mask = roundup_pow_of_two(nr) - 1; @@ -541,13 +562,14 @@ EXPORT_SYMBOL(gen_pool_first_fit_order_align); * 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, unsigned long align_mask) { unsigned long start_bit = size; unsigned long len = size + 1; unsigned long index; - index = bitmap_find_next_zero_area(map, size, start, nr, 0); + index = bitmap_find_next_zero_area(map, size, start, nr, align_mask); while (index < size) { int next_bit = find_next_bit(map, size, index + nr); -- 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/