X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=drivers%2Fgpu%2Farm%2Fmidgard%2Fmali_kbase_mem_profile_debugfs.c;h=092da9a96ea56b37f68673079108deb6efe298ca;hb=3054c50dd886faa349ca38c9ad8c2162f9706d5a;hp=bf60c1920294abac3130bbf9c7801725aa918542;hpb=91c0b3f7a5bdcd21dd014852bd3cf4e48c84e6cb;p=firefly-linux-kernel-4.4.55.git diff --git a/drivers/gpu/arm/midgard/mali_kbase_mem_profile_debugfs.c b/drivers/gpu/arm/midgard/mali_kbase_mem_profile_debugfs.c index bf60c1920294..092da9a96ea5 100644 --- a/drivers/gpu/arm/midgard/mali_kbase_mem_profile_debugfs.c +++ b/drivers/gpu/arm/midgard/mali_kbase_mem_profile_debugfs.c @@ -1,6 +1,6 @@ /* * - * (C) COPYRIGHT 2012-2015 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved. * * This program is free software and is provided to you under the terms of the * GNU General Public License version 2 as published by the Free Software @@ -15,23 +15,10 @@ -#include +#include #ifdef CONFIG_DEBUG_FS -/* mam_profile file name max length 22 based on format _\0 */ -#define KBASEP_DEBUGFS_FNAME_SIZE_MAX (10+1+10+1) - -void kbasep_mem_profile_debugfs_insert(struct kbase_context *kctx, char *data, - size_t size) -{ - spin_lock(&kctx->mem_profile_lock); - kfree(kctx->mem_profile_data); - kctx->mem_profile_data = data; - kctx->mem_profile_size = size; - spin_unlock(&kctx->mem_profile_lock); -} - /** Show callback for the @c mem_profile debugfs file. * * This function is called to get the contents of the @c mem_profile debugfs @@ -40,19 +27,19 @@ void kbasep_mem_profile_debugfs_insert(struct kbase_context *kctx, char *data, * @param sfile The debugfs entry * @param data Data associated with the entry * - * @return 0 if successfully prints data in debugfs entry file - * -1 if it encountered an error + * @return 0 if it successfully prints data in debugfs entry file, non-zero otherwise */ static int kbasep_mem_profile_seq_show(struct seq_file *sfile, void *data) { struct kbase_context *kctx = sfile->private; - KBASE_DEBUG_ASSERT(kctx != NULL); + mutex_lock(&kctx->mem_profile_lock); - spin_lock(&kctx->mem_profile_lock); seq_write(sfile, kctx->mem_profile_data, kctx->mem_profile_size); + seq_putc(sfile, '\n'); - spin_unlock(&kctx->mem_profile_lock); + + mutex_unlock(&kctx->mem_profile_lock); return 0; } @@ -72,34 +59,61 @@ static const struct file_operations kbasep_mem_profile_debugfs_fops = { .release = single_release, }; -void kbasep_mem_profile_debugfs_add(struct kbase_context *kctx) +int kbasep_mem_profile_debugfs_insert(struct kbase_context *kctx, char *data, + size_t size) { - KBASE_DEBUG_ASSERT(kctx != NULL); + int err = 0; + + mutex_lock(&kctx->mem_profile_lock); - spin_lock_init(&kctx->mem_profile_lock); + dev_dbg(kctx->kbdev->dev, "initialised: %d", + kbase_ctx_flag(kctx, KCTX_MEM_PROFILE_INITIALIZED)); - debugfs_create_file("mem_profile", S_IRUGO, kctx->kctx_dentry, kctx, - &kbasep_mem_profile_debugfs_fops); + if (!kbase_ctx_flag(kctx, KCTX_MEM_PROFILE_INITIALIZED)) { + if (!debugfs_create_file("mem_profile", S_IRUGO, + kctx->kctx_dentry, kctx, + &kbasep_mem_profile_debugfs_fops)) { + err = -EAGAIN; + } else { + kbase_ctx_flag_set(kctx, + KCTX_MEM_PROFILE_INITIALIZED); + } + } + + if (kbase_ctx_flag(kctx, KCTX_MEM_PROFILE_INITIALIZED)) { + kfree(kctx->mem_profile_data); + kctx->mem_profile_data = data; + kctx->mem_profile_size = size; + } + + dev_dbg(kctx->kbdev->dev, "returning: %d, initialised: %d", + err, kbase_ctx_flag(kctx, KCTX_MEM_PROFILE_INITIALIZED)); + + mutex_unlock(&kctx->mem_profile_lock); + + return err; } void kbasep_mem_profile_debugfs_remove(struct kbase_context *kctx) { - KBASE_DEBUG_ASSERT(kctx != NULL); + mutex_lock(&kctx->mem_profile_lock); + + dev_dbg(kctx->kbdev->dev, "initialised: %d", + kbase_ctx_flag(kctx, KCTX_MEM_PROFILE_INITIALIZED)); - spin_lock(&kctx->mem_profile_lock); kfree(kctx->mem_profile_data); kctx->mem_profile_data = NULL; - spin_unlock(&kctx->mem_profile_lock); + kctx->mem_profile_size = 0; + + mutex_unlock(&kctx->mem_profile_lock); } #else /* CONFIG_DEBUG_FS */ -/** - * @brief Stub function for when debugfs is disabled - */ -void kbasep_mem_profile_debugfs_insert(struct kbase_context *kctx, char *data, - size_t size) +int kbasep_mem_profile_debugfs_insert(struct kbase_context *kctx, char *data, + size_t size) { kfree(data); + return 0; } #endif /* CONFIG_DEBUG_FS */