From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755030AbbAZO0i (ORCPT ); Mon, 26 Jan 2015 09:26:38 -0500 Received: from userp1040.oracle.com ([156.151.31.81]:34303 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754228AbbAZO0d (ORCPT ); Mon, 26 Jan 2015 09:26:33 -0500 From: Sasha Levin To: linux-kernel@vger.kernel.org Cc: iamjoonsoo.kim@lge.com, m.szyprowski@samsung.com, akpm@linux-foundation.org, lauraa@codeaurora.org, Sasha Levin Subject: [PATCH v2 2/3] mm: cma: allocation trigger Date: Mon, 26 Jan 2015 09:26:04 -0500 Message-Id: <1422282365-20015-3-git-send-email-sasha.levin@oracle.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1422282365-20015-1-git-send-email-sasha.levin@oracle.com> References: <1422282365-20015-1-git-send-email-sasha.levin@oracle.com> X-Source-IP: ucsinet21.oracle.com [156.151.31.93] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Provides a userspace interface to trigger a CMA allocation. Usage: echo [pages] > alloc This would provide testing/fuzzing access to the CMA allocation paths. Signed-off-by: Sasha Levin --- mm/cma_debug.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/mm/cma_debug.c b/mm/cma_debug.c index 3a25413..39c7116 100644 --- a/mm/cma_debug.c +++ b/mm/cma_debug.c @@ -7,9 +7,22 @@ #include #include +#include +#include +#include +#include #include "cma.h" +struct cma_mem { + struct hlist_node node; + struct page *p; + unsigned long n; +}; + +static HLIST_HEAD(cma_mem_head); +static DEFINE_SPINLOCK(cma_mem_head_lock); + static struct dentry *cma_debugfs_root; static int cma_debugfs_get(void *data, u64 *val) @@ -23,8 +36,48 @@ static int cma_debugfs_get(void *data, u64 *val) DEFINE_SIMPLE_ATTRIBUTE(cma_debugfs_fops, cma_debugfs_get, NULL, "%llu\n"); -static void cma_debugfs_add_one(struct cma *cma, int idx) +static void cma_add_to_cma_mem_list(struct cma_mem *mem) +{ + spin_lock(&cma_mem_head_lock); + hlist_add_head(&mem->node, &cma_mem_head); + spin_unlock(&cma_mem_head_lock); +} + +static int cma_alloc_mem(struct cma *cma, int count) { + struct cma_mem *mem; + struct page *p; + + mem = kzalloc(sizeof(*mem), GFP_KERNEL); + if (!mem) + return -ENOMEM; + + p = cma_alloc(cma, count, CONFIG_CMA_ALIGNMENT); + if (!p) { + kfree(mem); + return -ENOMEM; + } + + mem->p = p; + mem->n = count; + + cma_add_to_cma_mem_list(mem); + + return 0; +} + +static int cma_alloc_write(void *data, u64 val) +{ + int pages = val; + struct cma *cma = data; + + return cma_alloc_mem(cma, pages); +} + +DEFINE_SIMPLE_ATTRIBUTE(cma_alloc_fops, NULL, cma_alloc_write, "%llu\n"); + +static void cma_debugfs_add_one(struct cma *cma, int idx) +{ struct dentry *tmp; char name[16]; int u32s; @@ -33,12 +86,15 @@ static void cma_debugfs_add_one(struct cma *cma, int idx) tmp = debugfs_create_dir(name, cma_debugfs_root); + debugfs_create_file("alloc", S_IWUSR, cma_debugfs_root, cma, + &cma_alloc_fops); + debugfs_create_file("base_pfn", S_IRUGO, tmp, &cma->base_pfn, &cma_debugfs_fops); debugfs_create_file("count", S_IRUGO, tmp, &cma->count, &cma_debugfs_fops); debugfs_create_file("order_per_bit", S_IRUGO, tmp, - &cma->order_per_bit, &cma_debugfs_fops); + &cma->order_per_bit, &cma_debugfs_fops); u32s = DIV_ROUND_UP(cma_bitmap_maxno(cma), BITS_PER_BYTE * sizeof(u32)); debugfs_create_u32_array("bitmap", S_IRUGO, tmp, (u32*)cma->bitmap, u32s); -- 1.7.10.4