OSDN Git Service

msm: mdss: avoid removing wrong multirect on validate failures
authorVeera Sundaram Sankaran <veeras@codeaurora.org>
Fri, 11 Nov 2016 20:01:34 +0000 (12:01 -0800)
committerVeera Sundaram Sankaran <veeras@codeaurora.org>
Fri, 11 Nov 2016 23:24:30 +0000 (15:24 -0800)
During atomic commit - validate failures, the newly allocated
pipes and pipes taken from the destroy list are cleaned up.
Currently pipe ndx is checked which can lead to cleaning up
the already in use multirect instead of the rect allocated
in the current validate. Add checks to include checking based
on multirect to avoid such cases.

Change-Id: I7f8fb6630314cdc523490e28d90dd3776bdfeada
Signed-off-by: Veera Sundaram Sankaran <veeras@codeaurora.org>
drivers/video/fbdev/msm/mdss_mdp_layer.c

index 20fcc26..036e4e3 100644 (file)
@@ -2470,16 +2470,20 @@ validate_exit:
        mutex_lock(&mdp5_data->list_lock);
        list_for_each_entry_safe(pipe, tmp, &mdp5_data->pipes_used, list) {
                if (IS_ERR_VALUE(ret)) {
-                       if ((pipe->ndx & rec_release_ndx[0]) ||
-                           (pipe->ndx & rec_release_ndx[1])) {
+                       if (((pipe->ndx & rec_release_ndx[0]) &&
+                                       (pipe->multirect.num == 0)) ||
+                               ((pipe->ndx & rec_release_ndx[1]) &&
+                                       (pipe->multirect.num == 1))) {
                                mdss_mdp_smp_unreserve(pipe);
                                pipe->params_changed = 0;
                                pipe->dirty = true;
                                if (!list_empty(&pipe->list))
                                        list_del_init(&pipe->list);
                                mdss_mdp_pipe_destroy(pipe);
-                       } else if ((pipe->ndx & rec_destroy_ndx[0]) ||
-                                  (pipe->ndx & rec_destroy_ndx[1])) {
+                       } else if (((pipe->ndx & rec_destroy_ndx[0]) &&
+                                               (pipe->multirect.num == 0)) ||
+                                       ((pipe->ndx & rec_destroy_ndx[1]) &&
+                                               (pipe->multirect.num == 1))) {
                                /*
                                 * cleanup/destroy list pipes should move back
                                 * to destroy list. Next/current kickoff cycle