[PATCH] fbcon: introduce for_each_registered_fb() helper

Yisheng Xie ysxie at foxmail.com
Sat Jun 30 06:51:55 UTC 2018


Hi Hans,

On 06/29/2018 02:50 AM, Hans de Goede wrote:
> Hi,
>
> Looks good, but you should probably do a new version based on:
>
> https://github.com/bzolnier/linux/tree/fbdev-for-next
>
> This has one more loop to replace, in the fbcon_output_notifier()
> function which was introduced by:
> https://github.com/bzolnier/linux/commit/83d83bebf40132e2d55ec58af666713cc76f9764

OK, I will rebase it to fbdev-for-next in coming version.

Thanks
Yisheng
>
> Regards,
>
> Hans
>
>
>
> On 28-06-18 18:20, Yisheng Xie wrote:
>> Following pattern is often used:
>>
>>   for (i = 0; i < FB_MAX; i++) {
>>          if (registered_fb[i]) {
>>                  ...
>>          }
>>   }
>>
>> Therefore, as Andy's suggestion, for_each_registered_fb() helper can
>> be introduced to make the code easier to read and write by reducing
>> indentation level. It also saves few lines of code in each occurrence.
>>
>> This patch convert all part here at the same time.
>>
>> Signed-off-by: Yisheng Xie <ysxie at foxmail.com>
>> ---
>>   drivers/video/fbdev/core/fbcon.c | 25 +++++++++----------------
>>   drivers/video/fbdev/core/fbmem.c |  4 +---
>>   include/linux/fb.h               |  4 ++++
>>   3 files changed, 14 insertions(+), 19 deletions(-)
>>
>> diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
>> index c910e74..610853d 100644
>> --- a/drivers/video/fbdev/core/fbcon.c
>> +++ b/drivers/video/fbdev/core/fbcon.c
>> @@ -2220,8 +2220,8 @@ static int fbcon_switch(struct vc_data *vc)
>>        *
>>        * info->currcon = vc->vc_num;
>>        */
>> -    for (i = 0; i < FB_MAX; i++) {
>> -        if (registered_fb[i] != NULL && registered_fb[i]->fbcon_par) {
>> +    for_each_registered_fb(i) {
>> +        if (registered_fb[i]->fbcon_par) {
>>               struct fbcon_ops *o = registered_fb[i]->fbcon_par;
>>                 o->currcon = vc->vc_num;
>> @@ -3103,11 +3103,9 @@ static int fbcon_fb_unregistered(struct fb_info *info)
>>       if (idx == info_idx) {
>>           info_idx = -1;
>>   -        for (i = 0; i < FB_MAX; i++) {
>> -            if (registered_fb[i] != NULL) {
>> -                info_idx = i;
>> -                break;
>> -            }
>> +        for_each_registered_fb(i) {
>> +            info_idx = i;
>> +            break;
>>           }
>>       }
>>   @@ -3562,11 +3560,9 @@ static void fbcon_start(void)
>>             console_lock();
>>   -        for (i = 0; i < FB_MAX; i++) {
>> -            if (registered_fb[i] != NULL) {
>> -                info_idx = i;
>> -                break;
>> -            }
>> +        for_each_registered_fb(i) {
>> +            info_idx = i;
>> +            break;
>>           }
>>             do_fbcon_takeover(0);
>> @@ -3586,15 +3582,12 @@ static void fbcon_exit(void)
>>       kfree((void *)softback_buf);
>>       softback_buf = 0UL;
>>   -    for (i = 0; i < FB_MAX; i++) {
>> +    for_each_registered_fb(i) {
>>           int pending = 0;
>>             mapped = 0;
>>           info = registered_fb[i];
>>   -        if (info == NULL)
>> -            continue;
>> -
>>           if (info->queue.func)
>>               pending = cancel_work_sync(&info->queue);
>>           DPRINTK("fbcon: %s pending work\n", (pending ? "canceled" :
>> diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
>> index 609438d..645c6ac 100644
>> --- a/drivers/video/fbdev/core/fbmem.c
>> +++ b/drivers/video/fbdev/core/fbmem.c
>> @@ -1593,10 +1593,8 @@ static int do_remove_conflicting_framebuffers(struct apertures_struct *a,
>>       int i, ret;
>>         /* check all firmware fbs and kick off if the base addr overlaps */
>> -    for (i = 0 ; i < FB_MAX; i++) {
>> +    for_each_registered_fb(i) {
>>           struct apertures_struct *gen_aper;
>> -        if (!registered_fb[i])
>> -            continue;
>>             if (!(registered_fb[i]->flags & FBINFO_MISC_FIRMWARE))
>>               continue;
>> diff --git a/include/linux/fb.h b/include/linux/fb.h
>> index aa74a22..3e13b95 100644
>> --- a/include/linux/fb.h
>> +++ b/include/linux/fb.h
>> @@ -650,6 +650,10 @@ extern int fb_get_color_depth(struct fb_var_screeninfo *var,
>>   extern int num_registered_fb;
>>   extern struct class *fb_class;
>>   +#define for_each_registered_fb(i)        \
>> +    for (i = 0; i < FB_MAX; i++)        \
>> +        if (registered_fb[i])
>> +
>>   extern int lock_fb_info(struct fb_info *info);
>>     static inline void unlock_fb_info(struct fb_info *info)
>>
>
>





More information about the dri-devel mailing list