From: Bhuvanachandra Pinninti <[email protected]>

[why]
The matching entry was disabled but still copied during compaction, so a
removed pipe could survive and overwrite a valid entry, leaving num_wb_info
wrong.

[how]
Skip every entry matching dwb_pipe_inst and compact only survivors. Covered
by test_dc_stream_writeback_drc_and_remove.And added new test cases for 
coverage.

Reviewed-by: Ilya Bakoulin <[email protected]>
Signed-off-by: Bhuvanachandra Pinninti <[email protected]>
Signed-off-by: George Zhang <[email protected]>
---
 .../gpu/drm/amd/display/dc/core/dc_stream.c   | 21 ++++++++-----------
 1 file changed, 9 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
index 1b2c22545be3..ce045ef6347c 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
@@ -720,20 +720,17 @@ bool dc_stream_remove_writeback(struct dc *dc,
                return false;
        }

-       /* remove writeback info for disabled writeback pipes from stream */
+       /* remove writeback info for the requested writeback pipe from stream */
        for (i = 0, j = 0; i < stream->num_wb_info; i++) {
-               if (stream->writeback_info[i].wb_enabled) {
-
-                       if (stream->writeback_info[i].dwb_pipe_inst == 
dwb_pipe_inst)
-                               stream->writeback_info[i].wb_enabled = false;
+               /* drop every entry that targets the pipe being removed */
+               if (stream->writeback_info[i].dwb_pipe_inst == dwb_pipe_inst)
+                       continue;

-                       /* trim the array */
-                       if (j < i) {
-                               memcpy(&stream->writeback_info[j], 
&stream->writeback_info[i],
-                                               sizeof(struct 
dc_writeback_info));
-                               j++;
-                       }
-               }
+               /* keep this entry, compacting it down when earlier entries 
were removed */
+               if (j != i)
+                       memcpy(&stream->writeback_info[j], 
&stream->writeback_info[i],
+                                       sizeof(struct dc_writeback_info));
+               j++;
        }
        stream->num_wb_info = j;

--
2.55.0

Reply via email to