_mali_osk_errcode_t _mali_internal_profiling_start(u32 * limit)
{
	_mali_osk_errcode_t ret;
	mali_profiling_entry *new_profile_entries;

	_mali_osk_mutex_wait(lock);

	if (MALI_PROFILING_STATE_RUNNING == prof_state) {
		_mali_osk_mutex_signal(lock);
		return _MALI_OSK_ERR_BUSY;
	}

	new_profile_entries = _mali_osk_valloc(*limit * sizeof(mali_profiling_entry));

	if (NULL == new_profile_entries) {
		_mali_osk_vfree(new_profile_entries);
		return _MALI_OSK_ERR_NOMEM;
	}

	if (MALI_PROFILING_MAX_BUFFER_ENTRIES < *limit) {
		*limit = MALI_PROFILING_MAX_BUFFER_ENTRIES;
	}

	profile_mask = 1;
	while (profile_mask <= *limit) {
		profile_mask <<= 1;
	}
	profile_mask >>= 1;

	*limit = profile_mask;

	profile_mask--; /* turns the power of two into a mask of one less */

	if (MALI_PROFILING_STATE_IDLE != prof_state) {
		_mali_osk_mutex_signal(lock);
		_mali_osk_vfree(new_profile_entries);
		return _MALI_OSK_ERR_INVALID_ARGS; /* invalid to call this function in this state */
	}

	profile_entries = new_profile_entries;

	ret = _mali_timestamp_reset();

	if (_MALI_OSK_ERR_OK == ret) {
		prof_state = MALI_PROFILING_STATE_RUNNING;
	} else {
		_mali_osk_vfree(profile_entries);
		profile_entries = NULL;
	}

	register_trace_mali_timeline_event(probe_mali_timeline_event, NULL);

	_mali_osk_mutex_signal(lock);
	return ret;
}
inline _mali_osk_errcode_t _mali_osk_profiling_start(u32 * limit)
{
    _mali_osk_errcode_t ret;

    mali_profiling_entry *new_profile_entries = _mali_osk_valloc(*limit * sizeof(mali_profiling_entry));

    if(NULL == new_profile_entries)
    {
        return _MALI_OSK_ERR_NOMEM;
    }

    _mali_osk_lock_wait(lock, _MALI_OSK_LOCKMODE_RW);

    if (prof_state != MALI_PROFILING_STATE_IDLE)
    {
        _mali_osk_lock_signal(lock, _MALI_OSK_LOCKMODE_RW);
        _mali_osk_vfree(new_profile_entries);
        return _MALI_OSK_ERR_INVALID_ARGS; /* invalid to call this function in this state */
    }

    if (*limit > MALI_PROFILING_MAX_BUFFER_ENTRIES)
    {
        *limit = MALI_PROFILING_MAX_BUFFER_ENTRIES;
    }

    profile_entries = new_profile_entries;
    profile_entry_count = *limit;

    ret = _mali_timestamp_reset();

    if (ret == _MALI_OSK_ERR_OK)
    {
        prof_state = MALI_PROFILING_STATE_RUNNING;
    }
    else
    {
        _mali_osk_vfree(profile_entries);
        profile_entries = NULL;
    }

    _mali_osk_lock_signal(lock, _MALI_OSK_LOCKMODE_RW);
    return ret;
}