vt: drop bootmem/slab memory distinction
Bootmem is not used for the vt screen buffer anymore as slab is now
available at the time the console is initialized.
Get rid of the now superfluous distinction between slab and bootmem,
it's always slab.
This also fixes a kmalloc leak which Catalin described thusly:
Commit a5f4f52e
("vt: use kzalloc() instead of the bootmem allocator")
replaced the alloc_bootmem() with kzalloc() but didn't set vc_kmalloced to
1 and the memory block is later leaked. The corresponding kmemleak trace:
unreferenced object 0xdf828000 (size 8192):
comm "swapper", pid 0, jiffies 4294937296
backtrace:
[<c006d473>] __save_stack_trace+0x17/0x1c
[<c000d869>] log_early+0x55/0x84
[<c01cfa4b>] kmemleak_alloc+0x33/0x3c
[<c006c013>] __kmalloc+0xd7/0xe4
[<c00108c7>] con_init+0xbf/0x1b8
[<c0010149>] console_init+0x11/0x20
[<c0008797>] start_kernel+0x137/0x1e4
Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Reviewed-by: Pekka Enberg <penberg@cs.helsinki.fi>
Tested-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
ff5392d77b
commit
5c9228f0cf
|
@ -770,14 +770,12 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */
|
||||||
visual_init(vc, currcons, 1);
|
visual_init(vc, currcons, 1);
|
||||||
if (!*vc->vc_uni_pagedir_loc)
|
if (!*vc->vc_uni_pagedir_loc)
|
||||||
con_set_default_unimap(vc);
|
con_set_default_unimap(vc);
|
||||||
if (!vc->vc_kmalloced)
|
vc->vc_screenbuf = kmalloc(vc->vc_screenbuf_size, GFP_KERNEL);
|
||||||
vc->vc_screenbuf = kmalloc(vc->vc_screenbuf_size, GFP_KERNEL);
|
|
||||||
if (!vc->vc_screenbuf) {
|
if (!vc->vc_screenbuf) {
|
||||||
kfree(vc);
|
kfree(vc);
|
||||||
vc_cons[currcons].d = NULL;
|
vc_cons[currcons].d = NULL;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
vc->vc_kmalloced = 1;
|
|
||||||
vc_init(vc, vc->vc_rows, vc->vc_cols, 1);
|
vc_init(vc, vc->vc_rows, vc->vc_cols, 1);
|
||||||
vcs_make_sysfs(currcons);
|
vcs_make_sysfs(currcons);
|
||||||
atomic_notifier_call_chain(&vt_notifier_list, VT_ALLOCATE, ¶m);
|
atomic_notifier_call_chain(&vt_notifier_list, VT_ALLOCATE, ¶m);
|
||||||
|
@ -913,10 +911,8 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
|
||||||
if (new_scr_end > new_origin)
|
if (new_scr_end > new_origin)
|
||||||
scr_memsetw((void *)new_origin, vc->vc_video_erase_char,
|
scr_memsetw((void *)new_origin, vc->vc_video_erase_char,
|
||||||
new_scr_end - new_origin);
|
new_scr_end - new_origin);
|
||||||
if (vc->vc_kmalloced)
|
kfree(vc->vc_screenbuf);
|
||||||
kfree(vc->vc_screenbuf);
|
|
||||||
vc->vc_screenbuf = newscreen;
|
vc->vc_screenbuf = newscreen;
|
||||||
vc->vc_kmalloced = 1;
|
|
||||||
vc->vc_screenbuf_size = new_screen_size;
|
vc->vc_screenbuf_size = new_screen_size;
|
||||||
set_origin(vc);
|
set_origin(vc);
|
||||||
|
|
||||||
|
@ -995,8 +991,7 @@ void vc_deallocate(unsigned int currcons)
|
||||||
vc->vc_sw->con_deinit(vc);
|
vc->vc_sw->con_deinit(vc);
|
||||||
put_pid(vc->vt_pid);
|
put_pid(vc->vt_pid);
|
||||||
module_put(vc->vc_sw->owner);
|
module_put(vc->vc_sw->owner);
|
||||||
if (vc->vc_kmalloced)
|
kfree(vc->vc_screenbuf);
|
||||||
kfree(vc->vc_screenbuf);
|
|
||||||
if (currcons >= MIN_NR_CONSOLES)
|
if (currcons >= MIN_NR_CONSOLES)
|
||||||
kfree(vc);
|
kfree(vc);
|
||||||
vc_cons[currcons].d = NULL;
|
vc_cons[currcons].d = NULL;
|
||||||
|
@ -2881,7 +2876,6 @@ static int __init con_init(void)
|
||||||
INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK);
|
INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK);
|
||||||
visual_init(vc, currcons, 1);
|
visual_init(vc, currcons, 1);
|
||||||
vc->vc_screenbuf = kzalloc(vc->vc_screenbuf_size, GFP_NOWAIT);
|
vc->vc_screenbuf = kzalloc(vc->vc_screenbuf_size, GFP_NOWAIT);
|
||||||
vc->vc_kmalloced = 0;
|
|
||||||
vc_init(vc, vc->vc_rows, vc->vc_cols,
|
vc_init(vc, vc->vc_rows, vc->vc_cols,
|
||||||
currcons || !vc->vc_sw->con_save_screen);
|
currcons || !vc->vc_sw->con_save_screen);
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,7 +89,6 @@ struct vc_data {
|
||||||
unsigned int vc_need_wrap : 1;
|
unsigned int vc_need_wrap : 1;
|
||||||
unsigned int vc_can_do_color : 1;
|
unsigned int vc_can_do_color : 1;
|
||||||
unsigned int vc_report_mouse : 2;
|
unsigned int vc_report_mouse : 2;
|
||||||
unsigned int vc_kmalloced : 1;
|
|
||||||
unsigned char vc_utf : 1; /* Unicode UTF-8 encoding */
|
unsigned char vc_utf : 1; /* Unicode UTF-8 encoding */
|
||||||
unsigned char vc_utf_count;
|
unsigned char vc_utf_count;
|
||||||
int vc_utf_char;
|
int vc_utf_char;
|
||||||
|
|
Loading…
Reference in New Issue