Re: [PATCH v2] drm/log: Batch vmap/vunmap and flush for record drawing

Jocelyn Falempe <[email protected]>
Newsgroups org.freedesktop.lists.dri-devel,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On 30/07/2026 12:59, [email protected] wrote:
> From: Shixiong Ou <[email protected]>
> 
> drm_log_draw_new_line() calls drm_log_clear_line() and drm_log_draw_line(),
> which independently call drm_client_buffer_vmap_local(),
> drm_client_buffer_vunmap_local(), and drm_client_buffer_flush(). For each
> call to drm_log_draw_new_line(), this results in 2 vmap/vunmap pairs and
> 2 flush calls, even though vmap_local maps the entire framebuffer
> each time.
> 
> Refactor drm_log_clear_line() and drm_log_draw_line() to accept a
> pre-mapped iosys_map by value, removing the per-line vmap/vunmap/flush
> calls. Move the single vmap/vunmap pair and flush up to
> drm_log_draw_new_line(), which now maps once before clearing and
> drawing, then issues a single flush after unmapping.
> 
> Also remove the now-unused drm_rect from both functions.

Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <[email protected]>

> 
> Signed-off-by: Shixiong Ou <[email protected]>
> ---
> v1->v2:
>     Remove unused drm_rect from drm_log_clear_line() and
>     drm_log_draw_line().
> 
> diff --git a/drivers/gpu/drm/clients/drm_log.c b/drivers/gpu/drm/clients/drm_log.c
> index ac10c978f917..52563e2a1c45 100644
> --- a/drivers/gpu/drm/clients/drm_log.c
> +++ b/drivers/gpu/drm/clients/drm_log.c
> @@ -94,37 +94,28 @@ static void drm_log_blit(struct iosys_map *dst, unsigned int dst_pitch,
>   	}
>   }
>   
> -static void drm_log_clear_line(struct drm_log_scanout *scanout, u32 line)
> +static void drm_log_clear_line(struct drm_log_scanout *scanout, u32 line,
> +			       struct iosys_map map)
>   {
>   	struct drm_framebuffer *fb = scanout->buffer->fb;
>   	unsigned long height = scanout->scaled_font_h;
> -	struct iosys_map map;
> -	struct drm_rect r = DRM_RECT_INIT(0, line * height, fb->width, height);
>   
> -	if (drm_client_buffer_vmap_local(scanout->buffer, &map))
> -		return;
> -	iosys_map_memset(&map, r.y1 * fb->pitches[0], 0, height * fb->pitches[0]);
> -	drm_client_buffer_vunmap_local(scanout->buffer);
> -	drm_client_buffer_flush(scanout->buffer, &r);
> +	iosys_map_memset(&map, line * height * fb->pitches[0], 0, height * fb->pitches[0]);
>   }
>   
>   static void drm_log_draw_line(struct drm_log_scanout *scanout, const char *s,
> -			      unsigned int len, unsigned int prefix_len)
> +			      unsigned int len, unsigned int prefix_len,
> +			      struct iosys_map map)
>   {
>   	struct drm_framebuffer *fb = scanout->buffer->fb;
> -	struct iosys_map map;
>   	const struct font_desc *font = scanout->font;
>   	size_t font_pitch = DIV_ROUND_UP(font->width, 8);
>   	const u8 *src;
>   	u32 px_width = fb->format->cpp[0];
> -	struct drm_rect r = DRM_RECT_INIT(0, scanout->line * scanout->scaled_font_h,
> -					  fb->width, (scanout->line + 1) * scanout->scaled_font_h);
>   	u32 i;
>   
> -	if (drm_client_buffer_vmap_local(scanout->buffer, &map))
> -		return;
> +	iosys_map_incr(&map, scanout->line * scanout->scaled_font_h * fb->pitches[0]);
>   
> -	iosys_map_incr(&map, r.y1 * fb->pitches[0]);
>   	for (i = 0; i < len && i < scanout->columns; i++) {
>   		u32 color = (i < prefix_len) ? scanout->prefix_color : scanout->front_color;
>   		src = font_data_glyph_buf(font->data, font->width, font->height,
> @@ -139,21 +130,40 @@ static void drm_log_draw_line(struct drm_log_scanout *scanout, const char *s,
>   	scanout->line++;
>   	if (scanout->line >= scanout->rows)
>   		scanout->line = 0;
> -	drm_client_buffer_vunmap_local(scanout->buffer);
> -	drm_client_buffer_flush(scanout->buffer, &r);
>   }
>   
>   static void drm_log_draw_new_line(struct drm_log_scanout *scanout,
> -				  const char *s, unsigned int len, unsigned int prefix_len)
> +				  const char *s, unsigned int len,
> +				  unsigned int prefix_len)
>   {
> +	struct iosys_map map;
> +	struct drm_framebuffer *fb = scanout->buffer->fb;
> +	u32 height = scanout->scaled_font_h;
> +	u32 line = scanout->line;
> +	u32 y2;
> +	struct drm_rect dirty;
> +
> +	if (drm_client_buffer_vmap_local(scanout->buffer, &map))
> +		return;
> +
>   	if (scanout->line == 0) {
> -		drm_log_clear_line(scanout, 0);
> -		drm_log_clear_line(scanout, 1);
> -		drm_log_clear_line(scanout, 2);
> -	} else if (scanout->line + 2 < scanout->rows)
> -		drm_log_clear_line(scanout, scanout->line + 2);
> +		drm_log_clear_line(scanout, 0, map);
> +		drm_log_clear_line(scanout, 1, map);
> +		drm_log_clear_line(scanout, 2, map);
> +		y2 = min(3, scanout->rows) * height;
> +	} else if (scanout->line + 2 < scanout->rows) {
> +		drm_log_clear_line(scanout, scanout->line + 2, map);
> +		y2 = (line + 3) * height;
> +	} else {
> +		y2 = (line + 1) * height;
> +	}
> +
> +	drm_log_draw_line(scanout, s, len, prefix_len, map);
> +
> +	drm_client_buffer_vunmap_local(scanout->buffer);
>   
> -	drm_log_draw_line(scanout, s, len, prefix_len);
> +	dirty = DRM_RECT_INIT(0, line * height, fb->width, y2 - line * height);
> +	drm_client_buffer_flush(scanout->buffer, &dirty);
>   }
>   
>   /*
> --
> 2.25.1
> 
> No virus found
> 		Checked by Hillstone Network AntiVirus
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.