Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1608612 > unrolled thread
| Started by | Matthew Wilcox <willy@infradead.org> |
|---|---|
| First post | 2017-03-24 17:20 +0100 |
| Last post | 2017-03-26 12:00 +0200 |
| Articles | 2 — 2 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH v3 7/7] vga: Optimise console scrolling Matthew Wilcox <willy@infradead.org> - 2017-03-24 17:20 +0100
Re: [PATCH v3 7/7] vga: Optimise console scrolling kbuild test robot <lkp@intel.com> - 2017-03-26 12:00 +0200
| From | Matthew Wilcox <willy@infradead.org> |
|---|---|
| Date | 2017-03-24 17:20 +0100 |
| Subject | [PATCH v3 7/7] vga: Optimise console scrolling |
| Message-ID | <toA6t-48t-1@gated-at.bofh.it> |
From: Matthew Wilcox <mawilcox@microsoft.com>
Where possible, call memset16(), memmove() or memcpy() instead of using
open-coded loops. If an architecture doesn't define VT_BUF_HAVE_RW,
we can do that from the generic code. For the architectures which do
have special RW routines, usually we can do the special thing (pointer
test or byteswap) once (and then use a mem* call) instead of each time
around a loop. Alpha is the only architecture missing a scr_memmovew()
definition (because it's non-trivial to write).
I don't like the calling convention that uses a byte count instead of
a count of u16s, but it's a little late to change that. Reduces code
size of fbcon.o by almost 400 bytes on my laptop build.
Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
---
arch/mips/include/asm/vga.h | 6 ++++++
arch/powerpc/include/asm/vga.h | 8 ++++++++
arch/sparc/include/asm/vga.h | 24 ++++++++++++++++++++++++
include/linux/vt_buffer.h | 12 ++++++++++++
4 files changed, 50 insertions(+)
diff --git a/arch/mips/include/asm/vga.h b/arch/mips/include/asm/vga.h
index f82c83749a08..7510f406e1e1 100644
--- a/arch/mips/include/asm/vga.h
+++ b/arch/mips/include/asm/vga.h
@@ -40,9 +40,15 @@ static inline u16 scr_readw(volatile const u16 *addr)
return le16_to_cpu(*addr);
}
+static inline void scr_memsetw(u16 *s, u16 v, unsigned int count)
+{
+ memset16(s, cpu_to_le16(v), count / 2);
+}
+
#define scr_memcpyw(d, s, c) memcpy(d, s, c)
#define scr_memmovew(d, s, c) memmove(d, s, c)
#define VT_BUF_HAVE_MEMCPYW
#define VT_BUF_HAVE_MEMMOVEW
+#define VT_BUF_HAVE_MEMSETW
#endif /* _ASM_VGA_H */
diff --git a/arch/powerpc/include/asm/vga.h b/arch/powerpc/include/asm/vga.h
index ab3acd2f2786..7a7b541b7493 100644
--- a/arch/powerpc/include/asm/vga.h
+++ b/arch/powerpc/include/asm/vga.h
@@ -33,8 +33,16 @@ static inline u16 scr_readw(volatile const u16 *addr)
return le16_to_cpu(*addr);
}
+#define VT_BUF_HAVE_MEMSETW
+static inline void scr_memsetw(u16 *s, u16 v, unsigned int n)
+{
+ memset16(s, cpu_to_le16(v), n / 2);
+}
+
#define VT_BUF_HAVE_MEMCPYW
+#define VT_BUF_HAVE_MEMMOVEW
#define scr_memcpyw memcpy
+#define scr_memmovew memmove
#endif /* !CONFIG_VGA_CONSOLE && !CONFIG_MDA_CONSOLE */
diff --git a/arch/sparc/include/asm/vga.h b/arch/sparc/include/asm/vga.h
index ec0e9967d93d..1fab92b110d9 100644
--- a/arch/sparc/include/asm/vga.h
+++ b/arch/sparc/include/asm/vga.h
@@ -11,6 +11,9 @@
#include <asm/types.h>
#define VT_BUF_HAVE_RW
+#define VT_BUF_HAVE_MEMSETW
+#define VT_BUF_HAVE_MEMCPYW
+#define VT_BUF_HAVE_MEMMOVEW
#undef scr_writew
#undef scr_readw
@@ -29,6 +32,27 @@ static inline u16 scr_readw(const u16 *addr)
return *addr;
}
+static inline void scr_memsetw(u16 *p, u16 v, unsigned int n)
+{
+ BUG_ON((long) p >= 0);
+
+ memset16(s, cpu_to_le16(v), n / 2);
+}
+
+static inline void scr_memcpyw(u16 *d, u16 *s, unsigned int n)
+{
+ BUG_ON((long) d >= 0);
+
+ memcpy(d, s, n);
+}
+
+static inline void scr_memmovew(u16 *d, u16 *s, unsigned int n)
+{
+ BUG_ON((long) d >= 0);
+
+ memmove(d, s, n);
+}
+
#define VGA_MAP_MEM(x,s) (x)
#endif
diff --git a/include/linux/vt_buffer.h b/include/linux/vt_buffer.h
index f38c10ba3ff5..31b92fcd8f03 100644
--- a/include/linux/vt_buffer.h
+++ b/include/linux/vt_buffer.h
@@ -26,24 +26,33 @@
#ifndef VT_BUF_HAVE_MEMSETW
static inline void scr_memsetw(u16 *s, u16 c, unsigned int count)
{
+#ifdef VT_BUF_HAVE_RW
count /= 2;
while (count--)
scr_writew(c, s++);
+#else
+ memset16(s, c, count / 2);
+#endif
}
#endif
#ifndef VT_BUF_HAVE_MEMCPYW
static inline void scr_memcpyw(u16 *d, const u16 *s, unsigned int count)
{
+#ifdef VT_BUF_HAVE_RW
count /= 2;
while (count--)
scr_writew(scr_readw(s++), d++);
+#else
+ memcpy(d, s, count);
+#endif
}
#endif
#ifndef VT_BUF_HAVE_MEMMOVEW
static inline void scr_memmovew(u16 *d, const u16 *s, unsigned int count)
{
+#ifdef VT_BUF_HAVE_RW
if (d < s)
scr_memcpyw(d, s, count);
else {
@@ -53,6 +62,9 @@ static inline void scr_memmovew(u16 *d, const u16 *s, unsigned int count)
while (count--)
scr_writew(scr_readw(--s), --d);
}
+#else
+ memmove(d, s, count);
+#endif
}
#endif
--
2.11.0
[toc] | [next] | [standalone]
| From | kbuild test robot <lkp@intel.com> |
|---|---|
| Date | 2017-03-26 12:00 +0200 |
| Message-ID | <tpd7Q-6vi-3@gated-at.bofh.it> |
| In reply to | #1608612 |
[Multipart message — attachments visible in raw view] — view raw
Hi Matthew,
[auto build test ERROR on linus/master]
[also build test ERROR on v4.11-rc3 next-20170324]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Matthew-Wilcox/Add-memsetN-functions/20170326-140108
config: mips-defconfig (attached as .config)
compiler: mips-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=mips
All errors (new ones prefixed by >>):
In file included from include/linux/selection.h:11:0,
from drivers/video/console/newport_con.c:16:
include/linux/vt_buffer.h: In function 'scr_memsetw':
>> include/linux/vt_buffer.h:34:2: error: implicit declaration of function 'memset16' [-Werror=implicit-function-declaration]
memset16(s, c, count / 2);
^~~~~~~~
include/linux/vt_buffer.h: In function 'scr_memcpyw':
>> include/linux/vt_buffer.h:47:2: error: implicit declaration of function 'memcpy' [-Werror=implicit-function-declaration]
memcpy(d, s, count);
^~~~~~
include/linux/vt_buffer.h: In function 'scr_memmovew':
>> include/linux/vt_buffer.h:66:2: error: implicit declaration of function 'memmove' [-Werror=implicit-function-declaration]
memmove(d, s, count);
^~~~~~~
In file included from include/linux/string.h:18:0,
from include/linux/bitmap.h:8,
from include/linux/cpumask.h:11,
from arch/mips/include/asm/processor.h:15,
from arch/mips/include/asm/thread_info.h:15,
from include/linux/thread_info.h:25,
from include/asm-generic/preempt.h:4,
from ./arch/mips/include/generated/asm/preempt.h:1,
from include/linux/preempt.h:80,
from include/linux/spinlock.h:50,
from include/linux/wait.h:8,
from include/linux/fs.h:5,
from include/linux/tty.h:4,
from include/linux/vt_kern.h:11,
from drivers/video/console/newport_con.c:18:
arch/mips/include/asm/string.h: At top level:
>> arch/mips/include/asm/string.h:138:14: error: conflicting types for 'memcpy'
extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
^~~~~~
In file included from include/linux/selection.h:11:0,
from drivers/video/console/newport_con.c:16:
include/linux/vt_buffer.h:47:2: note: previous implicit declaration of 'memcpy' was here
memcpy(d, s, count);
^~~~~~
In file included from include/linux/string.h:18:0,
from include/linux/bitmap.h:8,
from include/linux/cpumask.h:11,
from arch/mips/include/asm/processor.h:15,
from arch/mips/include/asm/thread_info.h:15,
from include/linux/thread_info.h:25,
from include/asm-generic/preempt.h:4,
from ./arch/mips/include/generated/asm/preempt.h:1,
from include/linux/preempt.h:80,
from include/linux/spinlock.h:50,
from include/linux/wait.h:8,
from include/linux/fs.h:5,
from include/linux/tty.h:4,
from include/linux/vt_kern.h:11,
from drivers/video/console/newport_con.c:18:
>> arch/mips/include/asm/string.h:141:14: error: conflicting types for 'memmove'
extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
^~~~~~~
In file included from include/linux/selection.h:11:0,
from drivers/video/console/newport_con.c:16:
include/linux/vt_buffer.h:66:2: note: previous implicit declaration of 'memmove' was here
memmove(d, s, count);
^~~~~~~
In file included from include/linux/bitmap.h:8:0,
from include/linux/cpumask.h:11,
from arch/mips/include/asm/processor.h:15,
from arch/mips/include/asm/thread_info.h:15,
from include/linux/thread_info.h:25,
from include/asm-generic/preempt.h:4,
from ./arch/mips/include/generated/asm/preempt.h:1,
from include/linux/preempt.h:80,
from include/linux/spinlock.h:50,
from include/linux/wait.h:8,
from include/linux/fs.h:5,
from include/linux/tty.h:4,
from include/linux/vt_kern.h:11,
from drivers/video/console/newport_con.c:18:
include/linux/string.h:104:14: error: conflicting types for 'memset16'
extern void *memset16(uint16_t *, uint16_t, __kernel_size_t);
^~~~~~~~
In file included from include/linux/selection.h:11:0,
from drivers/video/console/newport_con.c:16:
include/linux/vt_buffer.h:34:2: note: previous implicit declaration of 'memset16' was here
memset16(s, c, count / 2);
^~~~~~~~
cc1: some warnings being treated as errors
vim +/memset16 +34 include/linux/vt_buffer.h
28 {
29 #ifdef VT_BUF_HAVE_RW
30 count /= 2;
31 while (count--)
32 scr_writew(c, s++);
33 #else
> 34 memset16(s, c, count / 2);
35 #endif
36 }
37 #endif
38
39 #ifndef VT_BUF_HAVE_MEMCPYW
40 static inline void scr_memcpyw(u16 *d, const u16 *s, unsigned int count)
41 {
42 #ifdef VT_BUF_HAVE_RW
43 count /= 2;
44 while (count--)
45 scr_writew(scr_readw(s++), d++);
46 #else
> 47 memcpy(d, s, count);
48 #endif
49 }
50 #endif
51
52 #ifndef VT_BUF_HAVE_MEMMOVEW
53 static inline void scr_memmovew(u16 *d, const u16 *s, unsigned int count)
54 {
55 #ifdef VT_BUF_HAVE_RW
56 if (d < s)
57 scr_memcpyw(d, s, count);
58 else {
59 count /= 2;
60 d += count;
61 s += count;
62 while (count--)
63 scr_writew(scr_readw(--s), --d);
64 }
65 #else
> 66 memmove(d, s, count);
67 #endif
68 }
69 #endif
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web