void mali_gp_scheduler_oom(struct mali_group *group, struct mali_gp_job *job) { _mali_uk_gp_job_suspended_s * jobres; _mali_osk_notification_t * notification; mali_gp_scheduler_lock(); notification = job->oom_notification; job->oom_notification = NULL; slot.returned_cookie = mali_gp_job_get_id(job); jobres = (_mali_uk_gp_job_suspended_s *)notification->result_buffer; jobres->user_job_ptr = mali_gp_job_get_user_id(job); jobres->cookie = mali_gp_job_get_id(job); mali_gp_scheduler_unlock(); jobres->reason = _MALIGP_JOB_SUSPENDED_OUT_OF_MEMORY; mali_session_send_notification(mali_gp_job_get_session(job), notification); /* * If this function failed, then we could return the job to user space right away, * but there is a job timer anyway that will do that eventually. * This is not exactly a common case anyway. */ }
static void mali_gp_scheduler_return_job_to_user(struct mali_gp_job *job, mali_bool success) { _mali_osk_notification_t *notobj = _mali_osk_notification_create(_MALI_NOTIFICATION_GP_FINISHED, sizeof(_mali_uk_gp_job_finished_s)); if (NULL != notobj) { _mali_uk_gp_job_finished_s *jobres = notobj->result_buffer; _mali_osk_memset(jobres, 0, sizeof(_mali_uk_gp_job_finished_s)); /* @@@@ can be removed once we initialize all members in this struct */ jobres->user_job_ptr = mali_gp_job_get_user_id(job); if (MALI_TRUE == success) { jobres->status = _MALI_UK_JOB_STATUS_END_SUCCESS; } else { jobres->status = _MALI_UK_JOB_STATUS_END_UNKNOWN_ERR; } jobres->heap_current_addr = mali_gp_job_get_current_heap_addr(job); jobres->perf_counter0 = mali_gp_job_get_perf_counter_value0(job); jobres->perf_counter1 = mali_gp_job_get_perf_counter_value1(job); mali_session_send_notification(mali_gp_job_get_session(job), notobj); } else { MALI_PRINT_ERROR(("Mali GP scheduler: Unable to allocate notification object\n")); } mali_gp_job_delete(job); }
void mali_gp_scheduler_oom(struct mali_group *group, struct mali_gp_job *job) { _mali_osk_notification_t *notobj; notobj = _mali_osk_notification_create(_MALI_NOTIFICATION_GP_STALLED, sizeof(_mali_uk_gp_job_suspended_s)); if (NULL != notobj) { _mali_uk_gp_job_suspended_s * jobres; mali_gp_scheduler_lock(); jobres = (_mali_uk_gp_job_suspended_s *)notobj->result_buffer; jobres->user_job_ptr = mali_gp_job_get_user_id(job); jobres->reason = _MALIGP_JOB_SUSPENDED_OUT_OF_MEMORY; jobres->cookie = mali_gp_job_get_id(job); slot.returned_cookie = jobres->cookie; mali_session_send_notification(mali_gp_job_get_session(job), notobj); mali_gp_scheduler_unlock(); } /* * If this function failed, then we could return the job to user space right away, * but there is a job timer anyway that will do that eventually. * This is not exactly a common case anyway. */ }
void mali_gp_scheduler_oom(struct mali_group *group, struct mali_gp_job *job) { _mali_osk_notification_t *notobj; notobj = _mali_osk_notification_create(_MALI_NOTIFICATION_GP_STALLED, sizeof(_mali_uk_gp_job_suspended_s)); if (NULL != notobj) { _mali_uk_gp_job_suspended_s * jobres; mali_gp_scheduler_lock(); jobres = (_mali_uk_gp_job_suspended_s *)notobj->result_buffer; jobres->user_job_ptr = mali_gp_job_get_user_id(job); jobres->reason = _MALIGP_JOB_SUSPENDED_OUT_OF_MEMORY; jobres->cookie = mali_gp_job_get_id(job); slot.returned_cookie = jobres->cookie; mali_session_send_notification(mali_gp_job_get_session(job), notobj); mali_gp_scheduler_unlock(); } }
static void mali_gp_scheduler_return_job_to_user(struct mali_gp_job *job, mali_bool success) { _mali_uk_gp_job_finished_s *jobres = job->finished_notification->result_buffer; _mali_osk_memset(jobres, 0, sizeof(_mali_uk_gp_job_finished_s)); /* @@@@ can be removed once we initialize all members in this struct */ jobres->user_job_ptr = mali_gp_job_get_user_id(job); if (MALI_TRUE == success) { jobres->status = _MALI_UK_JOB_STATUS_END_SUCCESS; } else { jobres->status = _MALI_UK_JOB_STATUS_END_UNKNOWN_ERR; } jobres->heap_current_addr = mali_gp_job_get_current_heap_addr(job); jobres->perf_counter0 = mali_gp_job_get_perf_counter_value0(job); jobres->perf_counter1 = mali_gp_job_get_perf_counter_value1(job); mali_session_send_notification(mali_gp_job_get_session(job), job->finished_notification); job->finished_notification = NULL; mali_gp_job_delete(job); }