From patchwork Mon Aug 31 08:58:38 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Qiang X-Patchwork-Id: 512391 X-Patchwork-Delegate: scottwood@freescale.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 0D6541401CD for ; Mon, 31 Aug 2015 19:06:14 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id DF8281A1DE5 for ; Mon, 31 Aug 2015 19:06:13 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from na01-by2-obe.outbound.protection.outlook.com (mail-by2on0112.outbound.protection.outlook.com [207.46.100.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 85DE91A0144 for ; Mon, 31 Aug 2015 19:04:27 +1000 (AEST) Received: from CO2PR03CA0027.namprd03.prod.outlook.com (10.141.194.154) by SN1PR0301MB1550.namprd03.prod.outlook.com (10.162.129.156) with Microsoft SMTP Server (TLS) id 15.1.231.21; Mon, 31 Aug 2015 09:04:21 +0000 Received: from BL2FFO11FD008.protection.gbl (2a01:111:f400:7c09::168) by CO2PR03CA0027.outlook.office365.com (2a01:111:e400:1414::26) with Microsoft SMTP Server (TLS) id 15.1.262.13 via Frontend Transport; Mon, 31 Aug 2015 09:04:21 +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 BL2FFO11FD008.mail.protection.outlook.com (10.173.161.4) with Microsoft SMTP Server (TLS) id 15.1.256.10 via Frontend Transport; Mon, 31 Aug 2015 09:04:19 +0000 Received: from titan.ap.freescale.net ([10.192.208.233]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id t7V94E09009056; Mon, 31 Aug 2015 02:04:14 -0700 From: Zhao Qiang To: Subject: [PATCH V7 1/3] genalloc:support memory-allocation with bytes-alignment to genalloc Date: Mon, 31 Aug 2015 16:58:38 +0800 Message-ID: <1441011520-15424-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; BL2FFO11FD008; 1:YUa6i3HWJPz1s/sVCJQ6/zeRKdazLSSxnZ9pjmaNLNMz895Twti8jF4h70lYCZE5/NJu7d/dLAh5RSMpKcNKAnVpHgySVbuiKSW13Xy01WGQ3kpRMyMvV5F5/hLo1y1i1yKDa5kHZ+OHRfjJmvjfDDZNbQavNE2nO7UPp1akV/nbhYDqEVWDANUjy/ATbZGSJTLVkG2wrRNB9JrBUzhr9a5FSMbkA/OjsHjWLtN60oLMsrvvr9CzCCe6iG0uKECIcGM3DMAa2fndOiobXrikns+Rm1t4grgIykpRBZn7RUdppJAmPLW5QWJPld2hn+msRHf0E4X9Xs5UY6rgy55YLH6/+nv8i356yGDXahp9XYmkw0ROaY2fpImHBg36Zn59AAyzp0qed81ZkAKT1HUv1Q== X-Forefront-Antispam-Report: CIP:192.88.158.2; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(339900001)(3050300001)(189002)(199003)(87936001)(33646002)(6806004)(19580405001)(5001830100001)(5001860100001)(19580395003)(5001960100002)(107886002)(110136002)(189998001)(229853001)(2351001)(5001920100001)(105606002)(106466001)(64706001)(47776003)(46102003)(92566002)(4001540100001)(81156007)(86362001)(97736004)(104016003)(50986999)(50466002)(69596002)(48376002)(85426001)(5007970100001)(36756003)(50226001)(62966003)(77156002)(4001450100002)(77096005)(68736005)(2371004)(5003940100001)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:SN1PR0301MB1550; H:az84smr01.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; SN1PR0301MB1550; 2:0uofrLLcp1jHZaEn5sz5DOLNgaF68yoOeUV7YHbvzoJsRKY8l3gJc6cs8co2ZxTa1BJooJd/K9ZinKLepRncFBLa/Wry6TIBi5MFfOCscS9DhI5j2WwJlBkH5uRuQWxcpfNJYNUHEuq3XR8/JInqo+c/rkgSy395fniMCQ70V3k=; 3:u6nI9G0tMw0d84zjw3vRE16oCvaj8JLp0zg02BqlUwlM2QL4Iwf2M1ndJhmdkNkqOkW21btBvJJtnyDLRprqTMIUZpv0fm2TMjSejx2snWph1kpYHvfI5cmtf25pU9m/yd+TXNfMfSZ4WXkNsAfvdAjxVwJa/utxxzEkA5h6s9IGvJl9Z+X+Zn+B/DvUWXYSwzMRqvbXjNAZJsVOg9SaOF/Ab+Ya2iwek+ZFoeD2r9Y=; 25:ExNY0p9m/+63F+Aqf85wM6S2iGU2RHCHeRG1caA6o3z65+PMzQP7uZ16z90p/rb4tch9GYqYOjJgnK2aUw96wRNJ3zwo0tga0RQs6bWxB7HKEWkoMdTyHe90qTWgsgDFCArhL4CwojAZ47dxSrkIB/gkQJxq3gI966NqA5i50cZvygjluyYcPVRet6wqqXHUQfmy+1GPUSpVe6Yzq/zjzjmQmvWct809UxwK3xC8b9zwZGp8FB5SfG8xD6Re3BEMUsoKGyIvQPCAh77TP7bGag== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR0301MB1550; X-Microsoft-Exchange-Diagnostics: 1; SN1PR0301MB1550; 20:Cnwvft8VdnnKJCzxXytg95kwnKZ7f9CaXAGxeCPXqRKoT/i/SY6ijtHwfpuzTfZW3VRTCUkIuqo5ARuONP1/scjY1Ap/+PPG9svPjIVOztd9n5ZYs/tXWirE/adArGjUGQ0Kdv1ddzl1GeT3glxLYif6M02GDUqTIo0mGceXVjLFxO7PNRS2UamDC6rXJAhTow/L6kAsMzpoRMf4117JUL2sIcbRw8LrcxxXgYVr0w9vKVkdh3kd8AzQ9izjzGPeypPFgHXiCj6+gdIQFJkBtY1jkkd6dkrDy1MgfOE2N9higoOYHUuO0bcFiIZIDkXHfgN8F7XLBpddBvq2Et+oBGkDJxV2fmdbKIy8fUpFWEY=; 4:rQCLU4Gwh/X6LLUB9MmjwI73UX0hIRr7h8bbvchU92fH+MUiIw34EgXQuh5IYWFP209n6OZfOpxjg1dqkUkqb8MVBOR5YPV5aIDAIcShM3eFf/l632yXxbFz0xuC99/w1cmzd61hTSKyN3O8ToiT4sfuMiPiefkmFfYpm7WU1OwemFweSuA9MlQCypP5jbE68gErw1KIJhcpG3Vf75G9s3e2ctU9D8KULZ/I0krdQRsfSGfQcXH16wdXA/ubHWwwTJYzxn7f+kP1c3AzeUcI0yPZ/l0ulNmNRSLzQr/g3kB6ZG8A14M7vSsJr6Fu2Vwq2RT/xyWDGQaaJeQovNEqmA== 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: 0685122203 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1PR0301MB1550; 23:Pluy5XBGXNToqKz2y+wBaQFLGOxkjkvDZcWJiK8?= =?us-ascii?Q?0bl7tcEfsmHXEIhX7k3p2fu+xc1HowTqYtsxOU7FvMyxhFg/HX8nbY0IiJuJ?= =?us-ascii?Q?vRWGBuoRAzvlf/psrP6TCccLaztmNmzYl3ZBpa2gPEjfzwVk6DExVBlGm4Oi?= =?us-ascii?Q?60Tkaqln9Nwn5jE7QCNrFUOyHx7qbXvD+GDryclZuldBBIcP/gvDgMHp/PUD?= =?us-ascii?Q?Dx2rbrk4gVZ9rUIPYwdYz4FhZCMD1+4RYr6TYNOVRrU/b03yAC+hNqihjgnM?= =?us-ascii?Q?fimPZrtcTV3JDHkwRO94UvNpGJTCduhVciVLEXL4SYgbZ+ZZVLaM/eEF2AXM?= =?us-ascii?Q?d2y+LVLh4XSC1vdKptW4sxd46cCCFVopG4DBArBk6qyv74UzEmiGo1twspN/?= =?us-ascii?Q?K0YZRIf7LDpOFdrs4Ao6ZQA28Jvf/49Qx2WX+GWeUpQdMISoZENB+u/G40Ix?= =?us-ascii?Q?vJmGyExlLAss640+a0OVesDxK31giGGq/XeeWFgTDXY3X+mQve9UIGsz70pc?= =?us-ascii?Q?inorwsH0e0sSRSTEDBqt+m/8zZagMZBBaaSgSPyZg1TOOJc30CyIF8PKkPco?= =?us-ascii?Q?pdRq1FkXgcBLh4qQuNHdBqb604erPrfnELt65uuRfeayO1eBI1rVFXbPbyH0?= =?us-ascii?Q?5logoqk2YBuBF+IKTHSR6YaayB4Ug7/1tKEjWV72gxuY7gN7yqM2kTYL9NAI?= =?us-ascii?Q?3DXI7tgElgKUzse3dNasVJ/HKiHHrYf4SORJO922RPHmvoQpYVaU00oxuACa?= =?us-ascii?Q?KkK8f5tS/LrMe4oVjcoJk7yQRFjJQtIZUoBfvcq+hirifXyzUNb6QfHkQPik?= =?us-ascii?Q?AXjYn7iP8WfvVYWurZ3FSIshcHm4W4Ljldl5AYEo9EGYkAy4CF/asEmK6+3U?= =?us-ascii?Q?bvVVy+JXZNprf2fPK8AimuPjclhkx59f1GK0wFNgec3DKF3wXDNzq64tNsdn?= =?us-ascii?Q?CB40R7+1gUfV6r+hqKUlqrK0xHdGRLjKpYqncLC+7TG3Clu4af0kuwdx3lu2?= =?us-ascii?Q?YFydcZiIcFwIDH563Gr2TqZW89k0OIro6Ufv8lPD2T3AMu3mixwj0lDGAdpy?= =?us-ascii?Q?6K25IqOjuEmnKzSwVTupgJofwnjaTL6w+LWQs5zC9+6SAIMA4imuwTWrdlhs?= =?us-ascii?Q?YRqzoYNqI0oYD0bsKBzpbFrtgpX/gZro8yuW/DP8pzyGc4hraB8PyEm92yu7?= =?us-ascii?Q?ldLl3ffr3Yymu+ggcTbPmru96nGGxAhxC8WvnyBY0+T4n6bs1tMf7uzAovRr?= =?us-ascii?Q?XNTDF59S+g/J2VELtg3X9t75f6a+8NDwSAgN3W8za?= X-Microsoft-Exchange-Diagnostics: 1; SN1PR0301MB1550; 5:HydnQGoe14eC5dhv8JOXzgyL+86aQLxCHB3WZEXe1ijsvGJH/d02BQsTA9fcjfJ+xqimad8iPMra9l3NcYi1iUgp2jcpd5ZR5qvCrBUpclftguwvMWmhSBSVH9zVfvDdwx3TZWxKeyre50CoPWwZUw==; 24:noo1TZAiM0jewqQdFZrBE/MiXL5oIr3HQ3OZGxr4iu/lehK7UQ9gLKNB0Us1As0FuBAsQYOf/m3nioAoJRCIx3OSclyxgInRfzD6dmjmKD8=; 20:8Gj1xOwb9qXuI6SYoMqQ9PXepKeGHwMeCjr1dqywiLiWQisR9pbgJXl5rdoDKZRbU2K/nG/XvFb9HkWMwMPeHQ== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2015 09:04:19.6851 (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 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Zhao Qiang , lauraa@codeaurora.org, linux-kernel@vger.kernel.org, paulus@samba.org, linuxppc-dev@lists.ozlabs.org, X.xie@freescale.com Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" 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. include/linux/genalloc.h | 25 ++++++++++++++++---- lib/genalloc.c | 61 ++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 77 insertions(+), 9 deletions(-) diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h index 1ccaab4..1958053 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,14 @@ 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 */ + unsigned long offset; /* the offset of allocation start addr*/ +}; + 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 +106,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 +119,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..b9f8344 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,45 @@ 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; + unsigned long offset_bit; + int order; + + alignment = data; + order = pool->min_alloc_order; + align_mask = ((alignment->align + (1UL << order) - 1) >> order) - 1; + offset_bit = (alignment->offset + (1UL << order) - 1) >> order; + return bitmap_find_next_zero_area(map, size, start + offset_bit, 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 +565,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 +585,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;