static int mali_oom_handler(struct notifier_block *nb, unsigned long val,
                void *data)
{
	u32 mem = _mali_ukk_report_memory_usage();
	printk(KERN_INFO "mali memory usage : %u KB\n", mem / SZ_1K);
	return 0;
}
static ssize_t memory_used_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos)
{
	char buf[64];
	size_t r;
	u32 mem = _mali_ukk_report_memory_usage();

	r = snprintf(buf, 64, "%u\n", mem);
	return simple_read_from_buffer(ubuf, cnt, ppos, buf, r);
}
u32 _mali_ukk_report_memory_peak(void)
{
    static u32 peak = 0;
    u32        value;
    
    value = _mali_ukk_report_memory_usage();
    if (value > peak)
    {
        peak = value;
    }
    
    return peak;
}
static inline void add_event(u32 event_id, u32 data0, u32 data1, u32 data2, u32 data3, u32 data4)
{
	u32 cur_index = (_mali_osk_atomic_inc_return(&profile_insert_index) - 1) & profile_mask;

	profile_entries[cur_index].timestamp = _mali_timestamp_get();
	profile_entries[cur_index].event_id = event_id;
	profile_entries[cur_index].data[0] = data0;
	profile_entries[cur_index].data[1] = data1;
	profile_entries[cur_index].data[2] = data2;
	profile_entries[cur_index].data[3] = data3;
	profile_entries[cur_index].data[4] = data4;

	/* If event is "leave API function", add current memory usage to the event
	 * as data point 4.  This is used in timeline profiling to indicate how
	 * much memory was used when leaving a function. */
	if (event_id == (MALI_PROFILING_EVENT_TYPE_SINGLE|MALI_PROFILING_EVENT_CHANNEL_SOFTWARE|MALI_PROFILING_EVENT_REASON_SINGLE_SW_LEAVE_API_FUNC)) {
		profile_entries[cur_index].data[4] = _mali_ukk_report_memory_usage();
	}
}
int get_api_version_wrapper(struct mali_session_data *session_data, _mali_uk_get_api_version_s __user *uargs)
{
	_mali_uk_get_api_version_s kargs;
    _mali_osk_errcode_t err;

	u32 mem = _mali_ukk_report_memory_usage();
	printk("Mali: mem_usage before %d : %u\n", _mali_osk_get_pid(), mem);

    MALI_CHECK_NON_NULL(uargs, -EINVAL);

    if (0 != get_user(kargs.version, &uargs->version)) return -EFAULT;

    kargs.ctx = session_data;
    err = _mali_ukk_get_api_version(&kargs);
    if (_MALI_OSK_ERR_OK != err) return map_errcode(err);

    if (0 != put_user(kargs.version, &uargs->version)) return -EFAULT;
    if (0 != put_user(kargs.compatible, &uargs->compatible)) return -EFAULT;

    return 0;
}
static int proc_memoryusage_show(struct seq_file *m, void *v)
{
    seq_printf(m, "%u\n", _mali_ukk_report_memory_usage());

    return 0;
}
void _mali_osk_profiling_memory_usage_get(u32 *memory_usage)
{
	*memory_usage = _mali_ukk_report_memory_usage();
}