All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Zimmermann <tzimmermann@suse.de>
To: Daniel Vetter <daniel.vetter@ffwll.ch>,
	DRI Development <dri-devel@lists.freedesktop.org>
Cc: Intel Graphics Development <intel-gfx@lists.freedesktop.org>,
	linux-fbdev@vger.kernel.org, LKML <linux-kernel@vger.kernel.org>,
	Daniel Vetter <daniel.vetter@intel.com>,
	Daniel Vetter <daniel@ffwll.ch>, Claudio Suarez <cssk@net-c.es>,
	Du Cheng <ducheng2@gmail.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Subject: Re: [PATCH v2 06/19] fbcon: Use delayed work for cursor
Date: Thu, 10 Feb 2022 12:37:54 +0100	[thread overview]
Message-ID: <1554e197-8894-d342-4d77-39c52bae869e@suse.de> (raw)
In-Reply-To: <20220208210824.2238981-7-daniel.vetter@ffwll.ch>


[-- Attachment #1.1: Type: text/plain, Size: 9951 bytes --]



Am 08.02.22 um 22:08 schrieb Daniel Vetter:
> Allows us to delete a bunch of hand-rolled stuff. Also to simplify the
> code we initialize the cursor_work completely when we allocate the
> fbcon_ops structure, instead of trying to cope with console
> re-initialization.
> 
> The motiviation here is that fbcon code stops using the fb_info.queue,
> which helps with locking issues around cleanup and all that in a later
> patch.
> 
> Also note that this allows us to ditch the hand-rolled work cleanup in
> fbcon_exit - we already call fbcon_del_cursor_timer, which takes care
> of everything. Plus this was racy anyway.
> 
> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: Claudio Suarez <cssk@net-c.es>
> Cc: Du Cheng <ducheng2@gmail.com>
> Cc: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
> ---
>   drivers/video/fbdev/core/fbcon.c | 85 +++++++++++++-------------------
>   drivers/video/fbdev/core/fbcon.h |  4 +-
>   2 files changed, 35 insertions(+), 54 deletions(-)
> 
> diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
> index 83f0223f5333..a368ed602e2e 100644
> --- a/drivers/video/fbdev/core/fbcon.c
> +++ b/drivers/video/fbdev/core/fbcon.c
> @@ -350,8 +350,8 @@ static int get_color(struct vc_data *vc, struct fb_info *info,
>   
>   static void fb_flashcursor(struct work_struct *work)
>   {
> -	struct fb_info *info = container_of(work, struct fb_info, queue);
> -	struct fbcon_ops *ops = info->fbcon_par;
> +	struct fbcon_ops *ops = container_of(work, struct fbcon_ops, cursor_work.work);
> +	struct fb_info *info;
>   	struct vc_data *vc = NULL;
>   	int c;
>   	int mode;
> @@ -364,7 +364,10 @@ static void fb_flashcursor(struct work_struct *work)
>   	if (ret == 0)
>   		return;
>   
> -	if (ops && ops->currcon != -1)
> +	/* protected by console_lock */
> +	info = ops->info;
> +
> +	if (ops->currcon != -1)
>   		vc = vc_cons[ops->currcon].d;
>   
>   	if (!vc || !con_is_visible(vc) ||
> @@ -380,42 +383,25 @@ static void fb_flashcursor(struct work_struct *work)
>   	ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
>   		    get_color(vc, info, c, 0));
>   	console_unlock();
> -}
>   
> -static void cursor_timer_handler(struct timer_list *t)
> -{
> -	struct fbcon_ops *ops = from_timer(ops, t, cursor_timer);
> -	struct fb_info *info = ops->info;
> -
> -	queue_work(system_power_efficient_wq, &info->queue);
> -	mod_timer(&ops->cursor_timer, jiffies + ops->cur_blink_jiffies);
> +	queue_delayed_work(system_power_efficient_wq, &ops->cursor_work,
> +			   ops->cur_blink_jiffies);
>   }
>   
> -static void fbcon_add_cursor_timer(struct fb_info *info)
> +static void fbcon_add_cursor_work(struct fb_info *info)
>   {
>   	struct fbcon_ops *ops = info->fbcon_par;
>   
> -	if ((!info->queue.func || info->queue.func == fb_flashcursor) &&
> -	    !(ops->flags & FBCON_FLAGS_CURSOR_TIMER) &&
> -	    !fbcon_cursor_noblink) {
> -		if (!info->queue.func)
> -			INIT_WORK(&info->queue, fb_flashcursor);
> -
> -		timer_setup(&ops->cursor_timer, cursor_timer_handler, 0);
> -		mod_timer(&ops->cursor_timer, jiffies + ops->cur_blink_jiffies);
> -		ops->flags |= FBCON_FLAGS_CURSOR_TIMER;
> -	}
> +	if (!fbcon_cursor_noblink)
> +		queue_delayed_work(system_power_efficient_wq, &ops->cursor_work,
> +				   ops->cur_blink_jiffies);
>   }
>   
> -static void fbcon_del_cursor_timer(struct fb_info *info)
> +static void fbcon_del_cursor_work(struct fb_info *info)
>   {
>   	struct fbcon_ops *ops = info->fbcon_par;
>   
> -	if (info->queue.func == fb_flashcursor &&
> -	    ops->flags & FBCON_FLAGS_CURSOR_TIMER) {
> -		del_timer_sync(&ops->cursor_timer);
> -		ops->flags &= ~FBCON_FLAGS_CURSOR_TIMER;
> -	}
> +	cancel_delayed_work_sync(&ops->cursor_work);
>   }
>   
>   #ifndef MODULE
> @@ -714,6 +700,8 @@ static int con2fb_acquire_newinfo(struct vc_data *vc, struct fb_info *info,
>   		ops = kzalloc(sizeof(struct fbcon_ops), GFP_KERNEL);
>   		if (!ops)
>   			err = -ENOMEM;
> +
> +		INIT_DELAYED_WORK(&ops->cursor_work, fb_flashcursor);

There's similar code in fbcon_startup() when there should be a single 
init function for fbcon_ops. Maybe something for later.

Acked-by: Thomas Zimmermann <tzimmermann@suse.de>

>   	}
>   
>   	if (!err) {
> @@ -751,7 +739,7 @@ static int con2fb_release_oldinfo(struct vc_data *vc, struct fb_info *oldinfo,
>   	}
>   
>   	if (!err) {
> -		fbcon_del_cursor_timer(oldinfo);
> +		fbcon_del_cursor_work(oldinfo);
>   		kfree(ops->cursor_state.mask);
>   		kfree(ops->cursor_data);
>   		kfree(ops->cursor_src);
> @@ -867,7 +855,7 @@ static int set_con2fb_map(int unit, int newidx, int user)
>   				 logo_shown != FBCON_LOGO_DONTSHOW);
>   
>   		if (!found)
> -			fbcon_add_cursor_timer(info);
> +			fbcon_add_cursor_work(info);
>   		con2fb_map_boot[unit] = newidx;
>   		con2fb_init_display(vc, info, unit, show_logo);
>   	}
> @@ -964,6 +952,8 @@ static const char *fbcon_startup(void)
>   		return NULL;
>   	}
>   
> +	INIT_DELAYED_WORK(&ops->cursor_work, fb_flashcursor);
> +
>   	ops->currcon = -1;
>   	ops->graphics = 1;
>   	ops->cur_rotate = -1;
> @@ -1006,7 +996,7 @@ static const char *fbcon_startup(void)
>   		 info->var.yres,
>   		 info->var.bits_per_pixel);
>   
> -	fbcon_add_cursor_timer(info);
> +	fbcon_add_cursor_work(info);
>   	return display_desc;
>   }
>   
> @@ -1194,7 +1184,7 @@ static void fbcon_deinit(struct vc_data *vc)
>   		goto finished;
>   
>   	if (con_is_visible(vc))
> -		fbcon_del_cursor_timer(info);
> +		fbcon_del_cursor_work(info);
>   
>   	ops->flags &= ~FBCON_FLAGS_INIT;
>   finished:
> @@ -1320,9 +1310,9 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
>   		return;
>   
>   	if (vc->vc_cursor_type & CUR_SW)
> -		fbcon_del_cursor_timer(info);
> +		fbcon_del_cursor_work(info);
>   	else
> -		fbcon_add_cursor_timer(info);
> +		fbcon_add_cursor_work(info);
>   
>   	ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1;
>   
> @@ -2132,14 +2122,14 @@ static int fbcon_switch(struct vc_data *vc)
>   		}
>   
>   		if (old_info != info)
> -			fbcon_del_cursor_timer(old_info);
> +			fbcon_del_cursor_work(old_info);
>   	}
>   
>   	if (fbcon_is_inactive(vc, info) ||
>   	    ops->blank_state != FB_BLANK_UNBLANK)
> -		fbcon_del_cursor_timer(info);
> +		fbcon_del_cursor_work(info);
>   	else
> -		fbcon_add_cursor_timer(info);
> +		fbcon_add_cursor_work(info);
>   
>   	set_blitting_type(vc, info);
>   	ops->cursor_reset = 1;
> @@ -2247,9 +2237,9 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch)
>   
>   	if (mode_switch || fbcon_is_inactive(vc, info) ||
>   	    ops->blank_state != FB_BLANK_UNBLANK)
> -		fbcon_del_cursor_timer(info);
> +		fbcon_del_cursor_work(info);
>   	else
> -		fbcon_add_cursor_timer(info);
> +		fbcon_add_cursor_work(info);
>   
>   	return 0;
>   }
> @@ -3181,7 +3171,7 @@ static ssize_t show_cursor_blink(struct device *device,
>   	if (!ops)
>   		goto err;
>   
> -	blink = (ops->flags & FBCON_FLAGS_CURSOR_TIMER) ? 1 : 0;
> +	blink = delayed_work_pending(&ops->cursor_work);
>   err:
>   	console_unlock();
>   	return snprintf(buf, PAGE_SIZE, "%d\n", blink);
> @@ -3210,10 +3200,10 @@ static ssize_t store_cursor_blink(struct device *device,
>   
>   	if (blink) {
>   		fbcon_cursor_noblink = 0;
> -		fbcon_add_cursor_timer(info);
> +		fbcon_add_cursor_work(info);
>   	} else {
>   		fbcon_cursor_noblink = 1;
> -		fbcon_del_cursor_timer(info);
> +		fbcon_del_cursor_work(info);
>   	}
>   
>   err:
> @@ -3314,15 +3304,9 @@ static void fbcon_exit(void)
>   #endif
>   
>   	for_each_registered_fb(i) {
> -		int pending = 0;
> -
>   		mapped = 0;
>   		info = registered_fb[i];
>   
> -		if (info->queue.func)
> -			pending = cancel_work_sync(&info->queue);
> -		pr_debug("fbcon: %s pending work\n", (pending ? "canceled" : "no"));
> -
>   		for (j = first_fb_vc; j <= last_fb_vc; j++) {
>   			if (con2fb_map[j] == i) {
>   				mapped = 1;
> @@ -3338,15 +3322,12 @@ static void fbcon_exit(void)
>   			if (info->fbcon_par) {
>   				struct fbcon_ops *ops = info->fbcon_par;
>   
> -				fbcon_del_cursor_timer(info);
> +				fbcon_del_cursor_work(info);
>   				kfree(ops->cursor_src);
>   				kfree(ops->cursor_state.mask);
>   				kfree(info->fbcon_par);
>   				info->fbcon_par = NULL;
>   			}
> -
> -			if (info->queue.func == fb_flashcursor)
> -				info->queue.func = NULL;
>   		}
>   	}
>   }
> diff --git a/drivers/video/fbdev/core/fbcon.h b/drivers/video/fbdev/core/fbcon.h
> index 969d41ecede5..6708ca0048aa 100644
> --- a/drivers/video/fbdev/core/fbcon.h
> +++ b/drivers/video/fbdev/core/fbcon.h
> @@ -14,11 +14,11 @@
>   #include <linux/types.h>
>   #include <linux/vt_buffer.h>
>   #include <linux/vt_kern.h>
> +#include <linux/workqueue.h>
>   
>   #include <asm/io.h>
>   
>   #define FBCON_FLAGS_INIT         1
> -#define FBCON_FLAGS_CURSOR_TIMER 2
>   
>      /*
>       *    This is the interface between the low-level console driver and the
> @@ -68,7 +68,7 @@ struct fbcon_ops {
>   	int  (*update_start)(struct fb_info *info);
>   	int  (*rotate_font)(struct fb_info *info, struct vc_data *vc);
>   	struct fb_var_screeninfo var;  /* copy of the current fb_var_screeninfo */
> -	struct timer_list cursor_timer; /* Cursor timer */
> +	struct delayed_work cursor_work; /* Cursor timer */
>   	struct fb_cursor cursor_state;
>   	struct fbcon_display *p;
>   	struct fb_info *info;

-- 
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Ivo Totev

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 840 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: Thomas Zimmermann <tzimmermann@suse.de>
To: Daniel Vetter <daniel.vetter@ffwll.ch>,
	DRI Development <dri-devel@lists.freedesktop.org>
Cc: linux-fbdev@vger.kernel.org, Du Cheng <ducheng2@gmail.com>,
	Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Intel Graphics Development <intel-gfx@lists.freedesktop.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Claudio Suarez <cssk@net-c.es>,
	Daniel Vetter <daniel.vetter@intel.com>
Subject: Re: [PATCH v2 06/19] fbcon: Use delayed work for cursor
Date: Thu, 10 Feb 2022 12:37:54 +0100	[thread overview]
Message-ID: <1554e197-8894-d342-4d77-39c52bae869e@suse.de> (raw)
In-Reply-To: <20220208210824.2238981-7-daniel.vetter@ffwll.ch>


[-- Attachment #1.1: Type: text/plain, Size: 9951 bytes --]



Am 08.02.22 um 22:08 schrieb Daniel Vetter:
> Allows us to delete a bunch of hand-rolled stuff. Also to simplify the
> code we initialize the cursor_work completely when we allocate the
> fbcon_ops structure, instead of trying to cope with console
> re-initialization.
> 
> The motiviation here is that fbcon code stops using the fb_info.queue,
> which helps with locking issues around cleanup and all that in a later
> patch.
> 
> Also note that this allows us to ditch the hand-rolled work cleanup in
> fbcon_exit - we already call fbcon_del_cursor_timer, which takes care
> of everything. Plus this was racy anyway.
> 
> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: Claudio Suarez <cssk@net-c.es>
> Cc: Du Cheng <ducheng2@gmail.com>
> Cc: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
> ---
>   drivers/video/fbdev/core/fbcon.c | 85 +++++++++++++-------------------
>   drivers/video/fbdev/core/fbcon.h |  4 +-
>   2 files changed, 35 insertions(+), 54 deletions(-)
> 
> diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
> index 83f0223f5333..a368ed602e2e 100644
> --- a/drivers/video/fbdev/core/fbcon.c
> +++ b/drivers/video/fbdev/core/fbcon.c
> @@ -350,8 +350,8 @@ static int get_color(struct vc_data *vc, struct fb_info *info,
>   
>   static void fb_flashcursor(struct work_struct *work)
>   {
> -	struct fb_info *info = container_of(work, struct fb_info, queue);
> -	struct fbcon_ops *ops = info->fbcon_par;
> +	struct fbcon_ops *ops = container_of(work, struct fbcon_ops, cursor_work.work);
> +	struct fb_info *info;
>   	struct vc_data *vc = NULL;
>   	int c;
>   	int mode;
> @@ -364,7 +364,10 @@ static void fb_flashcursor(struct work_struct *work)
>   	if (ret == 0)
>   		return;
>   
> -	if (ops && ops->currcon != -1)
> +	/* protected by console_lock */
> +	info = ops->info;
> +
> +	if (ops->currcon != -1)
>   		vc = vc_cons[ops->currcon].d;
>   
>   	if (!vc || !con_is_visible(vc) ||
> @@ -380,42 +383,25 @@ static void fb_flashcursor(struct work_struct *work)
>   	ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
>   		    get_color(vc, info, c, 0));
>   	console_unlock();
> -}
>   
> -static void cursor_timer_handler(struct timer_list *t)
> -{
> -	struct fbcon_ops *ops = from_timer(ops, t, cursor_timer);
> -	struct fb_info *info = ops->info;
> -
> -	queue_work(system_power_efficient_wq, &info->queue);
> -	mod_timer(&ops->cursor_timer, jiffies + ops->cur_blink_jiffies);
> +	queue_delayed_work(system_power_efficient_wq, &ops->cursor_work,
> +			   ops->cur_blink_jiffies);
>   }
>   
> -static void fbcon_add_cursor_timer(struct fb_info *info)
> +static void fbcon_add_cursor_work(struct fb_info *info)
>   {
>   	struct fbcon_ops *ops = info->fbcon_par;
>   
> -	if ((!info->queue.func || info->queue.func == fb_flashcursor) &&
> -	    !(ops->flags & FBCON_FLAGS_CURSOR_TIMER) &&
> -	    !fbcon_cursor_noblink) {
> -		if (!info->queue.func)
> -			INIT_WORK(&info->queue, fb_flashcursor);
> -
> -		timer_setup(&ops->cursor_timer, cursor_timer_handler, 0);
> -		mod_timer(&ops->cursor_timer, jiffies + ops->cur_blink_jiffies);
> -		ops->flags |= FBCON_FLAGS_CURSOR_TIMER;
> -	}
> +	if (!fbcon_cursor_noblink)
> +		queue_delayed_work(system_power_efficient_wq, &ops->cursor_work,
> +				   ops->cur_blink_jiffies);
>   }
>   
> -static void fbcon_del_cursor_timer(struct fb_info *info)
> +static void fbcon_del_cursor_work(struct fb_info *info)
>   {
>   	struct fbcon_ops *ops = info->fbcon_par;
>   
> -	if (info->queue.func == fb_flashcursor &&
> -	    ops->flags & FBCON_FLAGS_CURSOR_TIMER) {
> -		del_timer_sync(&ops->cursor_timer);
> -		ops->flags &= ~FBCON_FLAGS_CURSOR_TIMER;
> -	}
> +	cancel_delayed_work_sync(&ops->cursor_work);
>   }
>   
>   #ifndef MODULE
> @@ -714,6 +700,8 @@ static int con2fb_acquire_newinfo(struct vc_data *vc, struct fb_info *info,
>   		ops = kzalloc(sizeof(struct fbcon_ops), GFP_KERNEL);
>   		if (!ops)
>   			err = -ENOMEM;
> +
> +		INIT_DELAYED_WORK(&ops->cursor_work, fb_flashcursor);

There's similar code in fbcon_startup() when there should be a single 
init function for fbcon_ops. Maybe something for later.

Acked-by: Thomas Zimmermann <tzimmermann@suse.de>

>   	}
>   
>   	if (!err) {
> @@ -751,7 +739,7 @@ static int con2fb_release_oldinfo(struct vc_data *vc, struct fb_info *oldinfo,
>   	}
>   
>   	if (!err) {
> -		fbcon_del_cursor_timer(oldinfo);
> +		fbcon_del_cursor_work(oldinfo);
>   		kfree(ops->cursor_state.mask);
>   		kfree(ops->cursor_data);
>   		kfree(ops->cursor_src);
> @@ -867,7 +855,7 @@ static int set_con2fb_map(int unit, int newidx, int user)
>   				 logo_shown != FBCON_LOGO_DONTSHOW);
>   
>   		if (!found)
> -			fbcon_add_cursor_timer(info);
> +			fbcon_add_cursor_work(info);
>   		con2fb_map_boot[unit] = newidx;
>   		con2fb_init_display(vc, info, unit, show_logo);
>   	}
> @@ -964,6 +952,8 @@ static const char *fbcon_startup(void)
>   		return NULL;
>   	}
>   
> +	INIT_DELAYED_WORK(&ops->cursor_work, fb_flashcursor);
> +
>   	ops->currcon = -1;
>   	ops->graphics = 1;
>   	ops->cur_rotate = -1;
> @@ -1006,7 +996,7 @@ static const char *fbcon_startup(void)
>   		 info->var.yres,
>   		 info->var.bits_per_pixel);
>   
> -	fbcon_add_cursor_timer(info);
> +	fbcon_add_cursor_work(info);
>   	return display_desc;
>   }
>   
> @@ -1194,7 +1184,7 @@ static void fbcon_deinit(struct vc_data *vc)
>   		goto finished;
>   
>   	if (con_is_visible(vc))
> -		fbcon_del_cursor_timer(info);
> +		fbcon_del_cursor_work(info);
>   
>   	ops->flags &= ~FBCON_FLAGS_INIT;
>   finished:
> @@ -1320,9 +1310,9 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
>   		return;
>   
>   	if (vc->vc_cursor_type & CUR_SW)
> -		fbcon_del_cursor_timer(info);
> +		fbcon_del_cursor_work(info);
>   	else
> -		fbcon_add_cursor_timer(info);
> +		fbcon_add_cursor_work(info);
>   
>   	ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1;
>   
> @@ -2132,14 +2122,14 @@ static int fbcon_switch(struct vc_data *vc)
>   		}
>   
>   		if (old_info != info)
> -			fbcon_del_cursor_timer(old_info);
> +			fbcon_del_cursor_work(old_info);
>   	}
>   
>   	if (fbcon_is_inactive(vc, info) ||
>   	    ops->blank_state != FB_BLANK_UNBLANK)
> -		fbcon_del_cursor_timer(info);
> +		fbcon_del_cursor_work(info);
>   	else
> -		fbcon_add_cursor_timer(info);
> +		fbcon_add_cursor_work(info);
>   
>   	set_blitting_type(vc, info);
>   	ops->cursor_reset = 1;
> @@ -2247,9 +2237,9 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch)
>   
>   	if (mode_switch || fbcon_is_inactive(vc, info) ||
>   	    ops->blank_state != FB_BLANK_UNBLANK)
> -		fbcon_del_cursor_timer(info);
> +		fbcon_del_cursor_work(info);
>   	else
> -		fbcon_add_cursor_timer(info);
> +		fbcon_add_cursor_work(info);
>   
>   	return 0;
>   }
> @@ -3181,7 +3171,7 @@ static ssize_t show_cursor_blink(struct device *device,
>   	if (!ops)
>   		goto err;
>   
> -	blink = (ops->flags & FBCON_FLAGS_CURSOR_TIMER) ? 1 : 0;
> +	blink = delayed_work_pending(&ops->cursor_work);
>   err:
>   	console_unlock();
>   	return snprintf(buf, PAGE_SIZE, "%d\n", blink);
> @@ -3210,10 +3200,10 @@ static ssize_t store_cursor_blink(struct device *device,
>   
>   	if (blink) {
>   		fbcon_cursor_noblink = 0;
> -		fbcon_add_cursor_timer(info);
> +		fbcon_add_cursor_work(info);
>   	} else {
>   		fbcon_cursor_noblink = 1;
> -		fbcon_del_cursor_timer(info);
> +		fbcon_del_cursor_work(info);
>   	}
>   
>   err:
> @@ -3314,15 +3304,9 @@ static void fbcon_exit(void)
>   #endif
>   
>   	for_each_registered_fb(i) {
> -		int pending = 0;
> -
>   		mapped = 0;
>   		info = registered_fb[i];
>   
> -		if (info->queue.func)
> -			pending = cancel_work_sync(&info->queue);
> -		pr_debug("fbcon: %s pending work\n", (pending ? "canceled" : "no"));
> -
>   		for (j = first_fb_vc; j <= last_fb_vc; j++) {
>   			if (con2fb_map[j] == i) {
>   				mapped = 1;
> @@ -3338,15 +3322,12 @@ static void fbcon_exit(void)
>   			if (info->fbcon_par) {
>   				struct fbcon_ops *ops = info->fbcon_par;
>   
> -				fbcon_del_cursor_timer(info);
> +				fbcon_del_cursor_work(info);
>   				kfree(ops->cursor_src);
>   				kfree(ops->cursor_state.mask);
>   				kfree(info->fbcon_par);
>   				info->fbcon_par = NULL;
>   			}
> -
> -			if (info->queue.func == fb_flashcursor)
> -				info->queue.func = NULL;
>   		}
>   	}
>   }
> diff --git a/drivers/video/fbdev/core/fbcon.h b/drivers/video/fbdev/core/fbcon.h
> index 969d41ecede5..6708ca0048aa 100644
> --- a/drivers/video/fbdev/core/fbcon.h
> +++ b/drivers/video/fbdev/core/fbcon.h
> @@ -14,11 +14,11 @@
>   #include <linux/types.h>
>   #include <linux/vt_buffer.h>
>   #include <linux/vt_kern.h>
> +#include <linux/workqueue.h>
>   
>   #include <asm/io.h>
>   
>   #define FBCON_FLAGS_INIT         1
> -#define FBCON_FLAGS_CURSOR_TIMER 2
>   
>      /*
>       *    This is the interface between the low-level console driver and the
> @@ -68,7 +68,7 @@ struct fbcon_ops {
>   	int  (*update_start)(struct fb_info *info);
>   	int  (*rotate_font)(struct fb_info *info, struct vc_data *vc);
>   	struct fb_var_screeninfo var;  /* copy of the current fb_var_screeninfo */
> -	struct timer_list cursor_timer; /* Cursor timer */
> +	struct delayed_work cursor_work; /* Cursor timer */
>   	struct fb_cursor cursor_state;
>   	struct fbcon_display *p;
>   	struct fb_info *info;

-- 
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Ivo Totev

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 840 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: Thomas Zimmermann <tzimmermann@suse.de>
To: Daniel Vetter <daniel.vetter@ffwll.ch>,
	DRI Development <dri-devel@lists.freedesktop.org>
Cc: linux-fbdev@vger.kernel.org, Du Cheng <ducheng2@gmail.com>,
	Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Intel Graphics Development <intel-gfx@lists.freedesktop.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Daniel Vetter <daniel.vetter@intel.com>
Subject: Re: [Intel-gfx] [PATCH v2 06/19] fbcon: Use delayed work for cursor
Date: Thu, 10 Feb 2022 12:37:54 +0100	[thread overview]
Message-ID: <1554e197-8894-d342-4d77-39c52bae869e@suse.de> (raw)
In-Reply-To: <20220208210824.2238981-7-daniel.vetter@ffwll.ch>


[-- Attachment #1.1: Type: text/plain, Size: 9951 bytes --]



Am 08.02.22 um 22:08 schrieb Daniel Vetter:
> Allows us to delete a bunch of hand-rolled stuff. Also to simplify the
> code we initialize the cursor_work completely when we allocate the
> fbcon_ops structure, instead of trying to cope with console
> re-initialization.
> 
> The motiviation here is that fbcon code stops using the fb_info.queue,
> which helps with locking issues around cleanup and all that in a later
> patch.
> 
> Also note that this allows us to ditch the hand-rolled work cleanup in
> fbcon_exit - we already call fbcon_del_cursor_timer, which takes care
> of everything. Plus this was racy anyway.
> 
> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: Claudio Suarez <cssk@net-c.es>
> Cc: Du Cheng <ducheng2@gmail.com>
> Cc: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
> ---
>   drivers/video/fbdev/core/fbcon.c | 85 +++++++++++++-------------------
>   drivers/video/fbdev/core/fbcon.h |  4 +-
>   2 files changed, 35 insertions(+), 54 deletions(-)
> 
> diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
> index 83f0223f5333..a368ed602e2e 100644
> --- a/drivers/video/fbdev/core/fbcon.c
> +++ b/drivers/video/fbdev/core/fbcon.c
> @@ -350,8 +350,8 @@ static int get_color(struct vc_data *vc, struct fb_info *info,
>   
>   static void fb_flashcursor(struct work_struct *work)
>   {
> -	struct fb_info *info = container_of(work, struct fb_info, queue);
> -	struct fbcon_ops *ops = info->fbcon_par;
> +	struct fbcon_ops *ops = container_of(work, struct fbcon_ops, cursor_work.work);
> +	struct fb_info *info;
>   	struct vc_data *vc = NULL;
>   	int c;
>   	int mode;
> @@ -364,7 +364,10 @@ static void fb_flashcursor(struct work_struct *work)
>   	if (ret == 0)
>   		return;
>   
> -	if (ops && ops->currcon != -1)
> +	/* protected by console_lock */
> +	info = ops->info;
> +
> +	if (ops->currcon != -1)
>   		vc = vc_cons[ops->currcon].d;
>   
>   	if (!vc || !con_is_visible(vc) ||
> @@ -380,42 +383,25 @@ static void fb_flashcursor(struct work_struct *work)
>   	ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
>   		    get_color(vc, info, c, 0));
>   	console_unlock();
> -}
>   
> -static void cursor_timer_handler(struct timer_list *t)
> -{
> -	struct fbcon_ops *ops = from_timer(ops, t, cursor_timer);
> -	struct fb_info *info = ops->info;
> -
> -	queue_work(system_power_efficient_wq, &info->queue);
> -	mod_timer(&ops->cursor_timer, jiffies + ops->cur_blink_jiffies);
> +	queue_delayed_work(system_power_efficient_wq, &ops->cursor_work,
> +			   ops->cur_blink_jiffies);
>   }
>   
> -static void fbcon_add_cursor_timer(struct fb_info *info)
> +static void fbcon_add_cursor_work(struct fb_info *info)
>   {
>   	struct fbcon_ops *ops = info->fbcon_par;
>   
> -	if ((!info->queue.func || info->queue.func == fb_flashcursor) &&
> -	    !(ops->flags & FBCON_FLAGS_CURSOR_TIMER) &&
> -	    !fbcon_cursor_noblink) {
> -		if (!info->queue.func)
> -			INIT_WORK(&info->queue, fb_flashcursor);
> -
> -		timer_setup(&ops->cursor_timer, cursor_timer_handler, 0);
> -		mod_timer(&ops->cursor_timer, jiffies + ops->cur_blink_jiffies);
> -		ops->flags |= FBCON_FLAGS_CURSOR_TIMER;
> -	}
> +	if (!fbcon_cursor_noblink)
> +		queue_delayed_work(system_power_efficient_wq, &ops->cursor_work,
> +				   ops->cur_blink_jiffies);
>   }
>   
> -static void fbcon_del_cursor_timer(struct fb_info *info)
> +static void fbcon_del_cursor_work(struct fb_info *info)
>   {
>   	struct fbcon_ops *ops = info->fbcon_par;
>   
> -	if (info->queue.func == fb_flashcursor &&
> -	    ops->flags & FBCON_FLAGS_CURSOR_TIMER) {
> -		del_timer_sync(&ops->cursor_timer);
> -		ops->flags &= ~FBCON_FLAGS_CURSOR_TIMER;
> -	}
> +	cancel_delayed_work_sync(&ops->cursor_work);
>   }
>   
>   #ifndef MODULE
> @@ -714,6 +700,8 @@ static int con2fb_acquire_newinfo(struct vc_data *vc, struct fb_info *info,
>   		ops = kzalloc(sizeof(struct fbcon_ops), GFP_KERNEL);
>   		if (!ops)
>   			err = -ENOMEM;
> +
> +		INIT_DELAYED_WORK(&ops->cursor_work, fb_flashcursor);

There's similar code in fbcon_startup() when there should be a single 
init function for fbcon_ops. Maybe something for later.

Acked-by: Thomas Zimmermann <tzimmermann@suse.de>

>   	}
>   
>   	if (!err) {
> @@ -751,7 +739,7 @@ static int con2fb_release_oldinfo(struct vc_data *vc, struct fb_info *oldinfo,
>   	}
>   
>   	if (!err) {
> -		fbcon_del_cursor_timer(oldinfo);
> +		fbcon_del_cursor_work(oldinfo);
>   		kfree(ops->cursor_state.mask);
>   		kfree(ops->cursor_data);
>   		kfree(ops->cursor_src);
> @@ -867,7 +855,7 @@ static int set_con2fb_map(int unit, int newidx, int user)
>   				 logo_shown != FBCON_LOGO_DONTSHOW);
>   
>   		if (!found)
> -			fbcon_add_cursor_timer(info);
> +			fbcon_add_cursor_work(info);
>   		con2fb_map_boot[unit] = newidx;
>   		con2fb_init_display(vc, info, unit, show_logo);
>   	}
> @@ -964,6 +952,8 @@ static const char *fbcon_startup(void)
>   		return NULL;
>   	}
>   
> +	INIT_DELAYED_WORK(&ops->cursor_work, fb_flashcursor);
> +
>   	ops->currcon = -1;
>   	ops->graphics = 1;
>   	ops->cur_rotate = -1;
> @@ -1006,7 +996,7 @@ static const char *fbcon_startup(void)
>   		 info->var.yres,
>   		 info->var.bits_per_pixel);
>   
> -	fbcon_add_cursor_timer(info);
> +	fbcon_add_cursor_work(info);
>   	return display_desc;
>   }
>   
> @@ -1194,7 +1184,7 @@ static void fbcon_deinit(struct vc_data *vc)
>   		goto finished;
>   
>   	if (con_is_visible(vc))
> -		fbcon_del_cursor_timer(info);
> +		fbcon_del_cursor_work(info);
>   
>   	ops->flags &= ~FBCON_FLAGS_INIT;
>   finished:
> @@ -1320,9 +1310,9 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
>   		return;
>   
>   	if (vc->vc_cursor_type & CUR_SW)
> -		fbcon_del_cursor_timer(info);
> +		fbcon_del_cursor_work(info);
>   	else
> -		fbcon_add_cursor_timer(info);
> +		fbcon_add_cursor_work(info);
>   
>   	ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1;
>   
> @@ -2132,14 +2122,14 @@ static int fbcon_switch(struct vc_data *vc)
>   		}
>   
>   		if (old_info != info)
> -			fbcon_del_cursor_timer(old_info);
> +			fbcon_del_cursor_work(old_info);
>   	}
>   
>   	if (fbcon_is_inactive(vc, info) ||
>   	    ops->blank_state != FB_BLANK_UNBLANK)
> -		fbcon_del_cursor_timer(info);
> +		fbcon_del_cursor_work(info);
>   	else
> -		fbcon_add_cursor_timer(info);
> +		fbcon_add_cursor_work(info);
>   
>   	set_blitting_type(vc, info);
>   	ops->cursor_reset = 1;
> @@ -2247,9 +2237,9 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch)
>   
>   	if (mode_switch || fbcon_is_inactive(vc, info) ||
>   	    ops->blank_state != FB_BLANK_UNBLANK)
> -		fbcon_del_cursor_timer(info);
> +		fbcon_del_cursor_work(info);
>   	else
> -		fbcon_add_cursor_timer(info);
> +		fbcon_add_cursor_work(info);
>   
>   	return 0;
>   }
> @@ -3181,7 +3171,7 @@ static ssize_t show_cursor_blink(struct device *device,
>   	if (!ops)
>   		goto err;
>   
> -	blink = (ops->flags & FBCON_FLAGS_CURSOR_TIMER) ? 1 : 0;
> +	blink = delayed_work_pending(&ops->cursor_work);
>   err:
>   	console_unlock();
>   	return snprintf(buf, PAGE_SIZE, "%d\n", blink);
> @@ -3210,10 +3200,10 @@ static ssize_t store_cursor_blink(struct device *device,
>   
>   	if (blink) {
>   		fbcon_cursor_noblink = 0;
> -		fbcon_add_cursor_timer(info);
> +		fbcon_add_cursor_work(info);
>   	} else {
>   		fbcon_cursor_noblink = 1;
> -		fbcon_del_cursor_timer(info);
> +		fbcon_del_cursor_work(info);
>   	}
>   
>   err:
> @@ -3314,15 +3304,9 @@ static void fbcon_exit(void)
>   #endif
>   
>   	for_each_registered_fb(i) {
> -		int pending = 0;
> -
>   		mapped = 0;
>   		info = registered_fb[i];
>   
> -		if (info->queue.func)
> -			pending = cancel_work_sync(&info->queue);
> -		pr_debug("fbcon: %s pending work\n", (pending ? "canceled" : "no"));
> -
>   		for (j = first_fb_vc; j <= last_fb_vc; j++) {
>   			if (con2fb_map[j] == i) {
>   				mapped = 1;
> @@ -3338,15 +3322,12 @@ static void fbcon_exit(void)
>   			if (info->fbcon_par) {
>   				struct fbcon_ops *ops = info->fbcon_par;
>   
> -				fbcon_del_cursor_timer(info);
> +				fbcon_del_cursor_work(info);
>   				kfree(ops->cursor_src);
>   				kfree(ops->cursor_state.mask);
>   				kfree(info->fbcon_par);
>   				info->fbcon_par = NULL;
>   			}
> -
> -			if (info->queue.func == fb_flashcursor)
> -				info->queue.func = NULL;
>   		}
>   	}
>   }
> diff --git a/drivers/video/fbdev/core/fbcon.h b/drivers/video/fbdev/core/fbcon.h
> index 969d41ecede5..6708ca0048aa 100644
> --- a/drivers/video/fbdev/core/fbcon.h
> +++ b/drivers/video/fbdev/core/fbcon.h
> @@ -14,11 +14,11 @@
>   #include <linux/types.h>
>   #include <linux/vt_buffer.h>
>   #include <linux/vt_kern.h>
> +#include <linux/workqueue.h>
>   
>   #include <asm/io.h>
>   
>   #define FBCON_FLAGS_INIT         1
> -#define FBCON_FLAGS_CURSOR_TIMER 2
>   
>      /*
>       *    This is the interface between the low-level console driver and the
> @@ -68,7 +68,7 @@ struct fbcon_ops {
>   	int  (*update_start)(struct fb_info *info);
>   	int  (*rotate_font)(struct fb_info *info, struct vc_data *vc);
>   	struct fb_var_screeninfo var;  /* copy of the current fb_var_screeninfo */
> -	struct timer_list cursor_timer; /* Cursor timer */
> +	struct delayed_work cursor_work; /* Cursor timer */
>   	struct fb_cursor cursor_state;
>   	struct fbcon_display *p;
>   	struct fb_info *info;

-- 
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Ivo Totev

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 840 bytes --]

  parent reply	other threads:[~2022-02-10 11:38 UTC|newest]

Thread overview: 145+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-08 21:08 [PATCH v2 00/19] fbcon patches, take two Daniel Vetter
2022-02-08 21:08 ` Daniel Vetter
2022-02-08 21:08 ` [Intel-gfx] " Daniel Vetter
2022-02-08 21:08 ` [PATCH v2 01/19] fbcon: delete a few unneeded forward decl Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-10 11:17   ` Thomas Zimmermann
2022-02-10 11:17     ` [Intel-gfx] " Thomas Zimmermann
2022-02-10 11:17     ` Thomas Zimmermann
2022-02-08 21:08 ` [PATCH v2 02/19] fbcon: Move fbcon_bmove(_rec) functions Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-08 23:06   ` Javier Martinez Canillas
2022-02-08 23:06     ` [Intel-gfx] " Javier Martinez Canillas
2022-02-08 23:06     ` Javier Martinez Canillas
2022-02-10 11:17   ` Thomas Zimmermann
2022-02-10 11:17     ` [Intel-gfx] " Thomas Zimmermann
2022-02-10 11:17     ` Thomas Zimmermann
2022-02-08 21:08 ` [PATCH v2 03/19] fbcon: Introduce wrapper for console->fb_info lookup Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-10 11:18   ` Thomas Zimmermann
2022-02-10 11:18     ` [Intel-gfx] " Thomas Zimmermann
2022-02-10 11:18     ` Thomas Zimmermann
2022-02-08 21:08 ` [PATCH v2 04/19] fbcon: delete delayed loading code Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-10 11:20   ` Thomas Zimmermann
2022-02-10 11:20     ` [Intel-gfx] " Thomas Zimmermann
2022-02-10 11:20     ` Thomas Zimmermann
2022-02-08 21:08 ` [PATCH v2 05/19] fbdev/sysfs: Fix locking Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-10 11:22   ` Thomas Zimmermann
2022-02-10 11:22     ` [Intel-gfx] " Thomas Zimmermann
2022-02-08 21:08 ` [PATCH v2 06/19] fbcon: Use delayed work for cursor Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-08 23:59   ` Javier Martinez Canillas
2022-02-08 23:59     ` [Intel-gfx] " Javier Martinez Canillas
2022-02-08 23:59     ` Javier Martinez Canillas
2022-02-10 11:37   ` Thomas Zimmermann [this message]
2022-02-10 11:37     ` [Intel-gfx] " Thomas Zimmermann
2022-02-10 11:37     ` Thomas Zimmermann
2022-02-10 11:43   ` Tetsuo Handa
2022-02-10 11:43     ` [Intel-gfx] " Tetsuo Handa
2022-02-10 11:43     ` Tetsuo Handa
2022-04-05 20:54     ` Daniel Vetter
2022-04-05 20:54       ` Daniel Vetter
2022-04-05 20:54       ` [Intel-gfx] " Daniel Vetter
2022-02-08 21:08 ` [PATCH v2 07/19] fbcon: Replace FBCON_FLAGS_INIT with a boolean Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-08 21:08 ` [PATCH v2 08/19] fb: Delete fb_info->queue Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-10 11:38   ` Thomas Zimmermann
2022-02-10 11:38     ` [Intel-gfx] " Thomas Zimmermann
2022-02-08 21:08 ` [PATCH v2 09/19] fbcon: Extract fbcon_open/release helpers Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-10 11:46   ` Thomas Zimmermann
2022-02-10 11:46     ` [Intel-gfx] " Thomas Zimmermann
2022-02-10 11:46     ` Thomas Zimmermann
2022-04-05  8:45     ` Daniel Vetter
2022-04-05  8:45       ` Daniel Vetter
2022-04-05  8:45       ` [Intel-gfx] " Daniel Vetter
2022-02-08 21:08 ` [PATCH v2 10/19] fbcon: Ditch error handling for con2fb_release_oldinfo Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-10 14:14   ` Thomas Zimmermann
2022-02-10 14:14     ` [Intel-gfx] " Thomas Zimmermann
2022-02-10 14:14     ` Thomas Zimmermann
2022-02-08 21:08 ` [PATCH v2 11/19] fbcon: move more common code into fb_open() Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-10 14:16   ` Thomas Zimmermann
2022-02-10 14:16     ` [Intel-gfx] " Thomas Zimmermann
2022-02-10 14:16     ` Thomas Zimmermann
2022-02-08 21:08 ` [PATCH v2 12/19] fbcon: use lock_fb_info in fbcon_open/release Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-08 21:08 ` [PATCH v2 13/19] fbcon: Consistently protect deferred_takeover with console_lock() Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-08 21:08 ` [PATCH v2 14/19] fbcon: Move console_lock for register/unlink/unregister Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-08 21:08 ` [PATCH v2 15/19] fbcon: Move more code into fbcon_release Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-08 21:08 ` [PATCH v2 16/19] fbcon: untangle fbcon_exit Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-08 21:08 ` [PATCH v2 17/19] fbcon: Maintain a private array of fb_info Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-08 21:08 ` [PATCH v2 18/19] Revert "fbdev: Prevent probing generic drivers if a FB is already registered" Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-09  0:19   ` Javier Martinez Canillas
2022-02-09  0:19     ` [Intel-gfx] " Javier Martinez Canillas
2022-02-09  0:19     ` Javier Martinez Canillas
2022-04-05  8:36     ` Daniel Vetter
2022-04-05  8:36       ` Daniel Vetter
2022-04-05  8:36       ` [Intel-gfx] " Daniel Vetter
2022-04-05  8:40       ` Daniel Vetter
2022-04-05  8:40         ` [Intel-gfx] " Daniel Vetter
2022-04-05  9:19         ` Javier Martinez Canillas
2022-04-05  9:19           ` [Intel-gfx] " Javier Martinez Canillas
2022-04-05  9:24           ` Daniel Vetter
2022-04-05  9:24             ` Daniel Vetter
2022-04-05  9:24             ` [Intel-gfx] " Daniel Vetter
2022-04-05  9:52             ` Javier Martinez Canillas
2022-04-05  9:52               ` Javier Martinez Canillas
2022-04-05  9:52               ` [Intel-gfx] " Javier Martinez Canillas
2022-04-05 10:34               ` Daniel Vetter
2022-04-05 10:34                 ` Daniel Vetter
2022-04-05 10:34                 ` [Intel-gfx] " Daniel Vetter
2022-04-05 13:24                 ` Geert Uytterhoeven
2022-04-05 13:24                   ` Geert Uytterhoeven
2022-04-05 13:24                   ` [Intel-gfx] " Geert Uytterhoeven
2022-04-05 13:33                   ` Greg KH
2022-04-05 13:33                     ` Greg KH
2022-04-05 13:33                     ` [Intel-gfx] " Greg KH
2022-04-05 16:12                     ` Daniel Vetter
2022-04-05 16:12                       ` Daniel Vetter
2022-04-05 16:12                       ` [Intel-gfx] " Daniel Vetter
2022-04-05 16:44                       ` Greg KH
2022-04-05 16:44                         ` [Intel-gfx] " Greg KH
2022-04-05 17:29                         ` Daniel Vetter
2022-04-05 17:29                           ` Daniel Vetter
2022-04-05 17:29                           ` [Intel-gfx] " Daniel Vetter
2022-04-07 17:26                           ` Greg KH
2022-04-07 17:26                             ` Greg KH
2022-04-07 17:26                             ` [Intel-gfx] " Greg KH
2022-04-05 13:25                 ` Javier Martinez Canillas
2022-04-05 13:25                   ` Javier Martinez Canillas
2022-04-05 13:25                   ` Javier Martinez Canillas
2022-02-08 21:08 ` [PATCH v2 19/19] fbdev: Make registered_fb[] private to fbmem.c Daniel Vetter
2022-02-08 21:08   ` [Intel-gfx] " Daniel Vetter
2022-02-08 21:08   ` Daniel Vetter
2022-02-08 23:15 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for fbcon patches, take two Patchwork
2022-02-08 23:18 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2022-02-08 23:50 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1554e197-8894-d342-4d77-39c52bae869e@suse.de \
    --to=tzimmermann@suse.de \
    --cc=cssk@net-c.es \
    --cc=daniel.vetter@ffwll.ch \
    --cc=daniel.vetter@intel.com \
    --cc=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=ducheng2@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=linux-fbdev@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=penguin-kernel@I-love.SAKURA.ne.jp \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.