@@ -292,23 +292,27 @@ static int vgacon_scrolldelta(struct vc_data *c, int lines)d=(void*)c->vc_origin;s=(void*)c->vc_screenbuf;-while(count--){-scr_memcpyw(d,vgacon_scrollback+soff,c->vc_size_row);-d+=c->vc_size_row;-soff+=c->vc_size_row;--if(soff>=vgacon_scrollback_size)-soff=0;+if(count){+intcopysize;+count*=c->vc_size_row;+/* how much memory to end of buffer left? */+copysize=min(count,vgacon_scrollback_size-soff);+scr_memcpyw(d,vgacon_scrollback+soff,copysize);+d+=copysize;+count-=copysize;++if(count){+copysize=min(count,vgacon_scrollback_size);+scr_memcpyw(d,vgacon_scrollback,copysize);+d+=copysize;+}}if(diff==c->vc_rows){vgacon_cursor(c,CM_MOVE);}else{-while(diff--){-scr_memcpyw(d,s,c->vc_size_row);-d+=c->vc_size_row;-s+=c->vc_size_row;-}+if(diff)+scr_memcpyw(d,s,diff*c->vc_size_row);}return1;
From: Marcin Slusarz <hidden> Date: 2008-09-21 16:01:33
There's no point in checking diff == c->vc_rows, because it can be true
only when count == 0, but we already checked that.
Additionally move variables used only in one block to this block.
Signed-off-by: Marcin Slusarz <redacted>
Cc: Antonino Daplas <adaplas@gmail.com>
Cc: linux-fbdev-devel@lists.sourceforge.net
---
drivers/video/console/vgacon.c | 22 +++++++++-------------
1 files changed, 9 insertions(+), 13 deletions(-)
@@ -287,13 +286,13 @@ static int vgacon_scrolldelta(struct vc_data *c, int lines)if(count>c->vc_rows)count=c->vc_rows;-diff=c->vc_rows-count;--d=(void*)c->vc_origin;-s=(void*)c->vc_screenbuf;-if(count){intcopysize;++intdiff=c->vc_rows-count;+void*d=(void*)c->vc_origin;+void*s=(void*)c->vc_screenbuf;+count*=c->vc_size_row;/* how much memory to end of buffer left? */copysize=min(count,vgacon_scrollback_size-soff);
@@ -306,14 +305,11 @@ static int vgacon_scrolldelta(struct vc_data *c, int lines)scr_memcpyw(d,vgacon_scrollback,copysize);d+=copysize;}-}--if(diff==c->vc_rows){-vgacon_cursor(c,CM_MOVE);-}else{+if(diff)scr_memcpyw(d,s,diff*c->vc_size_row);-}+}else+vgacon_cursor(c,CM_MOVE);return1;}
From: Krzysztof Helt <hidden> Date: 2008-09-21 18:37:23
On Sun, 21 Sep 2008 18:00:08 +0200
Marcin Slusarz [off-list ref] wrote:
Join multiple scr_memcpyw into 1-3 calls (usually 2).
(benchmarked average speedup: 1%)
The scr_memcpyw is an inline function so there is no real call here.
However, have you tested the patch with scroll range > 2 * vgacon_scrollback_size?
It seems that your patch only handles scrolling if it is not bigger than 2 * vgacon_scrollback_size.
Regards,
Krzysztof
@@ -292,23 +292,27 @@ static int vgacon_scrolldelta(struct vc_data *c, int lines)d=(void*)c->vc_origin;s=(void*)c->vc_screenbuf;-while(count--){-scr_memcpyw(d,vgacon_scrollback+soff,c->vc_size_row);-d+=c->vc_size_row;-soff+=c->vc_size_row;--if(soff>=vgacon_scrollback_size)-soff=0;+if(count){+intcopysize;+count*=c->vc_size_row;+/* how much memory to end of buffer left? */+copysize=min(count,vgacon_scrollback_size-soff);+scr_memcpyw(d,vgacon_scrollback+soff,copysize);+d+=copysize;+count-=copysize;++if(count){+copysize=min(count,vgacon_scrollback_size);+scr_memcpyw(d,vgacon_scrollback,copysize);+d+=copysize;+}}if(diff==c->vc_rows){vgacon_cursor(c,CM_MOVE);}else{-while(diff--){-scr_memcpyw(d,s,c->vc_size_row);-d+=c->vc_size_row;-s+=c->vc_size_row;-}+if(diff)+scr_memcpyw(d,s,diff*c->vc_size_row);}return1;
--
1.5.6.4
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Linux-fbdev-devel mailing list
Linux-fbdev-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-fbdev-devel
From: Marcin Slusarz <hidden> Date: 2008-09-21 21:23:16
On Sun, Sep 21, 2008 at 08:37:57PM +0200, Krzysztof Helt wrote:
On Sun, 21 Sep 2008 18:00:08 +0200
Marcin Slusarz [off-list ref] wrote:
quoted
Join multiple scr_memcpyw into 1-3 calls (usually 2).
(benchmarked average speedup: 1%)
The scr_memcpyw is an inline function so there is no real call here.
... or it's defined to memcpy
However, have you tested the patch with scroll range > 2 * vgacon_scrollback_size?
It seems that your patch only handles scrolling if it is not bigger than 2 * vgacon_scrollback_size.
No. count is always within range <0, c->vc_rows> (look how it's computed
just before this loop). Second copy is needed only when end of screen
crosses end/beginning of scrollback (it's a circular buffer).
@@ -292,23 +292,27 @@ static int vgacon_scrolldelta(struct vc_data *c, int lines)d=(void*)c->vc_origin;s=(void*)c->vc_screenbuf;-while(count--){-scr_memcpyw(d,vgacon_scrollback+soff,c->vc_size_row);-d+=c->vc_size_row;-soff+=c->vc_size_row;--if(soff>=vgacon_scrollback_size)-soff=0;+if(count){+intcopysize;+count*=c->vc_size_row;+/* how much memory to end of buffer left? */+copysize=min(count,vgacon_scrollback_size-soff);+scr_memcpyw(d,vgacon_scrollback+soff,copysize);+d+=copysize;+count-=copysize;++if(count){+copysize=min(count,vgacon_scrollback_size);+scr_memcpyw(d,vgacon_scrollback,copysize);+d+=copysize;+}}if(diff==c->vc_rows){vgacon_cursor(c,CM_MOVE);}else{-while(diff--){-scr_memcpyw(d,s,c->vc_size_row);-d+=c->vc_size_row;-s+=c->vc_size_row;-}+if(diff)+scr_memcpyw(d,s,diff*c->vc_size_row);}return1;