summaryrefslogtreecommitdiff
path: root/include/linux/kbd_kern.h
diff options
context:
space:
mode:
authorJiri Slaby <jslaby@suse.cz>2020-10-29 14:32:17 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2020-11-04 18:43:38 +0300
commit4e1404a5cd043672e8039fe6f440d0b09c916303 (patch)
tree9472c77b2e5ad3260a17bfc97996280c99d206dd /include/linux/kbd_kern.h
parent07edff9265204e15c9fc8d07cc69e38c4c484e15 (diff)
downloadlinux-4e1404a5cd043672e8039fe6f440d0b09c916303.tar.xz
vt: keyboard, extract and simplify vt_kdskbsent
Setting of function key strings is now very complex. It uses a global buffer 'func_buf' which is prefilled in defkeymap.c_shipped. Then there is also an index table called 'func_table'. So initially, we have something like this: char func_buf[] = "\e[[A\0" // for F1 "\e[[B\0" // for F2 ...; char *func_table[] = { func_buf + 0, // for F1 func_buf + 5, // for F2 ... } When a user changes some specific func string by KDSKBSENT, it is changed in 'func_buf'. If it is shorter or equal to the current one, it is handled by a very quick 'strcpy'. When the user's string is longer, the whole 'func_buf' is reallocated to allow expansion somewhere in the middle. The buffer before the user's string is copied, the user's string appended and the rest appended too. Now, the index table (func_table) needs to be recomputed, of course. One more complication is the held spinlock -- we have to unlock, reallocate, lock again and do the whole thing again to be sure noone raced with us. In this patch, we chose completely orthogonal approach: when the user's string is longer than the current one, we simply assign the 'kstrdup'ed copy to the index table (func_table) and modify func_buf in no way. We only need to make sure we free the old entries. So we need a bitmap is_kmalloc and free the old entries (but not the original func_buf rodata string). Also note that we do not waste so much space as previous approach. We only allocate space for single entries which are longer, while before, the whole buffer was duplicated plus space for the longer string. Signed-off-by: Jiri Slaby <jslaby@suse.cz> Link: https://lore.kernel.org/r/20201029113222.32640-12-jslaby@suse.cz Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include/linux/kbd_kern.h')
0 files changed, 0 insertions, 0 deletions