mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
video: rockchip: rga3: modify the process of session exit
When the session exits, there is no need to operate the rga_job directly. Update driver version to 1.2.21 Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com> Change-Id: I0369dce427dc749795803eae064dc80e33747a7e
This commit is contained in:
@@ -87,7 +87,7 @@
|
||||
|
||||
#define DRIVER_MAJOR_VERISON 1
|
||||
#define DRIVER_MINOR_VERSION 2
|
||||
#define DRIVER_REVISION_VERSION 20
|
||||
#define DRIVER_REVISION_VERSION 21
|
||||
#define DRIVER_PATCH_VERSION
|
||||
|
||||
#define DRIVER_VERSION (STR(DRIVER_MAJOR_VERISON) "." STR(DRIVER_MINOR_VERSION) \
|
||||
|
||||
@@ -21,8 +21,6 @@ enum job_flags {
|
||||
RGA_JOB_UNSUPPORT_RGA_MMU = 1 << 4,
|
||||
};
|
||||
|
||||
void rga_job_session_destroy(struct rga_session *session);
|
||||
|
||||
void rga_job_scheduler_dump_info(struct rga_scheduler_t *scheduler);
|
||||
void rga_job_done(struct rga_scheduler_t *scheduler, int ret);
|
||||
struct rga_job *rga_job_commit(struct rga_req *rga_command_base, struct rga_request *request);
|
||||
@@ -36,6 +34,7 @@ struct rga_request *rga_request_lookup(struct rga_pending_request_manager *reque
|
||||
uint32_t id);
|
||||
|
||||
int rga_request_commit(struct rga_request *user_request);
|
||||
void rga_request_session_destroy_abort(struct rga_session *session);
|
||||
int rga_request_put(struct rga_request *request);
|
||||
void rga_request_get(struct rga_request *request);
|
||||
int rga_request_free(struct rga_request *request);
|
||||
|
||||
@@ -604,29 +604,7 @@ static struct rga_session *rga_session_init(void)
|
||||
|
||||
static int rga_session_deinit(struct rga_session *session)
|
||||
{
|
||||
pid_t pid;
|
||||
int request_id;
|
||||
struct rga_pending_request_manager *request_manager;
|
||||
struct rga_request *request;
|
||||
|
||||
pid = current->pid;
|
||||
|
||||
request_manager = rga_drvdata->pend_request_manager;
|
||||
|
||||
mutex_lock(&request_manager->lock);
|
||||
|
||||
idr_for_each_entry(&request_manager->request_idr, request, request_id) {
|
||||
|
||||
if (session == request->session) {
|
||||
pr_err("[pid:%d] destroy request[%d] when the user exits",
|
||||
pid, request->id);
|
||||
rga_request_put(request);
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(&request_manager->lock);
|
||||
|
||||
rga_job_session_destroy(session);
|
||||
rga_request_session_destroy_abort(session);
|
||||
rga_mm_session_release_buffer(session);
|
||||
|
||||
rga_session_free_remove_idr(session);
|
||||
|
||||
@@ -49,35 +49,6 @@ static int rga_job_cleanup(struct rga_job *job)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rga_job_session_destroy(struct rga_session *session)
|
||||
{
|
||||
struct rga_scheduler_t *scheduler = NULL;
|
||||
struct rga_job *job_pos, *job_q;
|
||||
int i;
|
||||
|
||||
unsigned long flags;
|
||||
|
||||
for (i = 0; i < rga_drvdata->num_of_scheduler; i++) {
|
||||
scheduler = rga_drvdata->scheduler[i];
|
||||
|
||||
spin_lock_irqsave(&scheduler->irq_lock, flags);
|
||||
|
||||
list_for_each_entry_safe(job_pos, job_q, &scheduler->todo_list, head) {
|
||||
if (session == job_pos->session) {
|
||||
list_del(&job_pos->head);
|
||||
|
||||
spin_unlock_irqrestore(&scheduler->irq_lock, flags);
|
||||
|
||||
rga_job_cleanup(job_pos);
|
||||
|
||||
spin_lock_irqsave(&scheduler->irq_lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&scheduler->irq_lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
static int rga_job_judgment_support_core(struct rga_job *job)
|
||||
{
|
||||
int ret = 0;
|
||||
@@ -731,6 +702,31 @@ static void rga_request_release_abort(struct rga_request *request, int err_code)
|
||||
mutex_unlock(&request_manager->lock);
|
||||
}
|
||||
|
||||
void rga_request_session_destroy_abort(struct rga_session *session)
|
||||
{
|
||||
int request_id;
|
||||
struct rga_request *request;
|
||||
struct rga_pending_request_manager *request_manager;
|
||||
|
||||
request_manager = rga_drvdata->pend_request_manager;
|
||||
if (request_manager == NULL) {
|
||||
pr_err("rga_pending_request_manager is null!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
mutex_lock(&request_manager->lock);
|
||||
|
||||
idr_for_each_entry(&request_manager->request_idr, request, request_id) {
|
||||
if (session == request->session) {
|
||||
pr_err("[tgid:%d pid:%d] destroy request[%d] when the user exits",
|
||||
session->tgid, current->pid, request->id);
|
||||
rga_request_put(request);
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(&request_manager->lock);
|
||||
}
|
||||
|
||||
static int rga_request_wait(struct rga_request *request)
|
||||
{
|
||||
int left_time;
|
||||
@@ -1148,10 +1144,11 @@ static void rga_request_kref_release(struct kref *ref)
|
||||
request = container_of(ref, struct rga_request, refcount);
|
||||
|
||||
if (rga_dma_fence_get_status(request->release_fence) == 0)
|
||||
rga_dma_fence_signal(request->release_fence, -EEXIST);
|
||||
rga_dma_fence_signal(request->release_fence, -EFAULT);
|
||||
|
||||
spin_lock_irqsave(&request->lock, flags);
|
||||
|
||||
rga_request_put_current_mm(request);
|
||||
rga_dma_fence_put(request->release_fence);
|
||||
|
||||
if (!request->is_running || request->is_done) {
|
||||
|
||||
Reference in New Issue
Block a user