From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755138AbbI2CaS (ORCPT ); Mon, 28 Sep 2015 22:30:18 -0400 Received: from mail-bn1bon0146.outbound.protection.outlook.com ([157.56.111.146]:9805 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753331AbbI2CaP (ORCPT ); Mon, 28 Sep 2015 22:30:15 -0400 Authentication-Results: spf=fail (sender IP is 192.88.168.50) 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 v11 1/6] genalloc:support memory-allocation with bytes-alignment to genalloc Date: Tue, 29 Sep 2015 10:09:16 +0800 Message-ID: <1443492561-11538-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;BN1AFFO11FD050;1:Lja/lFbi8l49FbKVGl/YZa9zCvhIfNKEX8Hw6jbrrNf0sJq3NLe8ZDuoYB3G/h9ISjugSnI403lZfrXWp/u+ca4vxln8j46LBiNiATadQ7l14MZqm08SQ23Ma9sK8mv37xgOBvnh3ABppJ0XnxJS9c08KUzt8z/+hHJV3/77toAG54sdeIjAOMcw8J82XlOCkiCjXwB8IbrmXMeQ06NTwpUT6IRlyC28+ENtw2MxEJXCbG65KaCoWo9xm/ECsZJPc46GsDqj2hSUuP3t0kzjDtqlZ3b13QvvH+LXynDYgnwzXybKkNfLPBt7tlH6yXJq3gLpz/vVzo10ftM3SfDKSUL+BMxK2uIgEhkLzQhVbvkfCm76/h6IhiX+HZ83Av42rPrw3hNHJY+Q9korHdCsJA== X-Forefront-Antispam-Report: CIP:192.88.168.50;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(110136002)(62966003)(97736004)(46102003)(68736005)(11100500001)(36756003)(5001960100002)(2371004)(107886002)(189998001)(4001450100002)(64706001)(77096005)(5003940100001)(86362001)(5007970100001)(106466001)(92566002)(50466002)(19580395003)(2351001)(47776003)(105606002)(229853001)(48376002)(33646002)(87936001)(50226001)(5001860100001)(104016004)(50986999)(6806005)(77156002)(85426001)(4001540100001)(5001830100001)(81156007)(19580405001)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:BN3PR03MB1478;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;BN3PR03MB1478;2:ad/plgryY3yrfE7ZVFU0qr9AvHPASqtFEJYGVbXh4F1+csAZopiBQ1RahBvCZhVMFf+ZYhdG1arn8ek9diq+iVYYjgxm4VOmjz0Qc/+bHR95e7T0qkYtuloQ9OXXHB4k3FUWj+oGNXlEvhnz0/RRnxYjowp4/svhn6FuzfxGq4E=;3:/Y5Lgf33lE0wRt6BRWqtEmmQIIvcHntHF1IB7BPRZwH9Z4Inu9rmVUq6Zy/y8EsiTqRCv9HaT19HDPHdTpIUerqGizKKkiHxIqMwWNDeV4LarD0LsQnfUrs3LJh1SLzAqbXSnnuUa9wk+NKTIjfZJRXt7TY+iw/2fg1Piu4SxKTW/o0I5iCEEfHn/Gh2IeP+/Sq+ZuCVEujatvmZm/Kjwu2K2sCIDP+YnKOrmYQZ/SU=;25:L7HeUbu4Uig6uBn5AuIBlAzlRB+9D+3TRI3cAT77WGsCH5kbj/kIuQfS/ElAXGwHeG7Y7Kn6ur1YvyhxI/oipSGuuwg7QL9xQ/Tn7GxzLmoTPhXZIhMYwBxNwJBeKnCRK+dQpXzMRFpORHE/uubmQr8y5mI9l3D9l24S6uT7icy2BK08AWxoDIVC3iRwUayvgX7+UZPzGcdaRw21KsvDMD1DI0ma2urwN/o/Y7jrERMkxeQADlmqsLXeUE67Lq3DKgkY/Q1mqqw+GrzBA53NKg== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN3PR03MB1478; X-Microsoft-Exchange-Diagnostics: 1;BN3PR03MB1478;20:nT0iVMo6b5QZHgxrFguSlJyvQMmw1vGmQBO5nySrMB6y2wsJ6ikz+YXkAUSqvIxljPRZZukBB2Q5v+Yeg6WaFPwEoAOKVTlyUXs3/BQCrSjJGgueqGA+/hZfMBr6BrufS6dOxT33UmIjkJDTZaFXNbpcpSEfS1Q5mqi2Hs9OG/CVAaR5INFFCYK9sBcHJuMzSDpsCnBIzmyB4DU80CdRo5w4DRXpHUsVAhuVoKgXuLvoMpE03N8QlgWe2Bu3hPCP8wJkqqOuW6URLFWjA1iJwE31NrTGwxmji4ww4dnKkoEEz+lSkisDfzTr1UgbTJtnj4d4YYJYxXgMNHK7j/jlYEk/93LlivhDE4zzUgWW77I=;4:2RZIz9I+8Qg0/W6ccsuWsvkl+sJfywMR85W9W0uEj1nPhgN9gc31X9QnNTOoJ0fiafyB7MMO8M4E+YpPd1fYZ/NtV/t6ad6vNl9Ur1o3arIjGxMWcB64/AC+z53Gkj20aJObE1Zv5Ee84hSP7b+BCk8nyPB0T8yropQwAPjo5SrPJVPksdbKrP1W4glRIGwsmQg3gKl374yls3vZn8gNFB8Cgw8GzexozvJBXFFwWjlSSFnkNx9+KVo/yMPUi2IEWgCCVgijrREK05oX5GQ2/9TImdY+p5HwDKlHdXk66PrZGVTdI/kJtPReY/4PlXGIRwXkNlhx/nvnY07Fxbuw6jI5eyc0zC81j0IDfMneER8= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(520078)(8121501046)(3002001);SRVR:BN3PR03MB1478;BCL:0;PCL:0;RULEID:;SRVR:BN3PR03MB1478; X-Forefront-PRVS: 0714841678 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN3PR03MB1478;23:aBAlunSLPPy+xuRBO1WdDWfHwKa7UnmkVmeHeght+?= =?us-ascii?Q?2+0JDTMdEFCO93MrR1wSTM05cNpj+z13gPKCLmsEoSmCMYGz9+3fS804So+m?= =?us-ascii?Q?mIUcCkP3kTWt8t3paqI9UlMII0uaFBgJSZABz4VK716fYpR/uBgx1XAo94ua?= =?us-ascii?Q?usERXnsRFfttBOAY9q189LlYEYv/vlTfhdrObEsWF3gZZYg2UDyYHtsT1E8X?= =?us-ascii?Q?AJcj1eeRmEA2N7lsSpuoUf8CAunP6L9AkCAM/8edYAqq3Z9K6KfR4WBCsdss?= =?us-ascii?Q?PRT5V7B7oyQPUBzxTfFpOiTV47aGnbM8f9Ay+uyhId8zvwEClfKgtQ1Ex7q0?= =?us-ascii?Q?Oba9gm/ihkFdcLW4tm96SrWkgst6mR5/oXx9SFCLBkpzw/8xO1y60eAN3SzB?= =?us-ascii?Q?w/A99D/p8SO38kjD6JP8taT7jjc92gCQ4EJ5bSkgJ+jdluXtE1cIjUWF9Eo2?= =?us-ascii?Q?PYc1AULnhurrZXvNcN2rwzkNxso5mtky+zV4EWNM2l11/GhLWsZQ/lWbTWct?= =?us-ascii?Q?TEHz1dSNEQ0bR12+KbHieaJZR1hzxZGuZ4jhHQ1pccSoRJkVI34h8Crc5lK5?= =?us-ascii?Q?4HJdDjvNU0X9pN/wlVUNLFzBp0jE76TUCX2MLnJxiB7vaBTj+qgsVbTbG1Kg?= =?us-ascii?Q?fKUFQs6SPVIKgj4lJ3U9mYtXxp7cuRvBusBcMWT93f+OyTrLL1lHuCK+V6j+?= =?us-ascii?Q?6muM8lNS/fe3QDwTcZEXlQepc6jOZMCRUjt5rMFUT/aJcJuqsdfuH+DVvcZe?= =?us-ascii?Q?zAIP/Snx324TZw1WNuPVxzv8WArV/hDqeLaa/eia6TZQIgHzICe5ug1yT196?= =?us-ascii?Q?QNfyQorjYn3Wm54X48W4dYYhZGO8HBQbHmZWqp7WzHnV6DxQeojmKqYX594k?= =?us-ascii?Q?MoaZVr/z10Yqbff5ruPh9nUOU5SzzVPawmwp+E+70ap/lLdFju/kVhMrPV04?= =?us-ascii?Q?uaM9IQpyvzXJzM8ozUPbhS/KWrMWK6XqBhzngCXPj06nqqb71FDXxWcv4A6H?= =?us-ascii?Q?FL4NsZ6pg0GREpSqn+UbCJDsp5ui3Boh20HMM1YPVR0YKivc6YIX7jnEyLSx?= =?us-ascii?Q?VumGuIykK2rSaqW7p7Rw/NA21U4rIZhorstBgwaSoNWqeKRH01sRwergzJOX?= =?us-ascii?Q?HE/4EUSHHHZg0OOqwmXoP7hi1aBDmzOpwVCNyL8KCnkHc0JHpQorobs/jJkz?= =?us-ascii?Q?uAupN2S3qQ11AMrVjbu6p1eV3kQaK2QUmMRh13A5SDhU0b76+pnrRqhSmGb7?= =?us-ascii?Q?1kErsHtU+YjUESiXxrSDmtfZQ/lTWIT7lhTdPWk?= X-Microsoft-Exchange-Diagnostics: 1;BN3PR03MB1478;5:t/CqNaMUaSv8G5l/eqHzYec/EcT/q4IStgrj4nd79FmWLxSbBCYhECeoYaxbwpYKeBgb8Qx1vlSqVXDXUNqd5jRKnCC9ExgJPklZrg10am8agps8WQaHwZVq5ZxFLAzPKly8RG0naEP9LerQPbL8Cw==;24:4XMdUx1Qr4ZkeuPd05pO9xys/alhtVgc+FPyAb75h2yOuQjmGtKsFWBQqH9lM5CB6oWWIpgIxtQNHVJ2+HMnhYr6Nb6yOZEBEHw0brPEK+Y=;20:ELm3FNrNWEPLwQ17uB4p0kUMZBZKQeQdsz20/Jdd3xWiNHzd+37JY9Icz8gtgHJCNDTiPsdHJWtUgNu0Mg/cOQ== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Sep 2015 02:15:33.4423 (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.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR03MB1478 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 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